--- (IN PROGRESS)
+Major restructure of YAZ source. All source in libyaz is in src directory.
+Programs in client (yaz-client), ztest (yaz-ztest), zoom (zoom programs),
+util (utility programs such as ASN.1 compiler, yaz-marcdump).
+
+Added man page for utility yaz-marcdump (used to be called marcdump).
+yaz-marcdump is installed by 'make install'.
+
+Fixed a memory leak in Generic Frontend Server that occurred when decoding
+of incoming package failed.
+
+Fixed a potential DOS attack vulnerability in COMSTACK/ODR.
+
Change prototype of odr_perror: add const to message string.
New function yaz_log_reopen which reopens log file (for log rotate, etc.)
Fix bad reference in UNIX comstack in function cs_addrstr.
-Fix for AIX compile.
+Fix for compilation on AIX.
The generic front-end server (server/seshigh.c) now supports returning
Init diagnostics to the client in User-information-field, in
## Copyright (C) 1994-2003, Index Data
## All rights reserved.
-## $Id: Makefile.am,v 1.22 2003-05-06 12:07:33 adam Exp $
+## $Id: Makefile.am,v 1.23 2003-10-27 12:21:21 adam Exp $
AUTOMAKE_OPTIONS = foreign
-SUBDIRS = util odr comstack z39.50 ill zutil ccl cql server include lib client ztest zoom doc etc
+SUBDIRS = src include test util client ztest zoom doc etc
aclocaldir=$(datadir)/aclocal
-YAZ toolkit - $Id: README,v 1.43 2003-02-20 21:23:47 adam Exp $
+YAZ toolkit - $Id: README,v 1.44 2003-10-27 12:21:21 adam Exp $
Copyright (C) 1995-2003, Index Data ApS.
See the file LICENSE for details.
doc Documentation.
-util Various little utility functions. Logging, memory debugging,
- primitive ISO 2709 presentation for the yaz-client, etc. You'll
- find the ASN.1 Compiler for YAZ here as well (yaz-comp).
+src Source for the YAZ library.
-odr Open Data Representation. This module implements the BER
- encoding rules.
-
-z39.50 codecs for the Z39.50 protocol. This module does the same job
- as the old 'asn' module except that the source files are
- auto-generated using an YAZ' ASN.1 Compiler (yaz-comp).
-
-zutil This module implements a collection of Z39.50 and SRW utilities,
- such as query parsing, etc.
-
-ill Codecs for the ISO ILL protocol.
-
-comstack This module implements the transport transparency
- stack (COMSTACK). The comstack implements a generic interface
- for exchanging BER-encoded records over a network. It supports
- the 'American' mode of exchanging the records straight over
- TCP/IP, and uses Peter Furniss' XTIMOSI package over RFC1006.
- Look for documentation in the file comstack.man.
-
-zoom An implementation of Mike Taylors Z39.50 Object Oriented
- Model : ZOOM. If you'd like to build Z39.50 client applications
- in C this may be good start. You'll find example programs in
- this directory too.
-
-server This is the implementation of the Z39.50 server frontend. It
- provides event-handling and server managament functions,
- and calls the backend primitives (best documentation of these
- is in the file include/yaz/backend.h).
-
-ccl CCL parser.
-
-cql CQL parser.
+util Utility programs, ASN.1 compiler, MARC dump utility, and others.
client A demonstration client for testing the protocol. It's bug'n
ugly. But, it supports many features.
ztest A demonstration server that implements a backend.
-include/yaz The various header files.
+etc Various configuration files.
-lib The libraries. Primarily libyaz.la. The makefile gathers the
- libraries from previous modules into libyaz.la.
+include/yaz The various header files.
To get more information or assistance, send mail to yaz-help@indexdata.dk.
Even better, sign on to the YAZ mailing list here:
+++ /dev/null
-## $Id: Makefile.am,v 1.7 2002-09-11 21:25:57 adam Exp $
-
-noinst_LTLIBRARIES=libasn.la
-
-libasn_la_SOURCES = proto.c prt-rsc.c prt-acc.c prt-exp.c prt-grs.c prt-exd.c \
- prt-dia.c prt-esp.c prt-arc.c prt-add.c prt-dat.c prt-univ.c
-
-pkginclude_HEADERS = \
- prt-acc.h prt-add.h prt-arc.h prt-dat.h prt-dia.h prt-esp.h prt-exd.h \
- prt-exp.h prt-ext.h prt-grs.h prt-proto.h prt-rsc.h prt-univ.h
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: proto.c,v $
- * Revision 1.61 1999-11-30 13:47:10 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.60 1999/06/11 16:45:59 adam
- * Fixed minor bug in ScanRequest encoder.
- *
- * Revision 1.59 1999/04/21 11:46:00 adam
- * Fixed bug in {en,de}coder for OtherInformation.
- *
- * Revision 1.58 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.57 1998/10/20 13:55:37 quinn
- * Fixed Scan bug in asn and client
- *
- * Revision 1.56 1998/08/19 16:10:04 adam
- * Changed som member names of DeleteResultSetRequest/Response.
- *
- * Revision 1.55 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.54 1996/11/11 13:14:46 adam
- * Fixed tagging bug in z_ProximityOperator.
- *
- * Revision 1.53 1996/10/09 15:54:55 quinn
- * Added SearchInfoReport
- *
- * Revision 1.52 1996/10/08 12:56:57 adam
- * Bug fix: tagging of type 101 query.
- *
- * Revision 1.51 1996/07/26 14:07:21 quinn
- * Small
- *
- * Revision 1.50 1996/07/26 13:36:15 quinn
- * Various smallish
- *
- * Revision 1.49 1996/07/06 19:58:28 quinn
- * System headerfiles gathered in yconfig
- *
- * Revision 1.48 1996/06/10 08:53:33 quinn
- * Added Summary,OPAC,ResourceReport
- *
- * Revision 1.47 1996/05/29 15:47:50 quinn
- * Fixed in bug DiagRecs decoder. Thanks to Linda Harris.
- *
- * Revision 1.46 1996/04/10 11:39:42 quinn
- * Fixed bug in UserInfo
- *
- * Revision 1.45 1996/02/23 10:00:25 quinn
- * Fixes to SCAN
- *
- * Revision 1.44 1996/02/20 12:51:41 quinn
- * Completed SCAN. Fixed problems with EXTERNAL.
- *
- * Revision 1.43 1996/02/10 12:22:49 quinn
- * Work on SCAN
- *
- * Revision 1.42 1996/01/22 09:46:31 quinn
- * Added Sort PDU. Moved StringList to main protocol file.
- *
- * Revision 1.41 1996/01/10 15:21:24 quinn
- * Added links to access control PDUs
- *
- * Revision 1.40 1996/01/02 11:46:40 quinn
- * Changed 'operator' to 'roperator' to avoid C++ conflict.
- *
- * Revision 1.39 1995/09/29 17:11:53 quinn
- * Smallish
- *
- * Revision 1.38 1995/09/27 15:02:40 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.37 1995/08/21 09:10:15 quinn
- * Smallish fixes to suppport new formats.
- *
- * Revision 1.36 1995/08/15 11:59:39 quinn
- * Updated External
- *
- * Revision 1.35 1995/08/10 08:53:59 quinn
- * Added Explain
- *
- * Revision 1.34 1995/06/19 17:01:48 quinn
- * This should bring us in sync with the version distributed as 1.0b
- *
- * Revision 1.33 1995/06/19 13:39:56 quinn
- * *** empty log message ***
- *
- * Revision 1.32 1995/06/19 12:37:28 quinn
- * Fixed a bug in the compspec.
- *
- * Revision 1.31 1995/06/16 13:15:56 quinn
- * Fixed Defaultdiagformat.
- *
- * Revision 1.30 1995/06/15 15:42:01 quinn
- * Fixed some v3 bugs
- *
- * Revision 1.29 1995/06/15 07:44:49 quinn
- * Moving to v3.
- *
- * Revision 1.28 1995/06/14 15:26:35 quinn
- * *** empty log message ***
- *
- * Revision 1.27 1995/06/07 14:36:22 quinn
- * Added CLOSE
- *
- * Revision 1.26 1995/06/02 09:49:13 quinn
- * Adding access control
- *
- * Revision 1.25 1995/05/25 11:00:08 quinn
- * *** empty log message ***
- *
- * Revision 1.24 1995/05/22 13:58:18 quinn
- * Fixed an ODR_NULLVAL.
- *
- * Revision 1.23 1995/05/22 11:30:18 quinn
- * Adding Z39.50-1992 stuff to proto.c. Adding zget.c
- *
- * Revision 1.22 1995/05/17 08:40:56 quinn
- * Added delete. Fixed some sequence_begins. Smallish.
- *
- * Revision 1.21 1995/05/16 08:50:24 quinn
- * License, documentation, and memory fixes
- *
- * Revision 1.20 1995/05/15 11:55:25 quinn
- * Smallish.
- *
- * Revision 1.19 1995/04/11 11:58:35 quinn
- * Fixed bug.
- *
- * Revision 1.18 1995/04/11 11:52:02 quinn
- * Fixed possible buf in proto.c
- *
- * Revision 1.17 1995/04/10 10:22:22 quinn
- * Added SCAN.
- *
- * Revision 1.16 1995/03/30 10:26:43 quinn
- * Added Term structure
- *
- * Revision 1.15 1995/03/30 09:08:39 quinn
- * Added Resource control protocol
- *
- * Revision 1.14 1995/03/29 08:06:13 quinn
- * Added a few v3 elements
- *
- * Revision 1.13 1995/03/20 11:26:52 quinn
- * *** empty log message ***
- *
- * Revision 1.12 1995/03/20 09:45:09 quinn
- * Working towards v3
- *
- * Revision 1.11 1995/03/17 10:17:25 quinn
- * Added memory management.
- *
- * Revision 1.10 1995/03/15 11:17:40 quinn
- * Fixed some return-checks from choice.. need better ay to handle those..
- *
- * Revision 1.9 1995/03/15 08:37:06 quinn
- * Fixed protocol bugs.
- *
- * Revision 1.8 1995/03/14 16:59:24 quinn
- * Fixed OPTIONAL flag in attributeelement
- *
- * Revision 1.7 1995/03/07 16:29:33 quinn
- * Added authentication stuff.
- *
- * Revision 1.6 1995/03/01 14:46:03 quinn
- * Fixed protocol bug in 8777query.
- *
- * Revision 1.5 1995/02/14 11:54:22 quinn
- * Fixing include.
- *
- * Revision 1.4 1995/02/10 15:54:30 quinn
- * Small adjustments.
- *
- * Revision 1.3 1995/02/09 15:51:39 quinn
- * Works better now.
- *
- * Revision 1.2 1995/02/06 21:26:07 quinn
- * Repaired this evening's damages..
- *
- * Revision 1.1 1995/02/06 16:44:47 quinn
- * First hack at Z/SR protocol
- *
- */
-
-#include <yaz/odr.h>
-
-#include <yaz/proto.h>
-
-/* ---------------------- GLOBAL DEFS ------------------- */
-
-/*
- * We'll use a general octetstring here, since string operations are
- * clumsy on long strings.
- */
-int z_SUTRS(ODR o, Odr_oct **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_octetstring, p, ODR_UNIVERSAL,
- ODR_GENERALSTRING, opt);
-}
-
-int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2,
- opt);
-}
-
-int z_DatabaseName(ODR o, Z_DatabaseName **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 105,
- opt);
-}
-
-int z_ResultSetId(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 31,
- opt);
-}
-
-int z_ElementSetName(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_visiblestring, p, ODR_CONTEXT, 103, opt);
-}
-
-int z_UserInformationField(ODR o, Z_External **p, int opt, const char *name)
-{
- return odr_explicit(o, z_External, (Z_External **)p, ODR_CONTEXT,
- 11, opt);
-}
-
-int z_InternationalString(ODR o, char **p, int opt, const char *name)
-{
- return odr_generalstring(o, p, opt, 0);
-}
-
-int z_InfoCategory(ODR o, Z_InfoCategory **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->categoryTypeId, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->categoryValue, ODR_CONTEXT, 2,
- 0) &&
- odr_sequence_end(o);
-}
-
-int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_OtherInfo_characterInfo,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_OtherInfo_binaryInfo,
- (Odr_fun)odr_octetstring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_OtherInfo_externallyDefinedInfo,
- (Odr_fun)z_External, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_OtherInfo_oid,
- (Odr_fun)odr_oid, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), name))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InfoCategory, &(*p)->category, ODR_CONTEXT, 1, 1) &&
- odr_choice(o, arm, &(*p)->information, &(*p)->which, name) &&
- odr_sequence_end(o);
-}
-
-int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt,
- const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- odr_implicit_settag(o, ODR_CONTEXT, 201);
- if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
- &(*p)->num_elements, name))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_StringOrNumeric_string,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_StringOrNumeric_numeric,
- (Odr_fun)odr_integer, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_StringOrNumeric *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-/*
- * check tagging!!
- */
-int z_Unit(ODR o, Z_Unit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_InternationalString, &(*p)->unitSystem, ODR_CONTEXT,
- 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->unitType, ODR_CONTEXT,
- 2, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->unit, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_integer, &(*p)->scaleFactor, ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IntUnit(ODR o, Z_IntUnit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_Unit, &(*p)->unitUsed, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_StringList(ODR o, Z_StringList **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_StringList *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_InternationalString, &(*p)->strings,
- &(*p)->num_strings, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-/* ---------------------- INITIALIZE SERVICE ------------------- */
-
-#if 1
-int z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_visiblestring(o, &(*p)->user, 0, 0) &&
- odr_visiblestring(o, &(*p)->password, 0, 0) &&
- odr_visiblestring(o, &(*p)->account, 0, 0) &&
- odr_sequence_end(o);
-}
-#endif
-
-int z_IdPass(ODR o, Z_IdPass **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_visiblestring, &(*p)->groupId, ODR_CONTEXT, 0,
- 1) &&
- odr_implicit(o, odr_visiblestring, &(*p)->userId, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_visiblestring, &(*p)->password, ODR_CONTEXT, 2,
- 1) &&
- odr_sequence_end(o);
-}
-
-int z_StrAuthentication(ODR o, char **p, int opt, const char *name)
-{
- return odr_visiblestring(o, p, opt, 0);
-}
-
-int z_IdAuthentication(ODR o, Z_IdAuthentication **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {-1, -1, -1, Z_IdAuthentication_open, z_StrAuthentication, 0},
- {-1, -1, -1, Z_IdAuthentication_idPass, (Odr_fun)z_IdPass, 0},
- {-1, -1, -1, Z_IdAuthentication_anonymous, (Odr_fun)odr_null, 0},
- {-1, -1, -1, Z_IdAuthentication_other, (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_IdAuthentication *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_InitRequest(ODR o, Z_InitRequest **p, int opt, const char *name)
-{
- Z_InitRequest *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- odr_implicit(o, odr_bitstring, &pp->protocolVersion,
- ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
- 5, 0) &&
- odr_implicit(o, odr_integer, &pp->maximumRecordSize,
- ODR_CONTEXT, 6, 0) &&
- odr_explicit(o, z_IdAuthentication, &pp->idAuthentication,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationId,
- ODR_CONTEXT, 110, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationName,
- ODR_CONTEXT, 111, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
- ODR_CONTEXT, 112, 1) &&
- z_UserInformationField(o, &pp->userInformationField, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_InitResponse(ODR o, Z_InitResponse **p, int opt, const char *name)
-{
- Z_InitResponse *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- odr_implicit(o, odr_bitstring, &pp->protocolVersion,
- ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, odr_integer, &pp->preferredMessageSize,
- ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, odr_integer, &pp->maximumRecordSize,
- ODR_CONTEXT, 6, 0) &&
- odr_implicit(o, odr_bool, &pp->result, ODR_CONTEXT, 12, 0) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationId,
- ODR_CONTEXT, 110, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationName,
- ODR_CONTEXT, 111, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
- ODR_CONTEXT, 112, 1) &&
- z_UserInformationField(o, &pp->userInformationField, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------ RESOURCE CONTROL ----------------*/
-
-int z_TriggerResourceControlRequest(ODR o, Z_TriggerResourceControlRequest **p,
- int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->requestedAction, ODR_CONTEXT,
- 46, 0) &&
- odr_implicit(o, odr_oid, &(*p)->prefResourceReportFormat,
- ODR_CONTEXT, 47, 1) &&
- odr_implicit(o, odr_bool, &(*p)->resultSetWanted, ODR_CONTEXT,
- 48, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ResourceControlRequest(ODR o, Z_ResourceControlRequest **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_bool, &(*p)->suspendedFlag, ODR_CONTEXT, 39, 1)&&
- odr_explicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
- 40, 1) &&
- odr_implicit(o, odr_integer, &(*p)->partialResultsAvailable,
- ODR_CONTEXT, 41, 1) &&
- odr_implicit(o, odr_bool, &(*p)->responseRequired, ODR_CONTEXT,
- 42, 0) &&
- odr_implicit(o, odr_bool, &(*p)->triggeredRequestFlag,
- ODR_CONTEXT, 43, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ResourceControlResponse(ODR o, Z_ResourceControlResponse **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_bool, &(*p)->continueFlag, ODR_CONTEXT, 44, 0) &&
- odr_implicit(o, odr_bool, &(*p)->resultSetWanted, ODR_CONTEXT,
- 45, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ SEARCH SERVICE ----------------------- */
-
-int z_DatabaseSpecificUnit(ODR o, Z_DatabaseSpecificUnit **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_DatabaseName(o, &(*p)->databaseName, 0, 0) &&
- z_ElementSetName(o, &(*p)->elementSetName, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_DatabaseSpecific(ODR o, Z_DatabaseSpecific **p, int opt,
- const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_DatabaseSpecific *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- odr_implicit_settag(o, ODR_CONTEXT, 1);
- if (odr_sequence_of(o, (Odr_fun)z_DatabaseSpecificUnit, &(*p)->elements,
- &(*p)->num_elements, 0))
- return 1;
- *p = 0;
- return 0;
-}
-
-int z_ElementSetNames(ODR o, Z_ElementSetNames **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementSetNames_generic,
- z_ElementSetName, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSetNames_databaseSpecific,
- (Odr_fun)z_DatabaseSpecific, 0},
- {-1, -1, -1, -1, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ElementSetNames *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt && odr_ok(o);
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return 0;
-}
-
-/* ----------------------- RPN QUERY -----------------------*/
-
-int z_ComplexAttribute(ODR o, Z_ComplexAttribute **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->list,
- &(*p)->num_list, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->semanticAction,
- &(*p)->num_semanticAction, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeElement(ODR o, Z_AttributeElement **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 121, Z_AttributeValue_numeric,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 224, Z_AttributeValue_complex,
- (Odr_fun)z_ComplexAttribute, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->attributeType, ODR_CONTEXT,
- 120, 0) &&
- odr_choice(o, arm, &(*p)->value, &(*p)->which, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Term(ODR o, Z_Term **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 45, Z_Term_general,
- (Odr_fun)odr_octetstring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 215, Z_Term_numeric,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 216, Z_Term_characterString,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 217, Z_Term_oid, (Odr_fun)odr_oid, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 218, Z_Term_dateTime, odr_cstring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 219, Z_Term_external,
- (Odr_fun) z_External, 0},
- /* add intUnit here */
- {ODR_IMPLICIT, ODR_CONTEXT, 221, Z_Term_null, (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction ==ODR_DECODE)
- *p = (Z_Term *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AttributesPlusTerm(ODR o, Z_AttributesPlusTerm **p, int opt,
- const char *name)
-{
- if (!(odr_implicit_settag(o, ODR_CONTEXT, 102) &&
- odr_sequence_begin(o, p, sizeof(**p), 0)))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 44) &&
- odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
- &(*p)->num_attributes, 0) &&
- z_Term(o, &(*p)->term, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ResultSetPlusAttributes(ODR o, Z_ResultSetPlusAttributes **p, int opt,
- const char *name)
-{
- if (!(odr_implicit_settag(o, ODR_CONTEXT, 214) &&
- odr_sequence_begin(o, p, sizeof(**p), 0)))
- return opt && odr_ok(o);
- return
- z_ResultSetId(o, &(*p)->resultSet, 0, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 44) &&
- odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
- &(*p)->num_attributes, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ProximityOperator(ODR o, Z_ProximityOperator **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxCode_known,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxCode_private,
- (Odr_fun)odr_integer, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_bool, &(*p)->exclusion, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->distance, ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_bool, &(*p)->ordered, ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_integer, &(*p)->relationType, ODR_CONTEXT, 4, 0) &&
- odr_constructed_begin(o, &(*p)->proximityUnitCode,
- ODR_CONTEXT, 5, 0) &&
- odr_choice(o, arm, &(*p)->proximityUnitCode, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_sequence_end(o);
-}
-
-int z_Operator(ODR o, Z_Operator **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Operator_and, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Operator_or, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Operator_and_not,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Operator_prox,
- (Odr_fun)z_ProximityOperator, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!*p && o->direction != ODR_DECODE)
- return opt;
- if (!odr_constructed_begin(o, p, ODR_CONTEXT, 46, 0))
- return opt && odr_ok(o);
- if (o->direction == ODR_DECODE)
- *p = (Z_Operator *)odr_malloc(o, sizeof(**p));
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end(o))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Operand(ODR o, Z_Operand **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {-1, -1, -1, Z_Operand_APT, (Odr_fun)z_AttributesPlusTerm, 0},
- {-1, -1, -1, Z_Operand_resultSetId, (Odr_fun)z_ResultSetId, 0},
- {-1, -1, -1, Z_Operand_resultAttr,
- (Odr_fun)z_ResultSetPlusAttributes, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Operand *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_RPNStructure(ODR o, Z_RPNStructure **p, int opt, const char *name);
-
-int z_Complex(ODR o, Z_Complex **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_RPNStructure(o, &(*p)->s1, 0, 0) &&
- z_RPNStructure(o, &(*p)->s2, 0, 0) &&
- z_Operator(o, &(*p)->roperator, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_RPNStructure(ODR o, Z_RPNStructure **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_RPNStructure_simple,
- (Odr_fun)z_Operand, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_RPNStructure_complex,
- (Odr_fun)z_Complex, 0},
- {-1 -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_RPNStructure *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_RPNQuery(ODR o, Z_RPNQuery **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_oid(o, &(*p)->attributeSetId, 0, 0) &&
- z_RPNStructure(o, &(*p)->RPNStructure, 0, 0) &&
- odr_sequence_end(o);
-}
-
-/* -----------------------END RPN QUERY ----------------------- */
-
-int z_Query(ODR o, Z_Query **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Query_type_1,
- (Odr_fun)z_RPNQuery, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Query_type_2,
- (Odr_fun)odr_octetstring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 101, Z_Query_type_101,
- (Odr_fun)z_RPNQuery, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Query *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SearchRequest(ODR o, Z_SearchRequest **p, int opt, const char *name)
-{
- Z_SearchRequest *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &pp->smallSetUpperBound, ODR_CONTEXT,
- 13, 0) &&
- odr_implicit(o, odr_integer, &pp->largeSetLowerBound, ODR_CONTEXT,
- 14, 0) &&
- odr_implicit(o, odr_integer, &pp->mediumSetPresentNumber, ODR_CONTEXT,
- 15, 0) &&
- odr_implicit(o, odr_bool, &pp->replaceIndicator, ODR_CONTEXT, 16, 1) &&
- odr_implicit(o, odr_visiblestring, &pp->resultSetName, ODR_CONTEXT,
- 17, 9) &&
- odr_implicit_settag(o, ODR_CONTEXT, 18) &&
- odr_sequence_of(o, z_DatabaseName, &pp->databaseNames,
- &pp->num_databaseNames, 0) &&
- odr_explicit(o, z_ElementSetNames, &pp->smallSetElementSetNames,
- ODR_CONTEXT, 100, 1) &&
- odr_explicit(o, z_ElementSetNames, &pp->mediumSetElementSetNames,
- ODR_CONTEXT, 101, 1) &&
- odr_implicit(o, odr_oid, &pp->preferredRecordSyntax,
- ODR_CONTEXT, 104, 1) &&
- odr_explicit(o, z_Query, &pp->query, ODR_CONTEXT, 21, 0) &&
- odr_implicit_tag(o, z_OtherInformation, &(*p)->additionalSearchInfo,
- ODR_CONTEXT, 203, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ RECORD ------------------------- */
-
-int z_DatabaseRecord(ODR o, Z_DatabaseRecord **p, int opt, const char *name)
-{
- return z_External(o, (Z_External **) p, opt, 0);
-}
-
-int z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {-1, -1, -1, Z_DiagForm_v2AddInfo, odr_visiblestring, 0},
- {-1, -1, -1, Z_DiagForm_v3AddInfo, z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, ODR_VISIBLESTRING, Z_DiagForm_v2AddInfo,
- odr_visiblestring, 0}, /* To cater to a bug in the CNIDR servers */
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_oid(o, &(*p)->diagnosticSetId, 1, 0) && /* SHOULD NOT BE OPT! */
- odr_integer(o, &(*p)->condition, 0, 0) &&
- /*
- * I no longer recall what server tagged the addinfo.. but it isn't
- * hurting anyone, so...
- * We need to turn it into a choice, or something, because of
- * that damn generalstring in v3.
- */
- odr_choice(o, arm, &(*p)->addinfo, &(*p)->which, 0) &&
- odr_sequence_end(o);
-}
-
-int z_DiagRec(ODR o, Z_DiagRec **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {-1, -1, -1, Z_DiagRec_defaultFormat, (Odr_fun)z_DefaultDiagFormat, 0},
- {-1, -1, -1, Z_DiagRec_externallyDefined, (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_DiagRec *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_DiagRecs(ODR o, Z_DiagRecs **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_DiagRecs *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- if (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->diagRecs,
- &(*p)->num_diagRecs, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 1, Z_NamePlusRecord_databaseRecord,
- (Odr_fun)z_DatabaseRecord, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_NamePlusRecord_surrogateDiagnostic,
- (Odr_fun)z_DiagRec, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
- 0, 1) &&
- odr_constructed_begin(o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
- odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_sequence_end(o);
-}
-
-int z_NamePlusRecordList(ODR o, Z_NamePlusRecordList **p, int opt,
- const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_NamePlusRecordList *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_NamePlusRecord, &(*p)->records,
- &(*p)->num_records, 0))
- return 1;
- *p = 0;
- return 0;
-}
-
-int z_Records(ODR o, Z_Records **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 28, Z_Records_DBOSD,
- (Odr_fun)z_NamePlusRecordList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 130, Z_Records_NSD,
- (Odr_fun)z_DiagRec, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 205, Z_Records_multipleNSD,
- (Odr_fun)z_DiagRecs, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Records *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-/* ------------------------ ACCESS CTRL SERVICE ----------------------- */
-
-int z_AccessControlRequest(ODR o, Z_AccessControlRequest **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 37, Z_AccessRequest_simpleForm,
- (Odr_fun)odr_octetstring, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessRequest_externallyDefined,
- (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_AccessControlResponse(ODR o, Z_AccessControlResponse **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 38, Z_AccessResponse_simpleForm,
- (Odr_fun)odr_octetstring, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessResponse_externallyDefined,
- (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_explicit(o, z_DiagRec, &(*p)->diagnostic, ODR_CONTEXT, 223, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ SCAN SERVICE -------------------- */
-
-int z_AttributeList(ODR o, Z_AttributeList **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_AttributeList *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- odr_implicit_settag(o, ODR_CONTEXT, 44);
- if (odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributes,
- &(*p)->num_attributes, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-/*
- * This is a temporary hack. We don't know just *what* old version of the
- * protocol willow uses, so we'll just patiently wait for them to update
- */
-static int willow_scan = 0;
-
-int z_WillowAttributesPlusTerm(ODR o, Z_AttributesPlusTerm **p, int opt,
- const char *name)
-{
- if (!*p && o->direction != ODR_DECODE)
- return opt;
- if (!odr_constructed_begin(o, p, ODR_CONTEXT, 4, 0))
- {
- o->t_class = -1;
- return opt && odr_ok(o);
- }
- if (!odr_constructed_begin(o, p, ODR_CONTEXT, 1, 0))
- return 0;
- if (!odr_constructed_begin(o, p, ODR_UNIVERSAL, ODR_SEQUENCE, 0))
- return 0;
- if (!odr_implicit_settag(o, ODR_CONTEXT, 44))
- return 0;
- if (o->direction == ODR_DECODE)
- *p = (Z_AttributesPlusTerm*)odr_malloc(o, sizeof(**p));
- if (!odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
- &(*p)->num_attributes, 0))
- return 0;
- if (!odr_sequence_end(o) || !odr_sequence_end(o))
- return 0;
- if (!z_Term(o, &(*p)->term, 0, 0))
- return 0;
- if (!odr_constructed_end(o))
- return 0;
- willow_scan = 1;
- return 1;
-}
-
-int z_AlternativeTerm(ODR o, Z_AlternativeTerm **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_AlternativeTerm *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- {
- o->t_class = -1;
- return opt && odr_ok(o);
- }
-
- if (odr_sequence_of(o, (Odr_fun)z_AttributesPlusTerm, &(*p)->terms,
- &(*p)->num_terms, 0))
- return 1;
- *p = 0;
- return opt && !o->error;
-}
-
-int z_ByDatabase(ODR o, Z_ByDatabase **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_DatabaseName(o, &(*p)->db, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->num, ODR_CONTEXT, 1, 1) &&
- z_OtherInformation(o, &(*p)->otherDbInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ByDatabaseList(ODR o, Z_ByDatabaseList **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_ByDatabase, &(*p)->elements,
- &(*p)->num_elements, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ScanOccurrences(ODR o, Z_ScanOccurrences **p, int opt, const char *name)
-{
- Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ScanOccurrences_global,
- (Odr_fun)odr_integer, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 3, Z_ScanOccurrences_byDatabase,
- (Odr_fun)z_ByDatabaseList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_OccurrenceByAttributesElem(ODR o, Z_OccurrenceByAttributesElem **p,
- int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_AttributeList, &(*p)->attributes, ODR_CONTEXT,
- 1, 1) &&
- z_ScanOccurrences(o, &(*p)->occurrences, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherOccurInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_OccurrenceByAttributes(ODR o, Z_OccurrenceByAttributes **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (!odr_sequence_of(o, (Odr_fun)z_OccurrenceByAttributesElem,
- &(*p)->elements, &(*p)->num_elements, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_TermInfo(ODR o, Z_TermInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- (willow_scan ?
- odr_implicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 1, 0) :
- z_Term(o, &(*p)->term, 0, 0)) &&
- odr_implicit(o, z_InternationalString, &(*p)->displayTerm, ODR_CONTEXT,
- 0, 1) &&
- z_AttributeList(o, &(*p)->suggestedAttributes, 1, 0) &&
- odr_implicit(o, z_AlternativeTerm, &(*p)->alternativeTerm,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_integer, &(*p)->globalOccurrences, ODR_CONTEXT,
- 2, 1) &&
- odr_implicit(o, z_OccurrenceByAttributes, &(*p)->byAttributes,
- ODR_CONTEXT, 3, 1) &&
- z_OtherInformation(o, &(*p)->otherTermInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Entry(ODR o, Z_Entry **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Entry_termInfo,
- (Odr_fun)z_TermInfo, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Entry_surrogateDiagnostic,
- (Odr_fun)z_DiagRec, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Entry *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ListEntries (ODR o, Z_ListEntries **p, int opt, const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit_settag (o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun) z_Entry, &(*p)->entries,
- &(*p)->num_entries, 0) || odr_ok(o)) &&
- odr_implicit_settag (o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun) z_DiagRec,
- &(*p)->nonsurrogateDiagnostics,
- &(*p)->num_nonsurrogateDiagnostics, 0)
- || odr_ok(o)) &&
- odr_sequence_end (o);
-}
-
-int z_ScanRequest(ODR o, Z_ScanRequest **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- willow_scan = 0;
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- odr_sequence_of(o, z_DatabaseName, &(*p)->databaseNames,
- &(*p)->num_databaseNames, 0) &&
- odr_oid(o, &(*p)->attributeSet, 1, 0) &&
- (z_AttributesPlusTerm(o, &(*p)->termListAndStartPoint, 1, 0) ?
- ((*p)->termListAndStartPoint ? 1 :
- z_WillowAttributesPlusTerm(o, &(*p)->termListAndStartPoint, 0, 0))
- : 0) &&
- odr_implicit(o, odr_integer, &(*p)->stepSize, ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, odr_integer, &(*p)->numberOfTermsRequested,
- ODR_CONTEXT, 6, 0) &&
- odr_implicit(o, odr_integer, &(*p)->preferredPositionInResponse,
- ODR_CONTEXT, 7, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
- odr_sequence_end(o);
-}
-
-int z_ScanResponse(ODR o, Z_ScanResponse **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->stepSize, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_integer, &(*p)->scanStatus, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, odr_integer, &(*p)->numberOfEntriesReturned,
- ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, odr_integer, &(*p)->positionOfTerm,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, z_ListEntries, &(*p)->entries, ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 8, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ SEARCHRESPONSE ----------------*/
-
-int z_NumberOfRecordsReturned(ODR o, int **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 24, opt);
-}
-
-int z_NextResultSetPosition(ODR o, int **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 25, opt);
-}
-
-int z_PresentStatus(ODR o, int **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 27, opt);
-}
-
-int z_SearchResponse(ODR o, Z_SearchResponse **p, int opt, const char *name)
-{
- Z_SearchResponse *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &pp->resultCount, ODR_CONTEXT, 23, 0) &&
- z_NumberOfRecordsReturned(o, &pp->numberOfRecordsReturned, 0, 0) &&
- z_NextResultSetPosition(o, &pp->nextResultSetPosition, 0, 0) &&
- odr_implicit(o, odr_bool, &pp->searchStatus, ODR_CONTEXT, 22, 0) &&
- odr_implicit(o, odr_integer, &pp->resultSetStatus,
- ODR_CONTEXT, 26, 1) &&
- z_PresentStatus(o, &pp->presentStatus, 1, 0) &&
- z_Records(o, &pp->records, 1, 0) &&
- odr_implicit(o, z_OtherInformation, &(*p)->additionalSearchInfo,
- ODR_CONTEXT, 203, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* --------------------- PRESENT SERVICE ---------------------- */
-
-int z_ElementSpec(ODR o, Z_ElementSpec **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSpec_elementSetName,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementSpec_externalSpec,
- (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ElementSpec *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Specification(ODR o, Z_Specification **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 1, 1) &&
- z_ElementSpec(o, &(*p)->elementSpec, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_DbSpecific(ODR o, Z_DbSpecific **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit(o, z_Specification, &(*p)->spec, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_CompSpec(ODR o, Z_CompSpec **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_bool, &(*p)->selectAlternativeSyntax, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit(o, z_Specification, &(*p)->generic, ODR_CONTEXT, 2, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_DbSpecific, &(*p)->dbSpecific,
- &(*p)->num_dbSpecific, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 4) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->recordSyntax,
- &(*p)->num_recordSyntax, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_RecordComposition(ODR o, Z_RecordComposition **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 19, Z_RecordComp_simple,
- (Odr_fun)z_ElementSetNames, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 209, Z_RecordComp_complex,
- (Odr_fun)z_CompSpec, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_RecordComposition *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
-
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Range(ODR o, Z_Range **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->startingPosition,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->numberOfRecords,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_PresentRequest(ODR o, Z_PresentRequest **p, int opt, const char *name)
-{
- Z_PresentRequest *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- z_ResultSetId(o, &pp->resultSetId, 0, 0) &&
- odr_implicit(o, odr_integer, &pp->resultSetStartPoint,
- ODR_CONTEXT, 30, 0) &&
- odr_implicit(o, odr_integer, &pp->numberOfRecordsRequested,
- ODR_CONTEXT, 29, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 212) &&
- (odr_sequence_of(o, (Odr_fun)z_Range, &(*p)->additionalRanges,
- &(*p)->num_ranges, 0) || odr_ok(o)) &&
- z_RecordComposition(o, &(*p)->recordComposition, 1, 0) &&
- odr_implicit(o, odr_oid, &(*p)->preferredRecordSyntax, ODR_CONTEXT,
- 104, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxSegmentCount, ODR_CONTEXT,
- 204, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxRecordSize, ODR_CONTEXT,
- 206, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxSegmentSize, ODR_CONTEXT,
- 207, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_PresentResponse(ODR o, Z_PresentResponse **p, int opt, const char *name)
-{
- Z_PresentResponse *pp;
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- pp = *p;
- return
- z_ReferenceId(o, &pp->referenceId, 1, 0) &&
- z_NumberOfRecordsReturned(o, &pp->numberOfRecordsReturned, 0, 0) &&
- z_NextResultSetPosition(o, &pp->nextResultSetPosition, 0, 0) &&
- z_PresentStatus(o, &pp->presentStatus, 0, 0) &&
- z_Records(o, &pp->records, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ----------------------DELETE -------------------------- */
-
-int z_DeleteSetStatus(ODR o, int **p, int opt, const char *name)
-{
- return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 33, opt);
-}
-
-int z_ListStatus(ODR o, Z_ListStatus **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ResultSetId(o, &(*p)->id, 0, 0) &&
- z_DeleteSetStatus(o, &(*p)->status, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_DeleteResultSetRequest(ODR o, Z_DeleteResultSetRequest **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->deleteFunction, ODR_CONTEXT, 32,
- 0) &&
- (odr_sequence_of(o, z_ResultSetId, &(*p)->resultSetList,
- &(*p)->num_resultSetList, 0) || odr_ok(o)) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ListStatuses (ODR o, Z_ListStatuses **p, int opt, const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of (o, (Odr_fun) z_ListStatus, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_DeleteResultSetResponse(ODR o, Z_DeleteResultSetResponse **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, z_DeleteSetStatus, &(*p)->deleteOperationStatus,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit (o, z_ListStatuses,
- &(*p)->deleteListStatuses, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->numberNotDeleted, ODR_CONTEXT,
- 34, 1) &&
- odr_implicit (o, z_ListStatuses,
- &(*p)->bulkStatuses, ODR_CONTEXT, 35, 1) &&
- odr_implicit(o, odr_visiblestring, &(*p)->deleteMessage, ODR_CONTEXT,
- 36, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ SEGMENT SERVICE -------------- */
-
-int z_Segment(ODR o, Z_Segment **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->numberOfRecordsReturned,
- ODR_CONTEXT, 24, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 0) &&
- odr_sequence_of(o, (Odr_fun)z_NamePlusRecord, &(*p)->segmentRecords,
- &(*p)->num_segmentRecords, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ CLOSE SERVICE ---------------- */
-
-int z_Close(ODR o, Z_Close **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->closeReason, ODR_CONTEXT, 211, 0)
- &&
- odr_implicit(o, odr_visiblestring, &(*p)->diagnosticInformation,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_oid, &(*p)->resourceReportFormat, ODR_CONTEXT,
- 4, 1) &&
- odr_implicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
- 5, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ APDU ------------------------- */
-
-int z_Permissions(ODR o, Z_Permissions **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->userId, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->allowableFunctions,
- &(*p)->num_allowableFunctions, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ExtendedServicesRequest(ODR o, Z_ExtendedServicesRequest **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->function, ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_oid, &(*p)->packageType, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->packageName,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->userId,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->retentionTime,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, z_Permissions, &(*p)->permissions,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->description,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_External, &(*p)->taskSpecificParameters,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, odr_integer, &(*p)->waitAction,
- ODR_CONTEXT, 11, 0) &&
- z_ElementSetName(o, &(*p)->elements, 1, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ExtendedServicesResponse(ODR o, Z_ExtendedServicesResponse **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->operationStatus, ODR_CONTEXT,
- 3, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 4) &&
- (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->diagnostics,
- &(*p)->num_diagnostics, 0) || odr_ok(o)) &&
- odr_implicit(o, z_External, &(*p)->taskPackage, ODR_CONTEXT, 5, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ SORT ------------------------- */
-
-int z_SortAttributes(ODR o, Z_SortAttributes **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_oid(o, &(*p)->id, 0, 0) &&
- z_AttributeList(o, &(*p)->list, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_SortKey(ODR o, Z_SortKey **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKey_sortField,
- z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKey_elementSpec,
- (Odr_fun)z_Specification, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKey_sortAttributes,
- (Odr_fun)z_SortAttributes, 0},
- {-1, -1, -1, -1, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SortDbSpecific(ODR o, Z_SortDbSpecific **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_DatabaseName(o, &(*p)->databaseName, 0, 0) &&
- z_SortKey(o, &(*p)->dbSort, 0, 0) &&
- odr_sequence_end(o);
-}
-
-int z_SortDbSpecificList(ODR o, Z_SortDbSpecificList **p, int opt,
- const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_SortDbSpecific, &(*p)->dbSpecific,
- &(*p)->num_dbSpecific, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SortElement(ODR o, Z_SortElement **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 1, Z_SortElement_generic,
- (Odr_fun)z_SortKey, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortElement_databaseSpecific,
- (Odr_fun)z_SortDbSpecificList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SortMissingValueAction(ODR o, Z_SortMissingValueAction **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortMissingValAct_abort,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortMissingValAct_null,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortMissingValAct_valData,
- (Odr_fun)odr_octetstring, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SortKeySpec(ODR o, Z_SortKeySpec **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_SortElement(o, &(*p)->sortElement, 0, 0) &&
- odr_implicit(o, odr_integer, &(*p)->sortRelation, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->caseSensitivity,
- ODR_CONTEXT, 2, 0) &&
- odr_explicit(o, z_SortMissingValueAction, &(*p)->missingValueAction,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_SortResponse(ODR o, Z_SortResponse **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->sortStatus, ODR_CONTEXT,
- 3, 0) &&
- odr_implicit(o, odr_integer, &(*p)->resultSetStatus, ODR_CONTEXT,
- 4, 1) &&
- odr_implicit(o, z_DiagRecs, &(*p)->diagnostics, ODR_CONTEXT, 5, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_SortKeySpecList(ODR o, Z_SortKeySpecList **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_SortKeySpec, &(*p)->specs,
- &(*p)->num_specs, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SortRequest(ODR o, Z_SortRequest **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, z_StringList, &(*p)->inputResultSetNames,
- ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->sortedResultSetName,
- ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, z_SortKeySpecList, &(*p)->sortSequence, ODR_CONTEXT,
- 5, 0) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ---------------------- Resource Report ---------------- */
-
-int z_ResourceReportRequest(ODR o, Z_ResourceReportRequest **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, z_ReferenceId, &(*p)->opId, ODR_CONTEXT, 210, 1) &&
- odr_implicit(o, odr_oid, &(*p)->prefResourceReportFormat, ODR_CONTEXT,
- 49, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ResourceReportResponse(ODR o, Z_ResourceReportResponse **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->resourceReportStatus,
- ODR_CONTEXT, 50, 0) &&
- odr_explicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
- 51, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ------------------------ APDU ------------------------- */
-
-int z_APDU(ODR o, Z_APDU **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 20, Z_APDU_initRequest,
- (Odr_fun)z_InitRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 21, Z_APDU_initResponse,
- (Odr_fun)z_InitResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 22, Z_APDU_searchRequest,
- (Odr_fun)z_SearchRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 23, Z_APDU_searchResponse,
- (Odr_fun)z_SearchResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 24, Z_APDU_presentRequest,
- (Odr_fun)z_PresentRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 25, Z_APDU_presentResponse,
- (Odr_fun)z_PresentResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 26, Z_APDU_deleteResultSetRequest,
- (Odr_fun)z_DeleteResultSetRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 27, Z_APDU_deleteResultSetResponse,
- (Odr_fun)z_DeleteResultSetResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 28, Z_APDU_accessControlRequest,
- (Odr_fun)z_AccessControlRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 29, Z_APDU_accessControlResponse,
- (Odr_fun)z_AccessControlResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 30, Z_APDU_resourceControlRequest,
- (Odr_fun)z_ResourceControlRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 31, Z_APDU_resourceControlResponse,
- (Odr_fun)z_ResourceControlResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 32, Z_APDU_triggerResourceControlRequest,
- (Odr_fun)z_TriggerResourceControlRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 33, Z_APDU_resourceReportRequest,
- (Odr_fun)z_ResourceReportRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 34, Z_APDU_resourceReportResponse,
- (Odr_fun)z_ResourceReportResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 35, Z_APDU_scanRequest,
- (Odr_fun)z_ScanRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 36, Z_APDU_scanResponse,
- (Odr_fun)z_ScanResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 43, Z_APDU_sortRequest,
- (Odr_fun)z_SortRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 44, Z_APDU_sortResponse,
- (Odr_fun)z_SortResponse, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 45, Z_APDU_segmentRequest,
- (Odr_fun)z_Segment, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 46, Z_APDU_extendedServicesRequest,
- (Odr_fun)z_ExtendedServicesRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 47, Z_APDU_extendedServicesResponse,
- (Odr_fun)z_ExtendedServicesResponse},
- {ODR_IMPLICIT, ODR_CONTEXT, 48, Z_APDU_close,
- (Odr_fun)z_Close, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_APDU *)odr_malloc(o, sizeof(**p));
- odr_setlenlen(o, 5);
- if (!odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
- {
- if (o->direction == ODR_DECODE)
- *p = 0;
- return opt && odr_ok(o);
- }
- return 1;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-acc.c,v $
- * Revision 1.9 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.8 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.7 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.6 1998/01/05 09:04:57 adam
- * Fixed bugs in encoders/decoders - Not operator (!) missing.
- *
- * Revision 1.5 1995/09/29 17:11:53 quinn
- * Smallish
- *
- * Revision 1.4 1995/09/27 15:02:41 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.3 1995/08/15 11:59:41 quinn
- * Updated External
- *
- * Revision 1.2 1995/06/05 10:52:05 quinn
- * Fixed some negligences.
- *
- * Revision 1.1 1995/06/02 09:49:15 quinn
- * Adding access control
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_Encryption1(ODR o, Z_Encryption1 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_octetstring, &(*p)->cryptType,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_octetstring, &(*p)->credential,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_octetstring, &(*p)->data, ODR_CONTEXT, 3, 0) &&
- odr_sequence_end(o);
-}
-
-int z_EnumeratedPrompt1(ODR o, Z_EnumeratedPrompt1 **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_visiblestring, &(*p)->suggestedString, ODR_CONTEXT,
- 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_PromptId1(ODR o, Z_PromptId1 **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptId1_enumeratedPrompt,
- (Odr_fun)z_EnumeratedPrompt1, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptId1_nonEnumeratedPrompt,
- odr_visiblestring, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_PromptId1 *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_PromptInfo1(ODR o, Z_PromptInfo1 **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Challenge1_character,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Challenge1_encrypted,
- (Odr_fun)z_Encryption1, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_PromptInfo1 *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ChallengeUnit1(ODR o, Z_ChallengeUnit1 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_PromptId1, &(*p)->promptId, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_visiblestring, &(*p)->defaultResponse,
- ODR_CONTEXT, 2, 1) &&
- odr_explicit(o, z_PromptInfo1, &(*p)->promptInfo,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_visiblestring, &(*p)->regExpr,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_null, &(*p)->responseRequired,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, odr_visiblestring, &(*p)->allowedValues,
- &(*p)->num_values, 0) || odr_ok(o)) &&
- odr_implicit(o, odr_null, &(*p)->shouldSave, ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_External, &(*p)->diagnostic, ODR_CONTEXT, 9, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Challenge1(ODR o, Z_Challenge1 **p, int opt, const char *name)
-{
- if (o->direction == ODR_ENCODE)
- *p = (Z_Challenge1 *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_ChallengeUnit1, &(*p)->list,
- &(*p)->num_challenges, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ResponseUnit1(ODR o, Z_ResponseUnit1 **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Response1_string,
- odr_visiblestring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Response1_accept,
- (Odr_fun)odr_bool, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Response1_acknowledge,
- (Odr_fun)odr_null, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 4, Z_Response1_diagnostic,
- (Odr_fun)z_DiagRec, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Response1_encrypted,
- (Odr_fun)z_Encryption1, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_PromptId1, &(*p)->promptId, ODR_CONTEXT, 1, 0) &&
- odr_constructed_begin(o, p, ODR_CONTEXT, 2, 0) &&
- odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_sequence_end(o);
-}
-
-int z_Response1(ODR o, Z_Response1 **p, int opt, const char *name)
-{
- if (o->direction == ODR_ENCODE)
- *p = (Z_Response1 *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_ResponseUnit1, &(*p)->list,
- &(*p)->num_responses, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_PromptObject1(ODR o, Z_PromptObject1 **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptObject1_challenge,
- (Odr_fun)z_Challenge1, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptObject1_response,
- (Odr_fun)z_Response1, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_PromptObject1 *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The name of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * $Log: prt-acc.h,v $
- * Revision 1.1 2000-10-03 12:55:50 adam
- * Removed several auto-generated files from CVS.
- *
- * Revision 1.1 1999/11/30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.9 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.8 1997/09/01 08:49:51 adam
- * New windows NT/95 port using MSV5.0. To export DLL functions the
- * YAZ_EXPORT modifier was added. Defined in yconfig.h.
- *
- * Revision 1.7 1997/05/14 06:53:46 adam
- * C++ support.
- *
- * Revision 1.6 1996/01/02 08:57:35 quinn
- * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
- *
- * Revision 1.5 1995/09/29 17:12:09 quinn
- * Smallish
- *
- * Revision 1.4 1995/09/27 15:02:49 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.3 1995/08/17 12:45:16 quinn
- * Fixed minor problems with GRS-1. Added support in c&s.
- *
- * Revision 1.2 1995/08/15 12:00:13 quinn
- * Updated External
- *
- * Revision 1.1 1995/06/02 09:49:49 quinn
- * Add access control
- *
- *
- */
-
-#ifndef PRT_ACC_H
-#define PRT_ACC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_Encryption1
-{
- Odr_oct *cryptType; /* OPTIONAL */
- Odr_oct *credential; /* OPTIONAL */
- Odr_oct *data;
-} Z_Encryption1;
-
-typedef struct Z_EnumeratedPrompt1
-{
- int *type;
-#define Z_Prompt1_groupId 0
-#define Z_Prompt1_userId 1
-#define Z_Prompt1_password 2
-#define Z_Prompt1_newPassword 3
-#define Z_Prompt1_copyright 4
- char *suggestedString; /* OPTIONAL */
-} Z_EnumeratedPrompt1;
-
-typedef struct Z_PromptId1
-{
- int which;
-#define Z_PromptId1_enumeratedPrompt 0
-#define Z_PromptId1_nonEnumeratedPrompt 1
- union
- {
- Z_EnumeratedPrompt1 *enumeratedPrompt;
- char *nonEnumeratedPrompt;
- } u;
-} Z_PromptId1;
-
-typedef struct Z_PromptInfo1
-{
- int which;
-#define Z_Challenge1_character 0
-#define Z_Challenge1_encrypted 1
- union
- {
- char *character;
- Z_Encryption1 *encrypted;
- } u;
-} Z_PromptInfo1;
-
-typedef struct Z_ChallengeUnit1
-{
- Z_PromptId1 *promptId;
- char *defaultResponse; /* OPTIONAL */
- Z_PromptInfo1 *promptInfo; /* OPTIONAL */
- char *regExpr; /* OPTIONAL */
- Odr_null *responseRequired; /* OPTIONAL */
- int num_values;
- char **allowedValues; /* OPTIONAL */
- Odr_null *shouldSave; /* OPTIONAL */
- int *dataType; /* OPTIONAL */
-#define Z_ChalDataType_integer 1
-#define Z_ChalDataType_date 2
-#define Z_ChalDataType_float 3
-#define Z_ChalDataType_alphaNumeric 4
-#define Z_ChalDataType_urlUrn 5
-#define Z_ChalDataType_boolean 6
- Z_External *diagnostic; /* OPTIONAL */
-} Z_ChallengeUnit1;
-
-typedef struct Z_Challenge1
-{
- int num_challenges;
- Z_ChallengeUnit1 **list;
-} Z_Challenge1;
-
-typedef struct Z_ResponseUnit1
-{
- Z_PromptId1 *promptId;
- int which;
-#define Z_Response1_string 0
-#define Z_Response1_accept 1
-#define Z_Response1_acknowledge 2
-#define Z_Response1_diagnostic 3
-#define Z_Response1_encrypted 4
- union
- {
- char *string;
- bool_t *accept;
- Odr_null *acknowledge;
- Z_DiagRec *diagnostic;
- Z_Encryption1 *encrypted;
- } u;
-} Z_ResponseUnit1;
-
-typedef struct Z_Response1
-{
- int num_responses;
- Z_ResponseUnit1 **list;
-} Z_Response1;
-
-typedef struct Z_PromptObject1
-{
- int which;
-#define Z_PromptObject1_challenge 0
-#define Z_PromptObject1_response 1
- union
- {
- Z_Challenge1 *challenge;
- Z_Response1 *response;
- } u;
-} Z_PromptObject1;
-
-YAZ_EXPORT int z_PromptObject1(ODR o, Z_PromptObject1 **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-add.c,v $
- * Revision 1.6 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.5 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.4 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.3 1998/01/05 09:04:57 adam
- * Fixed bugs in encoders/decoders - Not operator (!) missing.
- *
- * Revision 1.2 1997/04/30 08:52:02 quinn
- * Null
- *
- * Revision 1.1 1996/10/10 11:52:18 quinn
- * Added SearchResult additionalInfo
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_ResultsByDBList (ODR o, Z_ResultsByDBList **p, int opt, const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of (o, z_DatabaseName, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ResultsByDB_elem (ODR o, Z_ResultsByDB_elem **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ResultsByDB_all,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ResultsByDB_list,
- (Odr_fun)z_ResultsByDBList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
- odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end (o) &&
- odr_implicit (o, odr_integer,
- &(*p)->count, ODR_CONTEXT, 2, 1) &&
- odr_implicit (o, z_InternationalString,
- &(*p)->resultSetName, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end (o);
-}
-
-int z_ResultsByDB (ODR o, Z_ResultsByDB **p, int opt, const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of (o, (Odr_fun)z_ResultsByDB_elem, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_QueryExpressionTerm (ODR o, Z_QueryExpressionTerm **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_explicit (o, z_Term,
- &(*p)->queryTerm, ODR_CONTEXT, 1, 0) &&
- odr_implicit (o, z_InternationalString,
- &(*p)->termComment, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end (o);
-}
-
-int z_QueryExpression (ODR o, Z_QueryExpression **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryExpression_term,
- (Odr_fun)z_QueryExpressionTerm, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_QueryExpression_query,
- (Odr_fun)z_Query, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SearchInfoReport_elem (ODR o, Z_SearchInfoReport_elem **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit (o, z_InternationalString,
- &(*p)->subqueryId, ODR_CONTEXT, 1, 1) &&
- odr_implicit (o, odr_bool,
- &(*p)->fullQuery, ODR_CONTEXT, 2, 0) &&
- odr_explicit (o, z_QueryExpression,
- &(*p)->subqueryExpression, ODR_CONTEXT, 3, 1) &&
- odr_explicit (o, z_QueryExpression,
- &(*p)->subqueryInterpretation, ODR_CONTEXT, 4, 1) &&
- odr_explicit (o, z_QueryExpression,
- &(*p)->subqueryRecommendation, ODR_CONTEXT, 5, 1) &&
- odr_implicit (o, odr_integer,
- &(*p)->subqueryCount, ODR_CONTEXT, 6, 1) &&
- odr_implicit (o, z_IntUnit,
- &(*p)->subqueryWeight, ODR_CONTEXT, 7, 1) &&
- odr_implicit (o, z_ResultsByDB,
- &(*p)->resultsByDB, ODR_CONTEXT, 8, 1) &&
- odr_sequence_end (o);
-}
-
-int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt,
- const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of (o, (Odr_fun)z_SearchInfoReport_elem, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The name of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * $Log: prt-add.h,v $
- * Revision 1.1 2000-10-03 12:55:50 adam
- * Removed several auto-generated files from CVS.
- *
- * Revision 1.1 1999/11/30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.4 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.3 1997/05/14 06:53:46 adam
- * C++ support.
- *
- * Revision 1.2 1997/04/30 08:52:09 quinn
- * Null
- *
- * Revision 1.1 1996/10/10 11:51:58 quinn
- * Added SerchResult additional info
- *
- *
- */
-
-#ifndef PRT_ADD_H
-#define PRT_ADD_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_QueryExpressionTerm
-{
- Z_Term *queryTerm;
- char *termComment; /* OPTIONAL */
-} Z_QueryExpressionTerm;
-
-typedef struct Z_QueryExpression
-{
- int which;
-#define Z_QueryExpression_term 1
-#define Z_QueryExpression_query 2
- union {
- Z_QueryExpressionTerm *term;
- Z_Query *query;
- } u;
-} Z_QueryExpression;
-
-typedef struct Z_ResultsByDBList
-{
- int num;
- Z_DatabaseName **elements;
-} Z_ResultsByDBList;
-
-typedef struct Z_ResultsByDB_elem
-{
- int which;
-#define Z_ResultsByDB_all 1
-#define Z_ResultsByDB_list 2
- union {
- Odr_null *all;
- Z_ResultsByDBList *list;
- } u;
- int *count; /* OPTIONAL */
- char *resultSetName; /* OPTIONAL */
-} Z_ResultsByDB_elem;
-
-typedef struct Z_ResultsByDB
-{
- int num;
- Z_ResultsByDB_elem **elements;
-} Z_ResultsByDB;
-
-typedef struct Z_SearchInfoReport_elem
-{
- char *subqueryId; /* OPTIONAL */
- bool_t *fullQuery;
- Z_QueryExpression *subqueryExpression; /* OPTIONAL */
- Z_QueryExpression *subqueryInterpretation; /* OPTIONAL */
- Z_QueryExpression *subqueryRecommendation; /* OPTIONAL */
- int *subqueryCount; /* OPTIONAL */
- Z_IntUnit *subqueryWeight; /* OPTIONAL */
- Z_ResultsByDB *resultsByDB; /* OPTIONAL */
-} Z_SearchInfoReport_elem;
-
-typedef struct Z_SearchInfoReport
-{
- int num;
- Z_SearchInfoReport_elem **elements;
-} Z_SearchInfoReport;
-
-int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-arc.c,v $
- * Revision 1.4 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.3 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.2 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.1 1996/06/10 08:55:20 quinn
- * Added Summary, OPAC
- *
- *
- */
-
-#include <yaz/proto.h>
-
-/* ----------------------- Summary Record --------------- */
-
-int z_FormatSpec(ODR o, Z_FormatSpec **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->type,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->size, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_integer, &(*p)->bestPosn, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_BriefBib(ODR o, Z_BriefBib **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->title,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->author,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->callNumber,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->recordType,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->bibliographicLevel,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, (Odr_fun)z_FormatSpec, &(*p)->format,
- &(*p)->num_format, 0) ||
- odr_ok(o)) &&
- odr_implicit(o, z_InternationalString, &(*p)->publicationPlace,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->publicationDate,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->targetSystemKey,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->satisfyingElement,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, odr_integer, &(*p)->rank,
- ODR_CONTEXT, 11, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->documentId,
- ODR_CONTEXT, 12, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->abstract,
- ODR_CONTEXT, 13, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-/* ----------------------- Summary Record --------------- */
-
-int z_CircRecord(ODR o, Z_CircRecord **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_bool, &(*p)->availableNow, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->availabilityDate,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->availableThru,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->restrictions,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->itemId,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, odr_bool, &(*p)->renewable, ODR_CONTEXT, 6, 0) &&
- odr_implicit(o, odr_bool, &(*p)->onHold, ODR_CONTEXT, 7, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->midspine,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->temporaryLocation,
- ODR_CONTEXT, 10, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Volume(ODR o, Z_Volume **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->enumeration,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->chronology,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_HoldingsAndCircData(ODR o, Z_HoldingsAndCircData **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->typeOfRecord,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->encodingLevel,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->format,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->receiptAcqStatus,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->generalRetention,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->completeness,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->dateOfReport,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->nucCode,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->localLocation,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->shelvingLocation,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->callNumber,
- ODR_CONTEXT, 11, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->shelvingData,
- ODR_CONTEXT, 12, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->copyNumber,
- ODR_CONTEXT, 13, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->publicNote,
- ODR_CONTEXT, 14, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->reproductionNote,
- ODR_CONTEXT, 15, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->termsUseRepro,
- ODR_CONTEXT, 16, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
- ODR_CONTEXT, 17, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 18) &&
- (odr_sequence_of(o, (Odr_fun)z_Volume, &(*p)->volumes,
- &(*p)->num_volumes, 0) ||
- odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 19) &&
- (odr_sequence_of(o, (Odr_fun)z_CircRecord, &(*p)->circulationData,
- &(*p)->num_circulationData, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_HoldingsRecord(ODR o, Z_HoldingsRecord **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_HoldingsRecord_marcHoldingsRecord,
- (Odr_fun)z_External, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_HoldingsRecord_holdingsAndCirc,
- (Odr_fun)z_HoldingsAndCircData, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_OPACRecord(ODR o, Z_OPACRecord **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_External, &(*p)->bibliographicRecord,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_HoldingsRecord, &(*p)->holdingsData,
- &(*p)->num_holdingsData, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995,1996 Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_ARC_H
-#define PRT_ARC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ------------------- Summary Record --------------------- */
-
-typedef struct Z_FormatSpec
-{
- char *type;
- int *size; /* OPTIONAL */
- int *bestPosn; /* OPTIONAL */
-} Z_FormatSpec;
-
-typedef struct Z_BriefBib
-{
- char *title;
- char *author; /* OPTIONAL */
- char *callNumber; /* OPTIONAL */
- char *recordType; /* OPTIONAL */
- char *bibliographicLevel; /* OPTIONAL */
- int num_format;
- Z_FormatSpec **format; /* OPTIONAL */
- char *publicationPlace; /* OPTIONAL */
- char *publicationDate; /* OPTIONAL */
- char *targetSystemKey; /* OPTIONAL */
- char *satisfyingElement; /* OPTIONAL */
- int *rank; /* OPTIONAL */
- char *documentId; /* OPTIONAL */
- char *abstract; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_BriefBib;
-
-/* ------------------- OPAC Record --------------------- */
-
-typedef struct Z_CircRecord
-{
- bool_t *availableNow;
- char *availabilityDate; /* OPTIONAL */
- char *availableThru; /* OPTIONAL */
- char *restrictions; /* OPTIONAL */
- char *itemId; /* OPTIONAL */
- bool_t *renewable;
- bool_t *onHold;
- char *enumAndChron; /* OPTIONAL */
- char *midspine; /* OPTIONAL */
- char *temporaryLocation; /* OPTIONAL */
-} Z_CircRecord;
-
-typedef struct Z_Volume
-{
- char *enumeration; /* OPTIONAL */
- char *chronology; /* OPTIONAL */
- char *enumAndChron; /* OPTIONAL */
-} Z_Volume;
-
-typedef struct Z_HoldingsAndCircData
-{
- char *typeOfRecord; /* OPTIONAL */
- char *encodingLevel; /* OPTIONAL */
- char *format; /* OPTIONAL */
- char *receiptAcqStatus; /* OPTIONAL */
- char *generalRetention; /* OPTIONAL */
- char *completeness; /* OPTIONAL */
- char *dateOfReport; /* OPTIONAL */
- char *nucCode; /* OPTIONAL */
- char *localLocation; /* OPTIONAL */
- char *shelvingLocation; /* OPTIONAL */
- char *callNumber; /* OPTIONAL */
- char *shelvingData; /* OPTIONAL */
- char *copyNumber; /* OPTIONAL */
- char *publicNote; /* OPTIONAL */
- char *reproductionNote; /* OPTIONAL */
- char *termsUseRepro; /* OPTIONAL */
- char *enumAndChron; /* OPTIONAL */
- int num_volumes;
- Z_Volume **volumes; /* OPTIONAL */
- int num_circulationData;
- Z_CircRecord **circulationData;/* OPTIONAL */
-} Z_HoldingsAndCircData;
-
-typedef struct Z_HoldingsRecord
-{
- int which;
-#define Z_HoldingsRecord_marcHoldingsRecord 0
-#define Z_HoldingsRecord_holdingsAndCirc 1
- union
- {
- Z_External *marcHoldingsRecord;
- Z_HoldingsAndCircData *holdingsAndCirc;
- } u;
-} Z_HoldingsRecord;
-
-typedef struct Z_OPACRecord
-{
- Z_External *bibliographicRecord; /* OPTIONAL */
- int num_holdingsData;
- Z_HoldingsRecord **holdingsData; /* OPTIONAL */
-} Z_OPACRecord;
-
-YAZ_EXPORT int z_BriefBib(ODR o, Z_BriefBib **p, int opt, const char *name);
-YAZ_EXPORT int z_OPACRecord(ODR o, Z_OPACRecord **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * This file is part of the YAZ toolkit:
- * Copyright (c) 1998-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * Contribution by Ronald van Der Meer (RVDM):
- * Databasix Information Systems B.V., Utrecht, The Netherlands.
- *
- * $Log: prt-dat.c,v $
- * Revision 1.4 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.3 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.2 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.1 1998/02/10 15:31:46 adam
- * Implemented date and time structure. Changed the Update Extended
- * Service.
- *
- */
-
-#include <yaz/proto.h>
-
-int z_MonthAndDay(ODR o, Z_MonthAndDay **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->month, ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_integer, &(*p)->day, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Quarter(ODR o, Z_Quarter **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Quarter_first,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Quarter_second,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Quarter_third,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Quarter_fourth,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Season(ODR o, Z_Season **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Season_winter,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Season_spring,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Season_summer,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Season_autumn,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_PartOfYear(ODR o, Z_PartOfYear **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PartOfYear_monthAndDay,
- (Odr_fun) z_MonthAndDay, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PartOfYear_julianDay,
- (Odr_fun) odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_PartOfYear_weekNumber,
- (Odr_fun) odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_PartOfYear_quarter,
- (Odr_fun) z_Quarter, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_PartOfYear_season,
- (Odr_fun) z_Season, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Era(ODR o, Z_Era **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Era_decade, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Era_century, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Era_millennium, (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_DateFlags(ODR o, Z_DateFlags **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_null, &(*p)->circa, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_Era, &(*p)->era, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Date(ODR o, Z_Date **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->year, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_PartOfYear, &(*p)->partOfYear, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_DateFlags, &(*p)->flags, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Zone(ODR o, Z_Zone **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Zone_local, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Zone_utc, (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Zone_utcOffset,
- (Odr_fun)odr_integer, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Time(ODR o, Z_Time **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->hour, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->minute, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_integer, &(*p)->second, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->partOfSecond, ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_Zone, &(*p)->zone, ODR_CONTEXT, 5, 1) &&
- odr_sequence_end(o);
-}
-
-int z_DateTime(ODR o, Z_DateTime **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_Date, &(*p)->z3950Date, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_Time, &(*p)->z3950Time, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
+++ /dev/null
-/*
- * This file is part of the YAZ toolkit:
- * Copyright (c) 1998, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * Contribution by Ronald van Der Meer (RVDM):
- * Databasix Information Systems B.V., Utrecht, The Netherlands.
- *
- * $Log: prt-dat.h,v $
- * Revision 1.1 2000-10-03 12:55:50 adam
- * Removed several auto-generated files from CVS.
- *
- * Revision 1.1 1999/11/30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.2 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.1 1998/02/10 15:31:52 adam
- * Implemented date and time structure. Changed the Update Extended
- * Service.
- *
- */
-
-#ifndef __PRT_DAT_H
-#define __PRT_DAT_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_MonthAndDay
-{
- int *month;
- int *day; /* OPTIONAL */
-} Z_MonthAndDay;
-
-typedef struct Z_Quarter
-{
- int which;
-#define Z_Quarter_first 0
-#define Z_Quarter_second 1
-#define Z_Quarter_third 2
-#define Z_Quarter_fourth 3
- union
- {
- Odr_null *first;
- Odr_null *second;
- Odr_null *third;
- Odr_null *fourth;
- } u;
-} Z_Quarter;
-
-typedef struct Z_Season
-{
- int which;
-#define Z_Season_winter 0
-#define Z_Season_spring 1
-#define Z_Season_summer 2
-#define Z_Season_autumn 3
- union
- {
- Odr_null *winter;
- Odr_null *spring;
- Odr_null *summer;
- Odr_null *autumn;
- } u;
-} Z_Season;
-
-typedef struct Z_PartOfYear
-{
- int which;
-#define Z_PartOfYear_monthAndDay 0
-#define Z_PartOfYear_julianDay 1
-#define Z_PartOfYear_weekNumber 2
-#define Z_PartOfYear_quarter 3
-#define Z_PartOfYear_season 4
- union
- {
- Z_MonthAndDay *monthAndDay;
- int *julianDay;
- int *weekNumber;
- Z_Quarter *quarter;
- Z_Season *season;
- } u;
-} Z_PartOfYear;
-
-typedef struct Z_Era
-{
- int which;
-#define Z_Era_decade 0
-#define Z_Era_century 1
-#define Z_Era_millennium 2
- union
- {
- Odr_null *decade;
- Odr_null *century;
- Odr_null *millennium;
- } u;
-} Z_Era;
-
-typedef struct Z_DateFlags
-{
- Odr_null *circa; /* OPTIONAL */
- Z_Era *era; /* OPTIONAL */
-} Z_DateFlags;
-
-typedef struct Z_Date
-{
- int *year;
- Z_PartOfYear *partOfYear; /* OPTIONAL */
- Z_DateFlags *flags; /* OPTIONAL */
-} Z_Date;
-
-typedef struct Z_Zone
-{
- int which;
-#define Z_Zone_local 0
-#define Z_Zone_utc 1
-#define Z_Zone_utcOffset 2
- union
- {
- Odr_null *local;
- Odr_null *utc;
- int *utcOffset;
- } u;
-} Z_Zone;
-
-typedef struct Z_Time
-{
- int *hour;
- int *minute; /* OPTIONAL */
- int *second; /* OPTIONAL */
- Z_IntUnit *partOfSecond; /* OPTIONAL */
- Z_Zone *zone; /* OPTIONAL */
-} Z_Time;
-
-typedef struct Z_DateTime
-{
- Z_Date *z3950Date; /* OPTIONAL */
- Z_Time *z3950Time; /* OPTIONAL */
-} Z_DateTime;
-
-YAZ_EXPORT int z_DateTime(ODR o, Z_DateTime **p, int opt, const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-dia.c,v $
- * Revision 1.7 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.6 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.5 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.4 1996/01/22 09:46:34 quinn
- * Added Sort PDU. Moved StringList to main protocol file.
- *
- * Revision 1.3 1995/09/29 17:11:54 quinn
- * Smallish
- *
- * Revision 1.2 1995/09/27 15:02:41 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.1 1995/08/29 11:19:31 quinn
- * Added Diagnostic Format
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_TooMany(ODR o, Z_TooMany **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->tooManyWhat, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->max, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_BadSpec(ODR o, Z_BadSpec **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_Specification, &(*p)->spec, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 2, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_Specification, &(*p)->goodOnes,
- &(*p)->num_goodOnes, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_DbUnavailWhy(ODR o, Z_DbUnavailWhy **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->reasonCode, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->message, ODR_CONTEXT,
- 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_DbUnavail(ODR o, Z_DbUnavail **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_DbUnavailWhy, &(*p)->why, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Attribute(ODR o, Z_Attribute **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->id, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 3, 1) &&
- odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_AttCombo(ODR o, Z_AttCombo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_AttributeList, &(*p)->unsupportedCombination,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_AttributeList, &(*p)->alternatives,
- &(*p)->num_alternatives, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_DiagTerm(ODR o, Z_DiagTerm **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->problem, ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Proximity(ODR o, Z_Proximity **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Proximity_resultSets,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Proximity_badSet,
- (Odr_fun)z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Proximity_relation,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Proximity_unit,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Proximity_distance,
- (Odr_fun)odr_integer, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_Proximity_attributes,
- (Odr_fun)z_AttributeList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Proximity_ordered,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Proximity_exclusion,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Proximity *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AttrListList(ODR o, Z_AttrListList **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_AttrListList *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_AttributeList, &(*p)->lists,
- &(*p)->num_lists, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Scan(ODR o, Z_Scan **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ScanD_nonZeroStepSize,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ScanD_specifiedStepSize,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ScanD_termList1,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ScanD_termList2,
- (Odr_fun)z_AttrListList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ScanD_posInResponse,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_ScanD_resources,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_ScanD_endOfList,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Scan *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Sort(ODR o, Z_Sort **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortD_sequence,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortD_noRsName,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortD_tooMany,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortD_incompatible,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_SortD_generic,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_SortD_dbSpecific,
- (Odr_fun)odr_null, 0},
-#if 0
- {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_SortD_sortElement,
- (Odr_fun)z_SortElement, 0},
-#endif
- {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_SortD_key,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_SortD_action,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 9, Z_SortD_illegal,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 10, Z_SortD_inputTooLarge,
- (Odr_fun)z_StringList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 11, Z_SortD_aggregateTooLarge,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Sort *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Segmentation(ODR o, Z_Segmentation **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SegmentationD_segments,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Segmentation *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ExtServices(ODR o, Z_ExtServices **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ExtServicesD_req,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ExtServicesD_permission,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ExtServicesD_immediate,
- (Odr_fun)odr_integer, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ExtServices *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_OidList(ODR o, Z_OidList **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_OidList *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->oids, &(*p)->num_oids, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AccessCtrl(ODR o, Z_AccessCtrl **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_AccessCtrlD_noUser,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_AccessCtrlD_refused,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AccessCtrlD_simple,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AccessCtrlD_oid,
- (Odr_fun)z_OidList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_AccessCtrlD_alternative,
- (Odr_fun)z_OidList, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_AccessCtrlD_pwdInv,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_AccessCtrlD_pwdExp,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_AccessCtrl *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_RecordSyntax(ODR o, Z_RecordSyntax **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->unsupportedSyntax,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->suggestedAlternatives,
- &(*p)->num_suggestedAlternatives, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_DiagFormat(ODR o, Z_DiagFormat **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1000, Z_DiagFormat_tooMany,
- (Odr_fun)z_TooMany, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1001, Z_DiagFormat_badSpec,
- (Odr_fun)z_BadSpec, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1002, Z_DiagFormat_dbUnavail,
- (Odr_fun)z_DbUnavail, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1003, Z_DiagFormat_unSupOp,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1004, Z_DiagFormat_attribute,
- (Odr_fun)z_Attribute, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1005, Z_DiagFormat_attCombo,
- (Odr_fun)z_AttCombo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1006, Z_DiagFormat_term,
- (Odr_fun)z_DiagTerm, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1007, Z_DiagFormat_proximity,
- (Odr_fun)z_Proximity, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1008, Z_DiagFormat_scan,
- (Odr_fun)z_Scan, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1009, Z_DiagFormat_sort,
- (Odr_fun)z_Sort, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1010, Z_DiagFormat_segmentation,
- (Odr_fun)z_Segmentation, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1011, Z_DiagFormat_extServices,
- (Odr_fun)z_ExtServices, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 1012, Z_DiagFormat_accessCtrl,
- (Odr_fun)z_AccessCtrl, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1013, Z_DiagFormat_recordSyntax,
- (Odr_fun)z_RecordSyntax, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_DiagFormat *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Diagnostic(ODR o, Z_Diagnostic **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Diagnostic_defaultDiagRec,
- (Odr_fun)z_DefaultDiagFormat, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Diagnostic_explicitDiagnostic,
- (Odr_fun)z_DiagFormat, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Diagnostic *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_DiagnosticUnit(ODR o, Z_DiagnosticUnit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_Diagnostic, &(*p)->diagnostic, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->message,
- ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_DiagnosticFormat(ODR o, Z_DiagnosticFormat **p, int opt,
- const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_DiagnosticFormat *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_DiagnosticUnit, &(*p)->diagnostics,
- &(*p)->num_diagnostics, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-1998, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_DIA_H
-#define PRT_DIA_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_TooMany
-{
- int *tooManyWhat;
-#define Z_TooMany_argumentWords 1
-#define Z_TooMany_truncatedWords 2
-#define Z_TooMany_booleanOperators 3
-#define Z_TooMany_incompleteSubfields 4
-#define Z_TooMany_characters 5
-#define Z_TooMany_recordsRetrieved 6
-#define Z_TooMany_databasesSpecified 7
-#define Z_TooMany_resultSetsCreated 8
-#define Z_TooMany_indexTermsProcessed 9
- int *max; /* OPTIONAL */
-} Z_TooMany;
-
-typedef struct Z_BadSpec
-{
- Z_Specification *spec;
- char *db; /* OPTIONAL */
- int num_goodOnes;
- Z_Specification **goodOnes; /* OPTIONAL */
-} Z_BadSpec;
-
-typedef struct Z_DbUnavailWhy
-{
- int *reasonCode; /* OPTIONAL */
-#define Z_DbUnavail_doesNotExist 0
-#define Z_DbUnavail_existsButUnavail 1
-#define Z_DbUnavail_locked 2
-#define Z_DbUnavail_accessDenied 3
- char *message; /* OPTIONAL */
-} Z_DbUnavailWhy;
-
-typedef struct Z_DbUnavail
-{
- char *db;
- Z_DbUnavailWhy *why; /* OPTIONAL */
-} Z_DbUnavail;
-
-typedef struct Z_Attribute
-{
- Odr_oid *id;
- int *type; /* OPTIONAL */
- int *value; /* OPTIONAL */
- Z_Term *term; /* OPTIONAL */
-} Z_Attribute;
-
-typedef struct Z_AttCombo
-{
- Z_AttributeList *unsupportedCombination;
- int num_alternatives;
- Z_AttributeList **alternatives; /* OPTIONAL */
-} Z_AttCombo;
-
-typedef struct Z_DiagTerm
-{
- int *problem; /* OPTIONAL */
-#define Z_DiagtermProb_codedValue 1
-#define Z_DiagtermProb_unparsable 2
-#define Z_DiagtermProb_tooShort 3
-#define Z_DiagtermProb_type 4
- Z_Term *term;
-} Z_DiagTerm;
-
-typedef struct Z_Proximity
-{
- int which;
-#define Z_Proximity_resultSets 0
-#define Z_Proximity_badSet 1
-#define Z_Proximity_relation 2
-#define Z_Proximity_unit 3
-#define Z_Proximity_distance 4
-#define Z_Proximity_attributes 5
-#define Z_Proximity_ordered 6
-#define Z_Proximity_exclusion 7
- union
- {
- Odr_null *resultSets;
- char *badSet;
- int *relation;
- int *unit;
- int *distance;
- Z_AttributeList *attributes;
- Odr_null *ordered;
- Odr_null *exclusion;
- } u;
-} Z_Proximity;
-
-typedef struct Z_AttrListList
-{
- int num_lists;
- Z_AttributeList *lists;
-} Z_AttrListList;
-
-typedef struct Z_Scan
-{
- int which;
-#define Z_ScanD_nonZeroStepSize 0
-#define Z_ScanD_specifiedStepSize 1
-#define Z_ScanD_termList1 2
-#define Z_ScanD_termList2 3
-#define Z_ScanD_posInResponse 4
-#define Z_ScanD_resources 5
-#define Z_ScanD_endOfList 6
- union
- {
- Odr_null *nonZeroStepSize;
- Odr_null *specifiedStepSize;
- Odr_null *termList1;
- Z_AttrListList *termList2;
- int *posInResponse;
-#define Z_ScanPosInRsp_mustBeOne 1
-#define Z_ScanPosInRsp_mustBePositive 2
-#define Z_ScanPosInRsp_mustBeNonNegative 3
-#define Z_ScanPosInRsp_other 4
- Odr_null *resources;
- Odr_null *endOfList;
- } u;
-} Z_Scan;
-
-typedef struct Z_Sort
-{
- int which;
-#define Z_SortD_sequence 0
-#define Z_SortD_noRsName 1
-#define Z_SortD_tooMany 2
-#define Z_SortD_incompatible 3
-#define Z_SortD_generic 4
-#define Z_SortD_dbSpecific 5
-#define Z_SortD_sortElement 6
-#define Z_SortD_key 7
-#define Z_SortD_action 8
-#define Z_SortD_illegal 9
-#define Z_SortD_inputTooLarge 10
-#define Z_SortD_aggregateTooLarge 11
- union
- {
- Odr_null *sequence;
- Odr_null *noRsName;
- int *tooMany;
- Odr_null *incompatible;
- Odr_null *generic;
- Odr_null *dbSpecific;
- int *key;
-#define Z_SortKey_tooMany 1
-#define Z_SortKey_duplicate 2
- Odr_null *action;
- int *illegal;
-#define Z_SortIllegal_relation 1
-#define Z_SortIllegal_case 2
-#define Z_SortIllegal_action 3
-#define Z_SortIllegal_sort 4
- Z_StringList *inputTooLarge;
- Odr_null *aggregateTooLarge;
- } u;
-} Z_Sort;
-
-typedef struct Z_Segmentation
-{
- int which;
-#define Z_SegmentationD_segments 0
- union
- {
- Odr_null *segments;
- } u;
-} Z_Segmentation;
-
-typedef struct Z_ExtServices
-{
- int which;
-#define Z_ExtServicesD_req 0
-#define Z_ExtServicesD_permission 1
-#define Z_ExtServicesD_immediate 2
- union
- {
- int *req;
-#define Z_ExtSrvReq_nameInUse 1
-#define Z_ExtSrvReq_noSuchname 2
-#define Z_ExtSrvReq_quota 3
-#define Z_ExtSrvReq_type 4
- int *permission;
-#define Z_ExtSrvPerm_id 1
-#define Z_ExtSrvPerm_modifyDelete 2
- int *immediate;
-#define Z_ExtSrvImm_failed 1
-#define Z_ExtSrvImm_service 2
-#define Z_ExtSrvImm_parameters 3
- } u;
-} Z_ExtServices;
-
-typedef struct Z_OidList
-{
- int num_oids;
- Odr_oid **oids;
-} Z_OidList;
-
-typedef struct Z_AccessCtrl
-{
- int which;
-#define Z_AccessCtrlD_noUser 0
-#define Z_AccessCtrlD_refused 1
-#define Z_AccessCtrlD_simple 2
-#define Z_AccessCtrlD_oid 3
-#define Z_AccessCtrlD_alternative 4
-#define Z_AccessCtrlD_pwdInv 5
-#define Z_AccessCtrlD_pwdExp 6
- union
- {
- Odr_null *noUser;
- Odr_null *refused;
- Odr_null *simple;
- Z_OidList *oid;
- Z_OidList *alternative;
- Odr_null *pwdInv;
- Odr_null *pwdExp;
- } u;
-} Z_AccessCtrl;
-
-typedef struct Z_RecordSyntax
-{
- Odr_oid *unsupportedSyntax;
- int num_suggestedAlternatives; /* OPTIONAL */
- Odr_oid **suggestedAlternatives; /* OPTIONAL */
-} Z_RecordSyntax;
-
-typedef struct Z_DiagFormat
-{
- int which;
-#define Z_DiagFormat_tooMany 0
-#define Z_DiagFormat_badSpec 1
-#define Z_DiagFormat_dbUnavail 2
-#define Z_DiagFormat_unSupOp 3
-#define Z_DiagFormat_attribute 4
-#define Z_DiagFormat_attCombo 5
-#define Z_DiagFormat_term 6
-#define Z_DiagFormat_proximity 7
-#define Z_DiagFormat_scan 8
-#define Z_DiagFormat_sort 9
-#define Z_DiagFormat_segmentation 10
-#define Z_DiagFormat_extServices 11
-#define Z_DiagFormat_accessCtrl 12
-#define Z_DiagFormat_recordSyntax 13
- union
- {
- Z_TooMany *tooMany;
- Z_BadSpec *badSpec;
- Z_DbUnavail *dbUnavail;
- int *unSupOp;
-#define Z_UnSupOp_and 0
-#define Z_UnSupOp_or 1
-#define Z_UnSupOp_and_not 2
-#define Z_UnSupOp_prox 3
- Z_Attribute *attribute;
- Z_AttributeList *attCombo;
- Z_DiagTerm *term;
- Z_Proximity *proximity;
- Z_Scan *scan;
- Z_Sort *sort;
- Z_Segmentation *segmentation;
- Z_ExtServices *extServices;
- Z_AccessCtrl *accessCtrl;
- Z_RecordSyntax *recordSyntax;
- } u;
-} Z_DiagFormat;
-
-typedef struct Z_Diagnostic
-{
- int which;
-#define Z_Diagnostic_defaultDiagRec 0
-#define Z_Diagnostic_explicitDiagnostic 1
- union
- {
- Z_DefaultDiagFormat *defaultDiagRec;
- Z_DiagFormat *explicitDiagnostic;
- } u;
-} Z_Diagnostic;
-
-typedef struct Z_DiagnosticUnit
-{
- Z_Diagnostic *diagnostic; /* OPTIONAL */
- char *message; /* OPTIONAL */
-} Z_DiagnosticUnit;
-
-typedef struct Z_DiagnosticFormat
-{
- int num_diagnostics;
- Z_DiagnosticUnit **diagnostics;
-} Z_DiagnosticFormat;
-
-YAZ_EXPORT int z_DiagnosticFormat(ODR o, Z_DiagnosticFormat **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-esp.c,v $
- * Revision 1.5 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.4 1999/04/20 09:56:47 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.3 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.2 1998/02/10 15:31:46 adam
- * Implemented date and time structure. Changed the Update Extended
- * Service.
- *
- * Revision 1.1 1995/10/12 10:34:37 quinn
- * Added Espec-1.
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_OccurValues(ODR o, Z_OccurValues **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->start, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->howMany, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Occurrences(ODR o, Z_Occurrences **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Occurrences_all,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Occurrences_last,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Occurrences_values,
- (Odr_fun)z_OccurValues, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_Occurrences *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SpecificTag(ODR o, Z_SpecificTag **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->schemaId, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT,
- 2, 0) &&
- odr_explicit(o, z_Occurrences, &(*p)->occurrences,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ETagUnit(ODR o, Z_ETagUnit **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ETagUnit_specificTag,
- (Odr_fun)z_SpecificTag, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ETagUnit_wildThing,
- (Odr_fun)z_Occurrences, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ETagUnit_wildPath,
- (Odr_fun)odr_null, 0},
- {-1, -1, -1 -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ETagUnit *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ETagPath(ODR o, Z_ETagPath **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_ETagPath *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_ETagUnit, &(*p)->tags,
- &(*p)->num_tags, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_SimpleElement(ODR o, Z_SimpleElement **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_ETagPath, &(*p)->path, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_Variant, &(*p)->variantRequest,
- ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_CompoPrimitives(ODR o, Z_CompoPrimitives **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_CompoPrimitives *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, z_InternationalString, &(*p)->primitives,
- &(*p)->num_primitives, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_CompoSpecs(ODR o, Z_CompoSpecs **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_CompoSpecs *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_SimpleElement, &(*p)->specs,
- &(*p)->num_specs, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_CompositeElement(ODR o, Z_CompositeElement **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_CompoElement_primitives,
- (Odr_fun)z_CompoPrimitives, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_CompoElement_specs,
- (Odr_fun)z_CompoSpecs, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_constructed_begin(o, &(*p)->elementList, ODR_CONTEXT, 1, 0) &&
- odr_choice(o, arm, &(*p)->elementList, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_implicit(o, z_ETagPath, &(*p)->deliveryTag, ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_Variant, &(*p)->variantRequest, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ElementRequest(ODR o, Z_ElementRequest **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ERequest_simpleElement,
- (Odr_fun)z_SimpleElement, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ERequest_compositeElement,
- (Odr_fun)z_CompositeElement, 0},
- {-1, -1, -1 -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ElementRequest *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Espec1(ODR o, Z_Espec1 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->elementSetNames,
- &(*p)->num_elementSetNames, 0) || odr_ok(o)) &&
- odr_implicit(o, odr_oid, &(*p)->defaultVariantSetId,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_Variant, &(*p)->defaultVariantRequest,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_integer, &(*p)->defaultTagType,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)z_ElementRequest, &(*p)->elements,
- &(*p)->num_elements, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_ESP_H
-#define PRT_ESP_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_OccurValues
-{
- int *start;
- int *howMany; /* OPTIONAL */
-} Z_OccurValues;
-
-typedef struct Z_Occurrences
-{
- int which;
-#define Z_Occurrences_all 0
-#define Z_Occurrences_last 1
-#define Z_Occurrences_values 2
- union
- {
- Odr_null *all;
- Odr_null *last;
- Z_OccurValues *values;
- } u;
-} Z_Occurrences;
-
-typedef struct Z_SpecificTag
-{
- Odr_oid *schemaId; /* OPTIONAL */
- int *tagType; /* OPTIONAL */
- Z_StringOrNumeric *tagValue;
- Z_Occurrences *occurrences; /* OPTIONAL */
-} Z_SpecificTag;
-
-typedef struct Z_ETagUnit
-{
- int which;
-#define Z_ETagUnit_specificTag 0
-#define Z_ETagUnit_wildThing 1
-#define Z_ETagUnit_wildPath 2
- union
- {
- Z_SpecificTag *specificTag;
- Z_Occurrences *wildThing;
- Odr_null *wildPath;
- } u;
-} Z_ETagUnit;
-
-typedef struct Z_ETagPath
-{
- int num_tags;
- Z_ETagUnit **tags;
-} Z_ETagPath;
-
-typedef struct Z_SimpleElement
-{
- Z_ETagPath *path;
- Z_Variant *variantRequest; /* OPTIONAL */
-} Z_SimpleElement;
-
-typedef struct Z_CompoPrimitives
-{
- int num_primitives;
- char **primitives;
-} Z_CompoPrimitives;
-
-typedef struct Z_CompoSpecs
-{
- int num_specs;
- Z_SimpleElement **specs;
-} Z_CompoSpecs;
-
-typedef struct Z_CompositeElement
-{
- int which;
-#define Z_CompoElement_primitives 0
-#define Z_CompoElement_specs 1
- union
- {
- Z_CompoPrimitives *primitives;
- Z_CompoSpecs *specs;
- } elementList;
- Z_ETagPath *deliveryTag;
- Z_Variant *variantRequest;
-} Z_CompositeElement;
-
-typedef struct Z_ElementRequest
-{
- int which;
-#define Z_ERequest_simpleElement 0
-#define Z_ERequest_compositeElement 1
- union
- {
- Z_SimpleElement *simpleElement;
- Z_CompositeElement *compositeElement;
- } u;
-} Z_ElementRequest;
-
-typedef struct Z_Espec1
-{
- int num_elementSetNames;
- char **elementSetNames; /* OPTIONAL */
- Odr_oid *defaultVariantSetId; /* OPTIONAL */
- Z_Variant *defaultVariantRequest; /* OPTIONAL */
- int *defaultTagType; /* OPTIONAL */
- int num_elements;
- Z_ElementRequest **elements; /* OPTIONAL */
-} Z_Espec1;
-
-YAZ_EXPORT int z_Espec1(ODR o, Z_Espec1 **p, int opt, const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-exd.c,v $
- * Revision 1.11 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.10 1999/05/26 13:49:12 adam
- * DB Update implemented in client (very basic).
- *
- * Revision 1.9 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.8 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.7 1998/02/10 15:31:46 adam
- * Implemented date and time structure. Changed the Update Extended
- * Service.
- *
- * Revision 1.6 1998/01/05 09:04:57 adam
- * Fixed bugs in encoders/decoders - Not operator (!) missing.
- *
- * Revision 1.5 1997/04/30 08:52:02 quinn
- * Null
- *
- * Revision 1.4 1996/10/10 12:35:12 quinn
- * Added Update extended service.
- *
- * Revision 1.3 1995/09/29 17:11:54 quinn
- * Smallish
- *
- * Revision 1.2 1995/09/27 15:02:41 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.1 1995/08/21 09:16:32 quinn
- * Added Extended services + Item Order
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_TaskPackage(ODR o, Z_TaskPackage **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->packageType, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->packageName,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->userId,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->retentionTime, ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_Permissions, &(*p)->permissions,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->description,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, odr_octetstring, &(*p)->targetReference,
- ODR_CONTEXT, 7, 0) &&
- odr_implicit(o, odr_generalizedtime, &(*p)->creationDateTime,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, odr_integer, &(*p)->taskStatus,
- ODR_CONTEXT, 9, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 10) &&
- (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->packageDiagnostics,
- &(*p)->num_packageDiagnostics, 0) || odr_ok(o)) &&
- odr_implicit(o, z_External, &(*p)->taskSpecificParameters,
- ODR_CONTEXT, 11, 0) &&
- odr_sequence_end(o);
-}
-
-/* ----------------------- ITEM ORDER --------------------- */
-
-int z_IOTargetPart(ODR o, Z_IOTargetPart **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_External, &(*p)->statusOrErrorReport, ODR_CONTEXT,
- 2, 0) &&
- odr_implicit(o, odr_integer, &(*p)->auxiliaryStatus, ODR_CONTEXT,
- 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IOResultSetItem(ODR o, Z_IOResultSetItem **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->resultSetId, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->item, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IOOriginPartNotToKeep(ODR o, Z_IOOriginPartNotToKeep **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_IOResultSetItem, &(*p)->resultSetItem, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IOContact(ODR o, Z_IOContact **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
- 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->phone, ODR_CONTEXT,
- 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->email, ODR_CONTEXT,
- 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IOCreditCardInfo(ODR o, Z_IOCreditCardInfo **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->nameOnCard, ODR_CONTEXT,
- 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->expirationDate,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->cardNumber, ODR_CONTEXT,
- 3, 0) &&
- odr_sequence_end(o);
-}
-
-int z_IOBilling(ODR o, Z_IOBilling **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_IOBilling_billInvoice,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IOBilling_prepay,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IOBilling_depositAccount,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IOBilling_creditCard,
- (Odr_fun)z_IOCreditCardInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_IOBilling_cardInfoPreviouslySupplied,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_IOBilling_privateKnown,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_IOBilling_privateNotKnown,
- (Odr_fun)z_External, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_constructed_begin(o, &(*p)->paymentMethod,
- ODR_CONTEXT, 1, 0) &&
- odr_choice(o, arm, &(*p)->paymentMethod, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_implicit(o, z_InternationalString, &(*p)->customerReference,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->customerPONumber,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IOOriginPartToKeep(ODR o, Z_IOOriginPartToKeep **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_External, &(*p)->supplDescription,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_IOContact, &(*p)->contact, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_IOBilling, &(*p)->addlBilling,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_IORequest(ODR o, Z_IORequest **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_IOOriginPartToKeep, &(*p)->toKeep,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_IOOriginPartNotToKeep, &(*p)->notToKeep,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_IOTaskPackage(ODR o, Z_IOTaskPackage **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_IOOriginPartToKeep, &(*p)->originPart,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_IOTargetPart, &(*p)->targetPart,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ItemOrder(ODR o, Z_ItemOrder **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ItemOrder_esRequest,
- (Odr_fun)z_IORequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ItemOrder_taskPackage,
- (Odr_fun)z_IOTaskPackage, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ItemOrder *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-/* ----------------------- ITEM UPDATE -------------------- */
-
-int z_IUSuppliedRecordsId (ODR o, Z_IUSuppliedRecordsId **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecordsId_timeStamp,
- odr_generalizedtime, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecordsId_versionNumber,
- z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecordsId_previousVersion,
- (Odr_fun)odr_external, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_IUCorrelationInfo (ODR o, Z_IUCorrelationInfo **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit (o, z_InternationalString,
- &(*p)->note, ODR_CONTEXT, 1, 1) &&
- odr_implicit (o, odr_integer,
- &(*p)->id, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end (o);
-}
-
-int z_IUSuppliedRecords_elem (ODR o, Z_IUSuppliedRecords_elem **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecords_number,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecords_string,
- (Odr_fun)z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecords_opaque,
- (Odr_fun)odr_octetstring, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
- odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end (o)) || odr_ok(o)) &&
- odr_explicit (o, z_IUSuppliedRecordsId,
- &(*p)->supplementalId, ODR_CONTEXT, 2, 1) &&
- odr_implicit (o, z_IUCorrelationInfo,
- &(*p)->correlationInfo, ODR_CONTEXT, 3, 1) &&
- odr_implicit (o, z_External,
- &(*p)->record, ODR_CONTEXT, 4, 0) &&
- odr_sequence_end (o);
-}
-
-int z_IUSuppliedRecords (ODR o, Z_IUSuppliedRecords **p, int opt,
- const char *name)
-{
- if (!odr_initmember (o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of (o, (Odr_fun)z_IUSuppliedRecords_elem, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_IUTaskPackageRecordStructure (ODR o, Z_IUTaskPackageRecordStructure **p,
- int opt, const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUTaskPackageRecordStructure_record,
- (Odr_fun)odr_external, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 2,
- Z_IUTaskPackageRecordStructure_surrogateDiagnostics,
- (Odr_fun)z_DiagRecs, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
- odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end (o)) || odr_ok(o)) &&
- odr_implicit (o, z_IUCorrelationInfo,
- &(*p)->correlationInfo, ODR_CONTEXT, 2, 1) &&
- odr_implicit (o, odr_integer,
- &(*p)->recordStatus, ODR_CONTEXT, 3, 0) &&
- odr_implicit (o, z_DiagRecs,
- &(*p)->supplementalDiagnostics, ODR_CONTEXT, 4, 1) &&
- odr_sequence_end (o);
-}
-
-int z_IUOriginPartToKeep (ODR o, Z_IUOriginPartToKeep **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit (o, odr_integer,
- &(*p)->action, ODR_CONTEXT, 1, 0) &&
- odr_implicit (o, z_InternationalString,
- &(*p)->databaseName, ODR_CONTEXT, 2, 0) &&
- odr_implicit (o, odr_oid,
- &(*p)->schema, ODR_CONTEXT, 3, 1) &&
- odr_implicit (o, z_InternationalString,
- &(*p)->elementSetName, ODR_CONTEXT, 4, 1) &&
- odr_implicit (o, odr_external,
- &(*p)->actionQualifier, ODR_CONTEXT, 5, 1) &&
- odr_sequence_end (o);
-}
-
-int z_IUTargetPart (ODR o, Z_IUTargetPart **p, int opt, const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit (o, odr_integer,
- &(*p)->updateStatus, ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag (o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->globalDiagnostics,
- &(*p)->num_globalDiagnostics, 0) || odr_ok(o)) &&
- odr_implicit_settag (o, ODR_CONTEXT, 3) &&
- odr_sequence_of(o, (Odr_fun)z_IUTaskPackageRecordStructure,
- &(*p)->taskPackageRecords,
- &(*p)->num_taskPackageRecords, 0) &&
- odr_sequence_end (o);
-}
-
-int z_IUUpdateEsRequest (ODR o, Z_IUUpdateEsRequest **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_explicit (o, z_IUOriginPartToKeep,
- &(*p)->toKeep, ODR_CONTEXT, 1, 0) &&
- odr_explicit (o, z_IUSuppliedRecords,
- &(*p)->notToKeep, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end (o);
-}
-
-int z_IUUpdateTaskPackage (ODR o, Z_IUUpdateTaskPackage **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_explicit (o, z_IUOriginPartToKeep,
- &(*p)->originPart, ODR_CONTEXT, 1, 0) &&
- odr_explicit (o, z_IUTargetPart,
- &(*p)->targetPart, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end (o);
-}
-
-int z_IUUpdate (ODR o, Z_IUUpdate **p, int opt, const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUUpdate_esRequest,
- (Odr_fun)z_IUUpdateEsRequest, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUUpdate_taskPackage,
- (Odr_fun)z_IUUpdateTaskPackage, 0},
- {-1, -1, -1, -1, 0, 0}
- };
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-1998, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_EXD_H
-#define PRT_EXD_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_TaskPackage
-{
- Odr_oid *packageType;
- char *packageName; /* OPTIONAL */
- char *userId; /* OPTIONAL */
- Z_IntUnit *retentionTime; /* OPTIONAL */
- Z_Permissions *permissions; /* OPTIONAL */
- char *description; /* OPTIONAL */
- Odr_oct *targetReference;
- char *creationDateTime; /* OPTIONAL */
- int *taskStatus;
-#define Z_TaskPackage_pending 0
-#define Z_TaskPackage_active 1
-#define Z_TaskPackage_complete 2
-#define Z_TaskPackage_aborted 3
- int num_packageDiagnostics;
- Z_DiagRec **packageDiagnostics; /* OPTIONAL */
- Z_External *taskSpecificParameters;
-} Z_TaskPackage;
-
-int z_TaskPackage(ODR o, Z_TaskPackage **p, int opt, const char *name);
-
-/* ----------------------- ITEM ORDER ------------------------- */
-
-typedef struct Z_IOTargetPart
-{
- Z_External *itemRequest; /* OPTIONAL */
- Z_External *statusOrErrorReport;
- int *auxiliaryStatus; /* OPTIONAL */
-#define Z_IOTargetPart_notReceived 1
-#define Z_IOTargetPart_loanQueue 2
-#define Z_IOTargetPart_forwarded 3
-#define Z_IOTargetPart_unfilledCopyright 4
-#define Z_IOTargetPart_filledCopyright 1
-} Z_IOTargetPart;
-
-typedef struct Z_IOResultSetItem
-{
- char *resultSetId;
- int *item;
-} Z_IOResultSetItem;
-
-typedef struct Z_IOOriginPartNotToKeep
-{
- Z_IOResultSetItem *resultSetItem; /* OPTIONAL */
- Z_External *itemRequest; /* OPTIONAL */
-} Z_IOOriginPartNotToKeep;
-
-typedef struct Z_IOContact
-{
- char *name; /* OPTIONAL */
- char *phone; /* OPTIONAL */
- char *email; /* OPTIONAL */
-} Z_IOContact;
-
-typedef struct Z_IOCreditCardInfo
-{
- char *nameOnCard;
- char *expirationDate;
- char *cardNumber;
-} Z_IOCreditCardInfo;
-
-typedef struct Z_IOBilling
-{
- int which;
-#define Z_IOBilling_billInvoice 0
-#define Z_IOBilling_prepay 1
-#define Z_IOBilling_depositAccount 2
-#define Z_IOBilling_creditCard 3
-#define Z_IOBilling_cardInfoPreviouslySupplied 4
-#define Z_IOBilling_privateKnown 5
-#define Z_IOBilling_privateNotKnown 6
- union
- {
- Odr_null *noinfo;
- Z_IOCreditCardInfo *creditCard;
- Z_External *privateNotKnown;
- } paymentMethod;
- char *customerReference; /* OPTIONAL */
- char *customerPONumber; /* OPTIONAL */
-} Z_IOBilling;
-
-typedef struct Z_IOOriginPartToKeep
-{
- Z_External *supplDescription; /* OPTIONAL */
- Z_IOContact *contact; /* OPTIONAL */
- Z_IOBilling *addlBilling; /* OPTIONAL */
-} Z_IOOriginPartToKeep;
-
-typedef struct Z_IORequest
-{
- Z_IOOriginPartToKeep *toKeep; /* OPTIONAL */
- Z_IOOriginPartNotToKeep *notToKeep;
-} Z_IORequest;
-
-typedef struct Z_IOTaskPackage
-{
- Z_IOOriginPartToKeep *originPart; /* OPTIONAL */
- Z_IOTargetPart *targetPart;
-} Z_IOTaskPackage;
-
-typedef struct Z_ItemOrder
-{
- int which;
-#define Z_ItemOrder_esRequest 0
-#define Z_ItemOrder_taskPackage 1
- union
- {
- Z_IORequest *esRequest;
- Z_IOTaskPackage *taskPackage;
- } u;
-} Z_ItemOrder;
-
-int z_ItemOrder(ODR o, Z_ItemOrder **p, int opt, const char *name);
-
-/* ----------------------- ITEM UPDATE ------------------------ */
-
-typedef struct Z_IUSuppliedRecordsId
-{
- int which;
-#define Z_IUSuppliedRecordsId_timeStamp 1
-#define Z_IUSuppliedRecordsId_versionNumber 2
-#define Z_IUSuppliedRecordsId_previousVersion 3
- union {
- char *timeStamp;
- char *versionNumber;
- Odr_external *previousVersion;
- } u;
-} Z_IUSuppliedRecordsId;
-
-typedef struct Z_IUCorrelationInfo
-{
- char *note; /* OPTIONAL */
- int *id; /* OPTIONAL */
-} Z_IUCorrelationInfo;
-
-typedef struct Z_IUSuppliedRecords_elem
-{
- int which;
-#define Z_IUSuppliedRecords_number 1
-#define Z_IUSuppliedRecords_string 2
-#define Z_IUSuppliedRecords_opaque 3
- union {
- int *number;
- char *string;
- Odr_oct *opaque;
- } u; /* OPTIONAL */
- Z_IUSuppliedRecordsId *supplementalId; /* OPTIONAL */
- Z_IUCorrelationInfo *correlationInfo; /* OPTIONAL */
- Z_External *record;
-} Z_IUSuppliedRecords_elem;
-
-typedef struct Z_IUSuppliedRecords
-{
- int num;
- Z_IUSuppliedRecords_elem **elements;
-} Z_IUSuppliedRecords;
-
-typedef struct Z_IUOriginPartToKeep
-{
- int *action;
-#define Z_IUOriginPartToKeep_recordInsert 1
-#define Z_IUOriginPartToKeep_recordReplace 2
-#define Z_IUOriginPartToKeep_recordDelete 3
-#define Z_IUOriginPartToKeep_elementUpdate 4
-#define Z_IUOriginPartToKeep_specialUpdate 5
- char *databaseName;
- Odr_oid *schema; /* OPTIONAL */
- char *elementSetName; /* OPTIONAL */
- Odr_external *actionQualifier; /* OPTIONAL */
-} Z_IUOriginPartToKeep;
-
-typedef struct Z_IUTaskPackageRecordStructure
-{
- int which;
-#define Z_IUTaskPackageRecordStructure_record 1
-#define Z_IUTaskPackageRecordStructure_surrogateDiagnostics 2
- union {
- Odr_external *record;
- Z_DiagRecs *surrogateDiagnostics;
- } u; /* OPTIONAL */
- Z_IUCorrelationInfo *correlationInfo; /* OPTIONAL */
- int *recordStatus;
-#define Z_IUTaskPackageRecordStructureS_success 1
-#define Z_IUTaskPackageRecordStructureS_queued 2
-#define Z_IUTaskPackageRecordStructureS_inProcess 3
-#define Z_IUTaskPackageRecordStructureS_failure 4
- Z_DiagRecs *supplementalDiagnostics; /* OPTIONAL */
-} Z_IUTaskPackageRecordStructure;
-
-typedef struct Z_IUTargetPart
-{
- int *updateStatus;
-#define Z_IUTargetPart_success 1
-#define Z_IUTargetPart_partial 2
-#define Z_IUTargetPart_failure 3
- int num_globalDiagnostics;
- Z_DiagRec **globalDiagnostics; /* OPTIONAL */
- int num_taskPackageRecords;
- Z_IUTaskPackageRecordStructure **taskPackageRecords;
-} Z_IUTargetPart;
-
-typedef struct Z_IUUpdateEsRequest
-{
- Z_IUOriginPartToKeep *toKeep;
- Z_IUSuppliedRecords *notToKeep;
-} Z_IUUpdateEsRequest;
-
-typedef struct Z_IUUpdateTaskPackage
-{
- Z_IUOriginPartToKeep *originPart;
- Z_IUTargetPart *targetPart;
-} Z_IUUpdateTaskPackage;
-
-typedef struct Z_IUUpdate
-{
- int which;
-#define Z_IUUpdate_esRequest 1
-#define Z_IUUpdate_taskPackage 2
- union {
- Z_IUUpdateEsRequest *esRequest;
- Z_IUUpdateTaskPackage *taskPackage;
- } u;
-} Z_IUUpdate;
-
-YAZ_EXPORT int z_IUUpdate(ODR o, Z_IUUpdate **p, int opt, const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-exp.c,v $
- * Revision 1.13 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.12 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.11 1999/03/18 12:57:13 adam
- * Fixed bug in TargetInfo encoder/decoder.
- *
- * Revision 1.10 1998/05/18 13:06:52 adam
- * Changed the way attribute sets are handled by the retriaval module.
- * Extended Explain conversion / schema.
- * Modified server and client to work with ASN.1 compiled protocol handlers.
- *
- * Revision 1.9 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.8 1996/01/02 11:46:41 quinn
- * Changed 'operator' to 'roperator' to avoid C++ conflict.
- *
- * Revision 1.7 1995/12/14 16:28:07 quinn
- * More explain stuff.
- *
- * Revision 1.6 1995/12/14 11:09:09 quinn
- * Fixed bug in tagging.
- *
- * Revision 1.5 1995/12/05 11:15:50 quinn
- * Work.
- *
- * Revision 1.4 1995/09/29 17:11:54 quinn
- * Smallish
- *
- * Revision 1.3 1995/09/27 15:02:42 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.2 1995/08/15 11:59:43 quinn
- * Updated External
- *
- * Revision 1.1 1995/08/10 08:54:02 quinn
- * Added Explain
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_LanguageCode(ODR o, char **p, int opt, const char *name);
-int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt, const char *name);
-int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt, const char *name);
-int z_HumanString(ODR o, Z_HumanString **p, int opt, const char *name);
-int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt, const char *name);
-int z_IconObject(ODR o, Z_IconObject **p, int opt, const char *name);
-int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt, const char *name);
-int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt,
- const char *name);
-int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt,
- const char *name);
-int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt,
- const char *name);
-int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt, const char *name);
-int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt, const char *name);
-int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt,
- const char *name);
-int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt,
- const char *name);
-int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt,
- const char *name);
-int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt, const char *name);
-int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt,
- const char *name);
-int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt,
- const char *name);
-int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt, const char *name);
-int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt,
- const char *name);
-int z_SearchKey(ODR o, Z_SearchKey **p, int opt, const char *name);
-int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt,
- const char *name);
-int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt,
- const char *name);
-int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt,
- const char *name);
-int z_Costs(ODR o, Z_Costs **p, int opt, const char *name);
-int z_Charge(ODR o, Z_Charge **p, int opt, const char *name);
-int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt, const char *name);
-int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt,
- const char *name);
-int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt,
- const char *name);
-int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt,
- const char *name);
-int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt,
- const char *name);
-int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt, const char *name);
-int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt, const char *name);
-int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt, const char *name);
-int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt, const char *name);
-int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt, const char *name);
-int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt, const char *name);
-int z_PathUnit(ODR o, Z_PathUnit **p, int opt, const char *name);
-int z_Path(ODR o, Z_Path **p, int opt, const char *name);
-int z_ElementInfoList(ODR o, Z_Path **p, int opt, const char *name);
-int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt, const char *name);
-int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt,
- const char *name);
-int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt, const char *name);
-int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt,
- const char *name);
-int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt,
- const char *name);
-int z_AttributeType(ODR o, Z_AttributeType **p, int opt, const char *name);
-int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt,
- const char *name);
-int z_TermListElement(ODR o, Z_TermListElement **p, int opt, const char *name);
-int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt, const char *name);
-int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt,
- const char *name);
-int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt,
- const char *name);
-int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt,
- const char *name);
-int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt,
- const char *name);
-int z_OmittedAttributeInterpretation(ODR o,
- Z_OmittedAttributeInterpretation **p,
- int opt, const char *name);
-int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt, const char *name);
-int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt, const char *name);
-int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt,
- const char *name);
-int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt,
- const char *name);
-int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt,
- const char *name);
-int z_RecordTag(ODR o, Z_RecordTag **p, int opt, const char *name);
-int z_SortDetails(ODR o, Z_SortDetails **p, int opt, const char *name);
-int z_SortKeyDetails(ODR o, Z_SortKeyDetails **p, int opt, const char *name);
-int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt,
- const char *name);
-int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt, const char *name);
-int z_VariantClass(ODR o, Z_VariantClass **p, int opt, const char *name);
-int z_VariantType(ODR o, Z_VariantType **p, int opt, const char *name);
-int z_VariantValue(ODR o, Z_VariantValue **p, int opt, const char *name);
-int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt,
- const char *name);
-int z_ValueSet(ODR o, Z_ValueSet **p, int opt, const char *name);
-int z_ValueRange(ODR o, Z_ValueRange **p, int opt, const char *name);
-int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt,
- const char *name);
-int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt, const char *name);
-int z_UnitType(ODR o, Z_UnitType **p, int opt, const char *name);
-int z_Units(ODR o, Z_Units **p, int opt, const char *name);
-int z_CategoryList(ODR o, Z_CategoryList **p, int opt, const char *name);
-int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt, const char *name);
-int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt, const char *name);
-
-int z_LanguageCode(ODR o, char **p, int opt, const char *name)
-{
- return z_InternationalString(o, p, opt, 0);
-}
-
-int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_generalizedtime, &(*p)->dateAdded,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_generalizedtime, &(*p)->dateChanged,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_generalizedtime, &(*p)->expiry,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_LanguageCode, &(*p)->humanStringLanguage,
- ODR_CONTEXT, 3, 1) &&
- z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_LanguageCode, &(*p)->language, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->text, ODR_CONTEXT,
- 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_HumanString(ODR o, Z_HumanString **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_HumanStringUnit, &(*p)->strings,
- &(*p)->num_strings, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IconObjectUnit_ianaType,
- z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IconObjectUnit_z3950type,
- z_InternationalString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IconObjectUnit_otherType,
- z_InternationalString, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_constructed_begin(o, &(*p)->bodyType, ODR_CONTEXT, 1, 0) &&
- odr_choice(o, arm, &(*p)->bodyType, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_implicit(o, odr_octetstring, &(*p)->content, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_IconObject(ODR o, Z_IconObject **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_IconObjectUnit, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->address,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->email,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->phone,
- ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, z_InternationalString, &(*p)->hostAddress,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, odr_integer, &(*p)->port, ODR_CONTEXT, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, z_InternationalString, &(*p)->pSel,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->sSel,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->tSel,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->nSap,
- ODR_CONTEXT, 3, 0) &&
- odr_sequence_end(o);
-}
-
-int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, z_InternationalString, &(*p)->type,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->address,
- ODR_CONTEXT, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_NetworkAddress_iA,
- (Odr_fun)z_NetworkAddressIA, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_NetworkAddress_oPA,
- (Odr_fun)z_NetworkAddressOPA, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_NetworkAddress_other,
- (Odr_fun)z_NetworkAddressOther, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 0) &&
- (odr_sequence_of(o, (Odr_fun)z_QueryTypeDetails,
- &(*p)->queryTypesSupported,
- &(*p)->num_queryTypesSupported, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->diagnosticsSets,
- &(*p)->num_diagnosticsSets, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->attributeSetIds,
- &(*p)->num_attributeSetIds, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->schemas,
- &(*p)->num_schemas, 0) ||
- odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 4) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->recordSyntaxes,
- &(*p)->num_recordSyntaxes, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->resourceChallenges,
- &(*p)->num_resourceChallenges, 0) || odr_ok(o)) &&
- odr_implicit(o, z_AccessRestrictions, &(*p)->restrictedAccess,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, z_Costs, &(*p)->costInfo, ODR_CONTEXT, 8, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 9) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->variantSets,
- &(*p)->num_variantSets, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 10) &&
- (odr_sequence_of(o, (Odr_fun)z_ElementSetName, &(*p)->elementSetNames,
- &(*p)->num_elementSetNames, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 11) &&
- (odr_sequence_of(o, (Odr_fun)z_InternationalString, &(*p)->unitSystems,
- &(*p)->num_unitSystems, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
- (Odr_fun)z_PrivateCapabilities, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
- (Odr_fun)z_RpnCapabilities, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
- (Odr_fun)z_Iso8777Capabilities, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_QueryTypeDetails_z39_58,
- (Odr_fun)z_HumanString, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_QueryTypeDetails_erpn,
- (Odr_fun)z_RpnCapabilities, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_QueryTypeDetails_rankedList,
- (Odr_fun)z_HumanString, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->roperator,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 0) &&
- (odr_sequence_of(o, (Odr_fun)z_PrivateCapOperator, &(*p)->operators,
- &(*p)->num_operators, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun)z_SearchKey, &(*p)->searchKeys,
- &(*p)->num_searchKeys, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_HumanString, &(*p)->description,
- &(*p)->num_description, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 0) &&
- (odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->operators,
- &(*p)->num_operators, 0) || odr_ok(o)) &&
- odr_implicit(o, odr_bool, &(*p)->resultSetAsOperandSupported,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_bool, &(*p)->restrictionOperandSupported,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_ProximitySupport, &(*p)->proximity, ODR_CONTEXT,
- 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 0) &&
- odr_sequence_of(o, (Odr_fun)z_SearchKey, &(*p)->searchKeys,
- &(*p)->num_searchKeys, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->restrictions, ODR_CONTEXT,
- 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->unit, ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxSupportUnit_known,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxSupportUnit_private,
- (Odr_fun)z_ProxSupportPrivate, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_bool, &(*p)->anySupport, ODR_CONTEXT, 0, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun)z_ProxSupportUnit, &(*p)->unitsSupported,
- &(*p)->num_unitsSupported, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_SearchKey(ODR o, Z_SearchKey **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->searchKey,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, odr_integer, &(*p)->accessType, ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->accessText, ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->accessChallenges,
- &(*p)->num_accessChallenges, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt,
- const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_AccessRestrictionsUnit, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_HumanString, &(*p)->forWhat, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_Charge, &(*p)->charge, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Costs(ODR o, Z_Costs **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_Charge, &(*p)->connectCharge, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_Charge, &(*p)->connectTime, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_Charge, &(*p)->displayCharge, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_Charge, &(*p)->searchCharge, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_Charge, &(*p)->subscriptCharge, ODR_CONTEXT, 4, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)z_CostsOtherCharge, &(*p)->otherCharges,
- &(*p)->num_otherCharges, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_Charge(ODR o, Z_Charge **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_IntUnit, &(*p)->cost, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_Unit, &(*p)->perWhat, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->text, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, z_DatabaseName, &(*p)->databases,
- &(*p)->num_databases, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->defaultAttributeSet,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- odr_sequence_of(o, (Odr_fun)z_AttributeCombination,
- &(*p)->legalCombinations,
- &(*p)->num_legalCombinations, 0) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt,
- const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_AttributeOccurrence, &(*p)->occurrences,
- &(*p)->num_occurrences, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt,
- const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->attributes,
- &(*p)->num_attributes, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AttributeOcc_any_or_none,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AttributeOcc_specific,
- (Odr_fun)z_AttributeValueList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_integer, &(*p)->attributeType,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_null, &(*p)->mustBeSupplied, ODR_CONTEXT, 2, 1) &&
- odr_choice(o, arm, &(*p)->attributeValues, &(*p)->which, 0) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_StringOrNumeric, &(*p)->value, ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->subAttributes,
- &(*p)->num_subAttributes, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->superAttributes,
- &(*p)->num_superAttributes, 0) || odr_ok(o)) &&
- odr_implicit(o, odr_null, &(*p)->partialSupport, ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-
-
-int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->recentNews,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_IconObject, &(*p)->icon,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_bool, &(*p)->namedResultSets,
- ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, odr_bool, &(*p)->multipleDBsearch,
- ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, odr_integer, &(*p)->maxResultSets,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxResultSize,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxTerms,
- ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->timeoutInterval,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->welcomeMessage,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, z_ContactInfo, &(*p)->contactInfo,
- ODR_CONTEXT, 11, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 12, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 13) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
- &(*p)->num_nicknames, 0) || odr_ok(o)) &&
- odr_implicit(o, z_HumanString, &(*p)->usageRest,
- ODR_CONTEXT, 14, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->paymentAddr,
- ODR_CONTEXT, 15, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 16, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 17) &&
- (odr_sequence_of(o, (Odr_fun)z_DatabaseList, &(*p)->dbCombinations,
- &(*p)->num_dbCombinations, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 18) &&
- (odr_sequence_of(o, (Odr_fun)z_NetworkAddress, &(*p)->addresses,
- &(*p)->num_addresses, 0) || odr_ok(o)) &&
- odr_implicit_settag (o, ODR_CONTEXT, 101) &&
- (odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->languages,
- &(*p)->num_languages, 0) || odr_ok(o)) &&
- odr_implicit(o, z_AccessInfo, &(*p)->commonAccessInfo,
- ODR_CONTEXT, 19, 1) &&
- odr_sequence_end(o);
-}
-
-int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_DatabaseInfo_actualNumber,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DatabaseInfo_approxNumber,
- (Odr_fun)odr_integer, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->name, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_null, &(*p)->explainDatabase, ODR_CONTEXT, 2, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, z_DatabaseName, &(*p)->nicknames,
- &(*p)->num_nicknames, 0) || odr_ok(o)) &&
- odr_implicit(o, z_IconObject, &(*p)->icon, ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_bool, &(*p)->userFee, ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 6, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->titleString,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 8) &&
- (odr_sequence_of(o, (Odr_fun)z_HumanString, &(*p)->keywords,
- &(*p)->num_keywords, 0) || odr_ok(o)) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_DatabaseList, &(*p)->associatedDbs,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, z_DatabaseList, &(*p)->subDbs, ODR_CONTEXT, 11, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->disclaimers,
- ODR_CONTEXT, 12, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->news, ODR_CONTEXT, 13, 1) &&
- ((odr_constructed_begin(o, &(*p)->u.actualNumber,
- ODR_CONTEXT, 14, 0) &&
- odr_choice(o, arm, &(*p)->u.actualNumber, &(*p)->which, 0) &&
- odr_constructed_end(o)) || odr_ok(o)) &&
- odr_implicit(o, z_HumanString, &(*p)->defaultOrder,
- ODR_CONTEXT, 15, 1) &&
- odr_implicit(o, odr_integer, &(*p)->avRecordSize,
- ODR_CONTEXT, 16, 1) &&
- odr_implicit(o, odr_integer, &(*p)->maxRecordSize,
- ODR_CONTEXT, 17, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 18, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->bestTime, ODR_CONTEXT, 19, 1) &&
- odr_implicit(o, odr_generalizedtime, &(*p)->lastUpdate,
- ODR_CONTEXT, 20, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->updateInterval,
- ODR_CONTEXT, 21, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->coverage, ODR_CONTEXT, 22, 1) &&
- odr_implicit(o, odr_bool, &(*p)->proprietary, ODR_CONTEXT, 23, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->copyrightText,
- ODR_CONTEXT, 24, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->copyrightNotice,
- ODR_CONTEXT, 25, 1) &&
- odr_implicit(o, z_ContactInfo, &(*p)->producerContactInfo,
- ODR_CONTEXT, 26, 1) &&
- odr_implicit(o, z_ContactInfo, &(*p)->supplierContactInfo,
- ODR_CONTEXT, 27, 1) &&
- odr_implicit(o, z_ContactInfo, &(*p)->submissionContactInfo,
- ODR_CONTEXT, 28, 1) &&
- odr_implicit(o, z_AccessInfo, &(*p)->accessInfo, ODR_CONTEXT, 29, 1) &&
- odr_sequence_end(o);
-}
-
-int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_null, &(*p)->defaultTagType, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
- 2, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 4) &&
- (odr_sequence_of(o, (Odr_fun)z_TagTypeMapping, &(*p)->tagTypeMapping,
- &(*p)->num_tagTypeMapping, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)z_ElementInfo, &(*p)->recordStructure,
- &(*p)->num_recordStructure, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->elementName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_Path, &(*p)->elementTagPath, ODR_CONTEXT, 2, 0) &&
- odr_explicit(o, z_ElementDataType, &(*p)->dataType,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 6, 1) &&
- odr_sequence_end(o);
-}
-
-int z_PathUnit(ODR o, Z_PathUnit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 0) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Path(ODR o, Z_Path **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- odr_implicit_settag(o, ODR_CONTEXT, 201);
- if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ElementInfoList(ODR o, Z_Path **p, int opt, const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- odr_implicit_settag(o, ODR_CONTEXT, 201);
- if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementDataType_primitive,
- (Odr_fun)odr_integer, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementDataType_structured,
- (Odr_fun)z_ElementInfoList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt;
- return
- odr_implicit(o, z_InternationalString, &(*p)->elementname,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
- &(*p)->num_nicknames, 0) || odr_ok(o)) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->elementTag,
- ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 5, 1) &&
- z_OtherInformation(o, &(*p)->otherTagInfo, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 4) &&
- (odr_sequence_of(o, (Odr_fun)z_TagSetInfoElements, &(*p)->elements,
- &(*p)->num_elements, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->transferSyntaxes,
- &(*p)->num_transferSyntaxes, 0) || odr_ok(o)) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->asn1Module,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, (Odr_fun)z_ElementInfo, &(*p)->abstractStructure,
- &(*p)->num_abstractStructure, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_AttributeType, &(*p)->attributes,
- &(*p)->num_attributes, 0) || odr_ok(o)) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeType(ODR o, Z_AttributeType **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->attributeType,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- odr_sequence_of(o, (Odr_fun)z_AttributeDescription,
- &(*p)->attributeValues,
- &(*p)->num_attributeValues, 0) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->attributeValue,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_StringOrNumeric,
- &(*p)->equivalentAttributes,
- &(*p)->num_equivalentAttributes, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_TermListElement(ODR o, Z_TermListElement **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->title, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_integer, &(*p)->searchCost, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_bool, &(*p)->scanable, ODR_CONTEXT, 4, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->broader,
- &(*p)->num_broader, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->narrower,
- &(*p)->num_narrower, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_TermListElement, &(*p)->termLists,
- &(*p)->num_termLists, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->type, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_bool, &(*p)->privateType, ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_bool, &(*p)->restrictionsApply,
- ODR_CONTEXT, 5, 0) &&
- odr_implicit(o, odr_bool, &(*p)->feeApply, ODR_CONTEXT, 6, 0) &&
- odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 7, 0) &&
- odr_implicit(o, odr_bool, &(*p)->retentionSupported,
- ODR_CONTEXT, 8, 0) &&
- odr_implicit(o, odr_integer, &(*p)->waitAction, ODR_CONTEXT, 9, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 10, 1) &&
- odr_implicit(o, z_External, &(*p)->specificExplain,
- ODR_CONTEXT, 11, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->esASN,
- ODR_CONTEXT, 12, 1) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_AttributeSetDetails,
- &(*p)->attributesBySet,
- &(*p)->num_attributesBySet, 0) && odr_ok(o)) &&
- odr_implicit(o, z_AttributeCombinations, &(*p)->attributeCombinations,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->attributeSet,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- odr_sequence_of(o, (Odr_fun)z_AttributeTypeDetails,
- &(*p)->attributesByType,
- &(*p)->num_attributesByType, 0) &&
- odr_sequence_end(o);
-}
-
-int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->attributeType,
- ODR_CONTEXT, 0, 0) &&
- odr_implicit(o, z_OmittedAttributeInterpretation,
- &(*p)->defaultIfOmitted,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_AttributeValue, &(*p)->attributeValues,
- &(*p)->num_attributeValues, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_OmittedAttributeInterpretation(ODR o,
- Z_OmittedAttributeInterpretation **p,
- int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_StringOrNumeric, &(*p)->defaultValue,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->defaultDescription,
- ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->maxStepSize, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->collatingSequence,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_bool, &(*p)->increasing, ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->termListName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_AttributeCombinations, &(*p)->attributes,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_EScanInfo, &(*p)->scanInfo, ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_integer, &(*p)->estNumberTerms,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, (Odr_fun)z_Term, &(*p)->sampleTerms,
- &(*p)->num_sampleTerms, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_ElementSetName, &(*p)->elementSetName,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 6) &&
- (odr_sequence_of(o, (Odr_fun)z_PerElementDetails,
- &(*p)->detailsPerElement,
- &(*p)->num_detailsPerElement, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)z_PerElementDetails,
- &(*p)->detailsPerElement,
- &(*p)->num_detailsPerElement, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_RecordTag, &(*p)->recordTag, ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_Path, &(*p)->schemaTags,
- &(*p)->num_schemaTags, 0) ||
- odr_ok(o)) &&
- odr_implicit(o, odr_integer, &(*p)->maxSize, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_integer, &(*p)->minSize, ODR_CONTEXT, 4, 1) &&
- odr_implicit(o, odr_integer, &(*p)->avgSize, ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, odr_integer, &(*p)->fixedSize, ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 8, 0) &&
- odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 9, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 12, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->contents, ODR_CONTEXT, 13, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->billingInfo,
- ODR_CONTEXT, 14, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->restrictions,
- ODR_CONTEXT, 15, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 16) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->alternateNames,
- &(*p)->num_alternateNames, 0) || odr_ok(o)) &&
- odr_implicit_settag(o, ODR_CONTEXT, 17) &&
- (odr_sequence_of(o, z_InternationalString, &(*p)->genericNames,
- &(*p)->num_genericNames, 0) || odr_ok(o)) &&
- odr_implicit(o, z_AttributeCombinations, &(*p)->searchAccess,
- ODR_CONTEXT, 18, 1) &&
- odr_sequence_end(o);
-}
-
-int z_RecordTag(ODR o, Z_RecordTag **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_StringOrNumeric, &(*p)->qualifier,
- ODR_CONTEXT, 0, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
- ODR_CONTEXT, 1, 0) &&
- odr_sequence_end(o);
-}
-
-int z_SortDetails(ODR o, Z_SortDetails **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- (odr_sequence_of(o, (Odr_fun)z_SortKeyDetails, &(*p)->sortKeys,
- &(*p)->num_sortKeys, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_SortKeyDetails (ODR o, Z_SortKeyDetails **p, int opt, const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetails_character,
- (Odr_fun) odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKeyDetails_numeric,
- (Odr_fun) odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKeyDetails_structured,
- (Odr_fun) z_HumanString, 0},
- {-1, -1, -1, -1, (Odr_fun) 0, 0}
- };
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_implicit (o, z_HumanString,
- &(*p)->description, ODR_CONTEXT, 0, 1) &&
- odr_implicit_settag (o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun) z_Specification,
- &(*p)->elementSpecifications,
- &(*p)->num_elementSpecifications, 0) || odr_ok(o)) &&
- odr_implicit (o, z_AttributeCombinations,
- &(*p)->attributeSpecifications, ODR_CONTEXT, 2, 1) &&
- ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 3, 0) &&
- odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_constructed_end (o)) || odr_ok(o)) &&
- odr_implicit (o, odr_integer,
- &(*p)->caseSensitivity, ODR_CONTEXT, 4, 1) &&
- odr_sequence_end (o);
-}
-
-int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->processingContext,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 3, 0) &&
- odr_implicit(o, odr_oid, &(*p)->oid, ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, z_External, &(*p)->instructions, ODR_CONTEXT, 6, 1) &&
- odr_sequence_end(o);
-}
-
-int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_oid, &(*p)->variantSet, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_VariantClass, &(*p)->variants,
- &(*p)->num_variants, 0) || odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_VariantClass(ODR o, Z_VariantClass **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->variantClass, ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- odr_sequence_of(o, (Odr_fun)z_VariantType, &(*p)->variantTypes,
- &(*p)->num_variantTypes, 0) &&
- odr_sequence_end(o);
-}
-
-int z_VariantType(ODR o, Z_VariantType **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, odr_integer, &(*p)->variantType,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, z_VariantValue, &(*p)->variantValue,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_VariantValue(ODR o, Z_VariantValue **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 0, 0) &&
- odr_explicit(o, z_ValueSet, &(*p)->values, ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt,
- const char *name)
-{
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_sequence_of(o, (Odr_fun)z_ValueDescription, &(*p)->elements,
- &(*p)->num, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ValueSet(ODR o, Z_ValueSet **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ValueSet_range,
- (Odr_fun)z_ValueRange, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueSet_enumerated,
- (Odr_fun)z_ValueSetEnumerated, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ValueRange(ODR o, Z_ValueRange **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_ValueDescription, &(*p)->lower, ODR_CONTEXT, 0, 1) &&
- odr_explicit(o, z_ValueDescription, &(*p)->upper, ODR_CONTEXT, 1, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt,
- const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_NONE, -1, -1, Z_ValueDescription_integer,
- (Odr_fun)odr_integer, 0},
- {ODR_NONE, -1, -1, Z_ValueDescription_string,
- (Odr_fun)z_InternationalString, 0},
- {ODR_NONE, -1, -1, Z_ValueDescription_octets,
- (Odr_fun)odr_octetstring, 0},
- {ODR_NONE, -1, -1, Z_ValueDescription_oid,
- (Odr_fun)odr_oid, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueDescription_unit,
- (Odr_fun)z_Unit, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ValueDescription_valueAndUnit,
- (Odr_fun)z_IntUnit, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->unitSystem,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_UnitType, &(*p)->units,
- &(*p)->num_units, 0) ||
- odr_ok(o)) &&
- odr_sequence_end(o);
-}
-
-int z_UnitType(ODR o, Z_UnitType **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->unitType,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- odr_sequence_of(o, (Odr_fun)z_Units, &(*p)->units,
- &(*p)->num_units, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Units(ODR o, Z_Units **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->name,
- ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->unit,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_CategoryList(ODR o, Z_CategoryList **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- odr_sequence_of(o, (Odr_fun)z_CategoryInfo, &(*p)->categories,
- &(*p)->num_categories, 0) &&
- odr_sequence_end(o);
-}
-
-int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_InternationalString, &(*p)->category,
- ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->originalCategory,
- ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, z_HumanString, &(*p)->description,
- ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, z_InternationalString, &(*p)->asn1Module,
- ODR_CONTEXT, 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Explain_targetInfo,
- (Odr_fun)z_TargetInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Explain_databaseInfo,
- (Odr_fun)z_DatabaseInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Explain_schemaInfo,
- (Odr_fun)z_SchemaInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Explain_tagSetInfo,
- (Odr_fun)z_TagSetInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Explain_recordSyntaxInfo,
- (Odr_fun)z_RecordSyntaxInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Explain_attributeSetInfo,
- (Odr_fun)z_AttributeSetInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_Explain_termListInfo,
- (Odr_fun)z_TermListInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Explain_extendedServicesInfo,
- (Odr_fun)z_ExtendedServicesInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Explain_attributeDetails,
- (Odr_fun)z_AttributeDetails, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 9, Z_Explain_termListDetails,
- (Odr_fun)z_TermListDetails, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 10, Z_Explain_elementSetDetails,
- (Odr_fun)z_ElementSetDetails, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 11, Z_Explain_retrievalRecordDetails,
- (Odr_fun)z_RetrievalRecordDetails, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 12, Z_Explain_sortDetails,
- (Odr_fun)z_SortDetails, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 13, Z_Explain_processing,
- (Odr_fun)z_ProcessingInformation, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 14, Z_Explain_variants,
- (Odr_fun)z_VariantSetInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 15, Z_Explain_units,
- (Odr_fun)z_UnitInfo, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 100, Z_Explain_categoryList,
- (Odr_fun)z_CategoryList, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_initmember(o, p, sizeof(**p)))
- return opt && odr_ok(o);
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-1998, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_EXP_H
-#define PRT_EXP_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct Z_CommonInfo
-{
- char *dateAdded; /* OPTIONAL */
- char *dateChanged; /* OPTIONAL */
- char *expiry; /* OPTIONAL */
- char *humanStringLanguage; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_CommonInfo;
-
-typedef struct Z_HumanStringUnit
-{
- char *language; /* OPTIONAL */
- char *text;
-} Z_HumanStringUnit;
-
-typedef struct Z_HumanString
-{
- int num_strings;
- Z_HumanStringUnit **strings;
-} Z_HumanString;
-
-typedef struct Z_IconObjectUnit
-{
- int which;
-#define Z_IconObjectUnit_ianaType 0
-#define Z_IconObjectUnit_z3950type 1
-#define Z_IconObjectUnit_otherType 2
- char *bodyType;
- Odr_oct *content;
-} Z_IconObjectUnit;
-
-typedef struct Z_IconObject
-{
- int num;
- Z_IconObjectUnit **elements;
-} Z_IconObject;
-
-typedef struct Z_ContactInfo
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- Z_HumanString *address; /* OPTIONAL */
- char *email; /* OPTIONAL */
- char *phone; /* OPTIONAL */
-} Z_ContactInfo;
-
-typedef struct Z_NetworkAddressIA
-{
- char *hostAddress;
- int *port;
-} Z_NetworkAddressIA;
-
-typedef struct Z_NetworkAddressOPA
-{
- char *pSel;
- char *sSel; /* OPTIONAL */
- char *tSel; /* OPTIONAL */
- char *nSap;
-} Z_NetworkAddressOPA;
-
-typedef struct Z_NetworkAddressOther
-{
- char *type;
- char *address;
-} Z_NetworkAddressOther;
-
-typedef struct Z_NetworkAddress
-{
- int which;
-#define Z_NetworkAddress_iA 0
-#define Z_NetworkAddress_oPA 1
-#define Z_NetworkAddress_other 2
- union
- {
- Z_NetworkAddressIA *internetAddress;
- Z_NetworkAddressOPA *osiPresentationAddress;
- Z_NetworkAddressOther *other;
- } u;
-} Z_NetworkAddress;
-
-typedef struct Z_PrivateCapOperator
-{
- char *roperator;
- Z_HumanString *description; /* OPTIONAL */
-} Z_PrivateCapOperator;
-
-typedef struct Z_SearchKey
-{
- char *searchKey;
- Z_HumanString *description; /* OPTIONAL */
-} Z_SearchKey;
-
-typedef struct Z_PrivateCapabilities
-{
- int num_operators;
- Z_PrivateCapOperator **operators; /* OPTIONAL */
- int num_searchKeys;
- Z_SearchKey **searchKeys; /* OPTIONAL */
- int num_description;
- Z_HumanString **description; /* OPTIONAL */
-} Z_PrivateCapabilities;
-
-typedef struct Z_ProxSupportPrivate
-{
- int *unit;
- Z_HumanString *description; /* OPTIONAL */
-} Z_ProxSupportPrivate;
-
-typedef struct Z_ProxSupportUnit
-{
- int which;
-#define Z_ProxSupportUnit_known 0
-#define Z_ProxSupportUnit_private 1
- union
- {
- int *known;
- Z_ProxSupportPrivate *zprivate;
- } u;
-} Z_ProxSupportUnit;
-
-typedef struct Z_ProximitySupport
-{
- bool_t *anySupport;
- int num_unitsSupported;
- Z_ProxSupportUnit **unitsSupported; /* OPTIONAL */
-} Z_ProximitySupport;
-
-typedef struct Z_RpnCapabilities
-{
- int num_operators;
- int **operators; /* OPTIONAL */
- bool_t *resultSetAsOperandSupported;
- bool_t *restrictionOperandSupported;
- Z_ProximitySupport *proximity; /* OPTIONAL */
-} Z_RpnCapabilities;
-
-typedef struct Z_Iso8777Capabilities
-{
- int num_searchKeys;
- Z_SearchKey **searchKeys;
- Z_HumanString *restrictions; /* OPTIONAL */
-} Z_Iso8777Capabilities;
-
-typedef struct Z_QueryTypeDetails
-{
- int which;
-#define Z_QueryTypeDetails_private 0
-#define Z_QueryTypeDetails_rpn 1
-#define Z_QueryTypeDetails_iso8777 2
-#define Z_QueryTypeDetails_z39_58 3
-#define Z_QueryTypeDetails_erpn 4
-#define Z_QueryTypeDetails_rankedList 5
- union
- {
- Z_PrivateCapabilities *zprivate;
- Z_RpnCapabilities *rpn;
- Z_Iso8777Capabilities *iso8777;
- Z_HumanString *z3958;
- Z_RpnCapabilities *erpn;
- Z_HumanString *rankedList;
- } u;
-} Z_QueryTypeDetails;
-
-typedef struct Z_AccessRestrictionsUnit
-{
- int *accessType;
-#define Z_AccessRestrictionsUnit_any 0
-#define Z_AccessRestrictionsUnit_search 1
-#define Z_AccessRestrictionsUnit_present 2
-#define Z_AccessRestrictionsUnit_specific_elements 3
-#define Z_AccessRestrictionsUnit_extended_services 4
-#define Z_AccessRestrictionsUnit_by_database 5
- Z_HumanString *accessText; /* OPTIONAL */
- int num_accessChallenges;
- Odr_oid **accessChallenges; /* OPTIONAL */
-} Z_AccessRestrictionsUnit;
-
-typedef struct Z_AccessRestrictions
-{
- int num;
- Z_AccessRestrictionsUnit **elements;
-} Z_AccessRestrictions;
-
-typedef struct Z_Charge
-{
- Z_IntUnit *cost;
- Z_Unit *perWhat; /* OPTIONAL */
- Z_HumanString *text; /* OPTIONAL */
-} Z_Charge;
-
-typedef struct Z_CostsOtherCharge
-{
- Z_HumanString *forWhat;
- Z_Charge *charge;
-} Z_CostsOtherCharge;
-
-typedef struct Z_Costs
-{
- Z_Charge *connectCharge; /* OPTIONAL */
- Z_Charge *connectTime; /* OPTIONAL */
- Z_Charge *displayCharge; /* OPTIONAL */
- Z_Charge *searchCharge; /* OPTIONAL */
- Z_Charge *subscriptCharge; /* OPTIONAL */
- int num_otherCharges;
- Z_CostsOtherCharge **otherCharges; /* OPTIONAL */
-} Z_Costs;
-
-typedef struct Z_AccessInfo
-{
- int num_queryTypesSupported;
- Z_QueryTypeDetails **queryTypesSupported; /* OPTIONAL */
- int num_diagnosticsSets;
- Odr_oid **diagnosticsSets; /* OPTIONAL */
- int num_attributeSetIds;
- Odr_oid **attributeSetIds; /* OPTIONAL */
- int num_schemas;
- Odr_oid **schemas; /* OPTIONAL */
- int num_recordSyntaxes;
- Odr_oid **recordSyntaxes; /* OPTIONAL */
- int num_resourceChallenges;
- Odr_oid **resourceChallenges; /* OPTIONAL */
- Z_AccessRestrictions *restrictedAccess; /* OPTIONAL */
- Z_Costs *costInfo; /* OPTIONAL */
- int num_variantSets;
- Odr_oid **variantSets; /* OPTIONAL */
- int num_elementSetNames;
- char **elementSetNames; /* OPTIONAL */
- int num_unitSystems;
- char **unitSystems; /* OPTIONAL */
-} Z_AccessInfo;
-
-typedef struct Z_DatabaseList
-{
- int num_databases;
- Z_DatabaseName **databases;
-} Z_DatabaseList;
-
-typedef struct Z_AttributeValueList
-{
- int num_attributes;
- Z_StringOrNumeric **attributes;
-} Z_AttributeValueList;
-
-typedef struct Z_AttributeOccurrence
-{
- Odr_oid *attributeSet; /* OPTIONAL */
- int *attributeType;
- Odr_null *mustBeSupplied; /* OPTIONAL */
- int which;
-#define Z_AttributeOcc_any_or_none 0
-#define Z_AttributeOcc_specific 1
- union
- {
- Odr_null *any_or_none;
- Z_AttributeValueList *specific;
- } attributeValues;
-} Z_AttributeOccurrence;
-
-typedef struct Z_AttributeCombination
-{
- int num_occurrences;
- Z_AttributeOccurrence **occurrences;
-} Z_AttributeCombination;
-
-typedef struct Z_AttributeCombinations
-{
- Odr_oid *defaultAttributeSet;
- int num_legalCombinations;
- Z_AttributeCombination **legalCombinations;
-} Z_AttributeCombinations;
-
-typedef struct Z_AttributeValue
-{
- Z_StringOrNumeric *value;
- Z_HumanString *description; /* OPTIONAL */
- int num_subAttributes;
- Z_StringOrNumeric **subAttributes; /* OPTIONAL */
- int num_superAttributes;
- Z_StringOrNumeric **superAttributes; /* OPTIONAL */
- Odr_null *partialSupport; /* OPTIONAL */
-} Z_AttributeValue;
-
-typedef struct Z_TargetInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * key elements
- */
- char *name;
- /*
- * non-key brief elements
- */
- Z_HumanString *recentNews; /* OPTIONAL */
- Z_IconObject *icon; /* OPTIONAL */
- bool_t *namedResultSets;
- bool_t *multipleDBsearch;
- int *maxResultSets; /* OPTIONAL */
- int *maxResultSize; /* OPTIONAL */
- int *maxTerms; /* OPTIONAL */
- Z_IntUnit *timeoutInterval; /* OPTIONAL */
- Z_HumanString *welcomeMessage; /* OPTIONAL */
- /*
- * non-brief elements
- */
- Z_ContactInfo *contactInfo; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- int num_nicknames;
- char **nicknames;
- Z_HumanString *usageRest; /* OPTIONAL */
- Z_HumanString *paymentAddr; /* OPTIONAL */
- Z_HumanString *hours; /* OPTIONAL */
- int num_dbCombinations;
- Z_DatabaseList **dbCombinations; /* OPTIONAL */
- int num_addresses;
- Z_NetworkAddress **addresses; /* OPTIONAL */
- int num_languages;
- char **languages; /* OPTIONAL */
-
- Z_AccessInfo *commonAccessInfo; /* OPTIONAL */
-} Z_TargetInfo;
-
-typedef struct Z_DatabaseInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *name;
- /*
- * Non-key elements.
- */
- Odr_null *explainDatabase; /* OPTIONAL */
- int num_nicknames;
- Z_DatabaseName **nicknames; /* OPTIONAL */
- Z_IconObject *icon; /* OPTIONAL */
- bool_t *userFee;
- bool_t *available;
- Z_HumanString *titleString; /* OPTIONAL */
- /*
- * Non-brief elements.
- */
- int num_keywords;
- Z_HumanString **keywords; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- Z_DatabaseList *associatedDbs; /* OPTIONAL */
- Z_DatabaseList *subDbs; /* OPTIONAL */
- Z_HumanString *disclaimers; /* OPTIONAL */
- Z_HumanString *news; /* OPTIONAL */
-
-#if 1
- int which;
- union {
- int *actualNumber;
- int *approxNumber;
-#define Z_DatabaseInfo_actualNumber 1
-#define Z_DatabaseInfo_approxNumber 2
- } u; /* OPT */
-
-#else
- int recordCount_which;
-#define Z_DatabaseInfo_actualNumber 0
-#define Z_DatabaseInfo_approxNumber 1
- int *recordCount; /* OPTIONAL */
-#endif
- Z_HumanString *defaultOrder; /* OPTIONAL */
- int *avRecordSize; /* OPTIONAL */
- int *maxRecordSize; /* OPTIONAL */
- Z_HumanString *hours; /* OPTIONAL */
- Z_HumanString *bestTime; /* OPTIONAL */
- char *lastUpdate; /* OPTIONAL */
- Z_IntUnit *updateInterval; /* OPTIONAL */
- Z_HumanString *coverage; /* OPTIONAL */
- bool_t *proprietary; /* OPTIONAL */
- Z_HumanString *copyrightText; /* OPTIONAL */
- Z_HumanString *copyrightNotice; /* OPTIONAL */
- Z_ContactInfo *producerContactInfo; /* OPTIONAL */
- Z_ContactInfo *supplierContactInfo; /* OPTIONAL */
- Z_ContactInfo *submissionContactInfo; /* OPTIONAL */
- Z_AccessInfo *accessInfo; /* OPTIONAL */
-} Z_DatabaseInfo;
-
-typedef struct Z_TagTypeMapping
-{
- int *tagType;
- Odr_oid *tagSet; /* OPTIONAL */
- Odr_null *defaultTagType; /* OPTIONAL */
-} Z_TagTypeMapping;
-
-typedef struct Z_PathUnit
-{
- int *tagType;
- Z_StringOrNumeric *tagValue;
-} Z_PathUnit;
-
-typedef struct Z_Path
-{
- int num;
- Z_PathUnit **list;
-} Z_Path;
-
-struct Z_ElementDataType;
-typedef struct Z_ElementDataType Z_ElementDataType;
-
-typedef struct Z_ElementInfo
-{
- char *elementName;
- Z_Path *elementTagPath;
- Z_ElementDataType *dataType; /* OPTIONAL */
- bool_t *required;
- bool_t *repeatable;
- Z_HumanString *description; /* OPTIONAL */
-} Z_ElementInfo;
-
-typedef struct Z_ElementInfoList
-{
- int num;
- Z_ElementInfo **list;
-} Z_ElementInfoList;
-
-struct Z_ElementDataType
-{
- int which;
-#define Z_ElementDataType_primitive 0
-#define Z_ElementDataType_structured 1
- union
- {
- int *primitive;
-#define Z_PrimitiveDataType_octetString 0
-#define Z_PrimitiveDataType_numeric 1
-#define Z_PrimitiveDataType_date 2
-#define Z_PrimitiveDataType_external 3
-#define Z_PrimitiveDataType_string 4
-#define Z_PrimitiveDataType_trueOrFalse 5
-#define Z_PrimitiveDataType_oid 6
-#define Z_PrimitiveDataType_intUnit 7
-#define Z_PrimitiveDataType_empty 8
-#define Z_PrimitiveDataType_noneOfTheAbove 100
- Z_ElementInfoList *structured;
- } u;
-};
-
-typedef struct Z_TagSetInfoElements
-{
- char *elementname;
- int num_nicknames;
- char **nicknames; /* OPTIONAL */
- Z_StringOrNumeric *elementTag;
- Z_HumanString *description; /* OPTIONAL */
- int *dataType; /* OPTIONAL */
- /* (value as in Z_PrimitiveElement) */
- Z_OtherInformation *otherTagInfo; /* OPTIONAL */
-} Z_TagSetInfoElements;
-
-typedef struct Z_SchemaInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *schema;
- /*
- * Non-key elements
- */
- char *name;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- int num_tagTypeMapping;
- Z_TagTypeMapping **tagTypeMapping; /* OPTIONAL */
- int num_recordStructure;
- Z_ElementInfo **recordStructure; /* OPTIONAL */
-} Z_SchemaInfo;
-
-
-typedef struct Z_TagSetInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *tagSet;
- /*
- * Non-key elements
- */
- char *name;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- int num_elements;
- Z_TagSetInfoElements **elements; /* OPTIONAL */
-} Z_TagSetInfo;
-
-typedef struct Z_RecordSyntaxInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *recordSyntax;
- /*
- * Non-key elements
- */
- char *name;
- /*
- * Non-brief elements
- */
- int num_transferSyntaxes;
- Odr_oid **transferSyntaxes; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- char *asn1Module; /* OPTIONAL */
- int num_abstractStructure;
- Z_ElementInfo **abstractStructure; /* OPTIONAL */
-} Z_RecordSyntaxInfo;
-
-typedef struct Z_AttributeDescription
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- Z_StringOrNumeric *attributeValue;
- int num_equivalentAttributes;
- Z_StringOrNumeric **equivalentAttributes; /* OPTIONAL */
-} Z_AttributeDescription;
-
-typedef struct Z_AttributeType
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- int *attributeType;
- int num_attributeValues;
- Z_AttributeDescription **attributeValues;
-} Z_AttributeType;
-
-typedef struct Z_AttributeSetInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *attributeSet;
- /*
- * Non-key elements
- */
- char *name;
- /*
- * Non-brief elements
- */
- int num_attributes;
- Z_AttributeType **attributes; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
-} Z_AttributeSetInfo;
-
-typedef struct Z_TermListElement
-{
- char *name;
- Z_HumanString *title; /* OPTIONAL */
- int *searchCost; /* OPTIONAL */
-#define Z_TermListElement_optimized 0
-#define Z_TermListElement_normal 1
-#define Z_TermListElement_expensive 2
-#define Z_TermListElement_filter 3
- bool_t *scanable;
- int num_broader;
- char **broader; /* OPTIONAL */
- int num_narrower;
- char **narrower; /* OPTIONAL */
-} Z_TermListElement;
-
-typedef struct Z_TermListInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *databaseName;
- /*
- * Non-key elements
- */
- int num_termLists;
- Z_TermListElement **termLists;
-} Z_TermListInfo;
-
-typedef struct Z_ExtendedServicesInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *type;
- /*
- * Non-key elements
- */
- char *name; /* OPTIONAL */
- bool_t *privateType;
- bool_t *restrictionsApply;
- bool_t *feeApply;
- bool_t *available;
- bool_t *retentionSupported;
- int *waitAction;
-#define Z_ExtendedServicesInfo_waitSupported 1
-#define Z_ExtendedServicesInfo_waitAlways 2
-#define Z_ExtendedServicesInfo_waitNotSupported 3
-#define Z_ExtendedServicesInfo_depends 4
-#define Z_ExtendedServicesInfo_notSaying 5
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- Z_External *specificExplain; /* OPTIONAL */
- char *esASN; /* OPTIONAL */
-} Z_ExtendedServicesInfo;
-
-typedef struct Z_OmittedAttributeInterpretation
-{
- Z_StringOrNumeric *defaultValue; /* OPTIONAL */
- Z_HumanString *defaultDescription; /* OPTIONAL */
-} Z_OmittedAttributeInterpretation;
-
-typedef struct Z_AttributeTypeDetails
-{
- int *attributeType;
- Z_OmittedAttributeInterpretation *defaultIfOmitted; /* OPTIONAL */
- int num_attributeValues;
- Z_AttributeValue **attributeValues; /* OPTIONAL */
-} Z_AttributeTypeDetails;
-
-typedef struct Z_AttributeSetDetails
-{
- Odr_oid *attributeSet;
- int num_attributesByType;
- Z_AttributeTypeDetails **attributesByType;
-} Z_AttributeSetDetails;
-
-typedef struct Z_AttributeDetails
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key details
- */
- Z_DatabaseName *databaseName;
- /*
- * Non-brief elements
- */
- int num_attributesBySet;
- Z_AttributeSetDetails **attributesBySet; /* OPTIONAL */
- Z_AttributeCombinations *attributeCombinations; /* OPTIONAL */
-} Z_AttributeDetails;
-
-typedef struct Z_EScanInfo
-{
- int *maxStepSize; /* OPTIONAL */
- Z_HumanString *collatingSequence; /* OPTIONAL */
- bool_t *increasing; /* OPTIONAL */
-} Z_EScanInfo;
-
-typedef struct Z_TermListDetails
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- char *termListName;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- Z_AttributeCombinations *attributes; /* OPTIONAL */
- Z_EScanInfo *scanInfo; /* OPTIONAL */
- int *estNumberTerms; /* OPTIONAL */
- int num_sampleTerms;
- Z_Term **sampleTerms; /* OPTIONAL */
-} Z_TermListDetails;
-
-typedef struct Z_RecordTag
-{
- Z_StringOrNumeric *qualifier; /* OPTIONAL */
- Z_StringOrNumeric *tagValue;
-} Z_RecordTag;
-
-typedef struct Z_PerElementDetails
-{
- char *name; /* OPTIONAL */
- Z_RecordTag *recordTag; /* OPTIONAL */
- int num_schemaTags;
- Z_Path **schemaTags; /* OPTIONAL */
- int *maxSize; /* OPTIONAL */
- int *minSize; /* OPTIONAL */
- int *avgSize; /* OPTIONAL */
- int *fixedSize; /* OPTIONAL */
- bool_t *repeatable;
- bool_t *required;
- Z_HumanString *description; /* OPTIONAL */
- Z_HumanString *contents; /* OPTIONAL */
- Z_HumanString *billingInfo; /* OPTIONAL */
- Z_HumanString *restrictions; /* OPTIONAL */
- int num_alternateNames;
- char **alternateNames; /* OPTIONAL */
- int num_genericNames;
- char **genericNames; /* OPTIONAL */
- Z_AttributeCombinations *searchAccess; /* OPTIONAL */
-} Z_PerElementDetails;
-
-typedef struct Z_ElementSetDetails
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *databaseName;
- char *elementSetName;
- Odr_oid *recordSyntax;
- /*
- * Brief elements
- */
- Odr_oid *schema;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- int num_detailsPerElement;
- Z_PerElementDetails **detailsPerElement; /* OPTIONAL */
-} Z_ElementSetDetails;
-
-typedef struct Z_RetrievalRecordDetails
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *databaseName;
- Odr_oid *schema;
- Odr_oid *recordSyntax;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- int num_detailsPerElement;
- Z_PerElementDetails **detailsPerElement; /* OPTIONAL */
-} Z_RetrievalRecordDetails;
-
-typedef struct Z_SortKeyDetails
-{
- Z_HumanString *description; /* OPTIONAL */
- int num_elementSpecifications;
- Z_Specification **elementSpecifications; /* OPTIONAL */
- Z_AttributeCombinations *attributeSpecifications; /* OPTIONAL */
- int which;
-#define Z_SortKeyDetails_character 0
-#define Z_SortKeyDetails_numeric 1
-#define Z_SortKeyDetails_structured 2
- union
- {
- Odr_null *character;
- Odr_null *numeric;
- Z_HumanString *structured;
- } u;
- int *caseSensitivity; /* OPTIONAL */
-#define Z_SortKeyDetails_always 0
-#define Z_SortKeyDetails_never 1
-#define Z_SortKeyDetails_default_yes 2
-#define Z_SortKeyDetails_default_no 3
-} Z_SortKeyDetails;
-
-typedef struct Z_SortDetails
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *databaseName;
- /*
- * Non-brief elements
- */
- int num_sortKeys;
- Z_SortKeyDetails **sortKeys; /* OPTIONAL */
-} Z_SortDetails;
-
-typedef struct Z_ProcessingInformation
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Z_DatabaseName *databaseName;
- int *processingContext;
-#define Z_ProcessingInformation_access 0
-#define Z_ProcessingInformation_search 1
-#define Z_ProcessingInformation_retrieval 2
-#define Z_ProcessingInformation_record_presentation 3
-#define Z_ProcessingInformation_record_handling 4
- char *name;
- Odr_oid *oid;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- Z_External *instructions; /* OPTIONAL */
-} Z_ProcessingInformation;
-
-typedef struct Z_ValueDescription
-{
- int which;
-#define Z_ValueDescription_integer 0
-#define Z_ValueDescription_string 1
-#define Z_ValueDescription_octets 2
-#define Z_ValueDescription_oid 3
-#define Z_ValueDescription_unit 4
-#define Z_ValueDescription_valueAndUnit 5
- union
- {
- int *integer;
- char *string;
- Odr_oct *octets;
- Odr_oid *oid;
- Z_Unit *unit;
- Z_IntUnit *valueAndUnit;
- } u;
-} Z_ValueDescription;
-
-typedef struct Z_ValueRange
-{
- Z_ValueDescription *lower; /* OPTIONAL */
- Z_ValueDescription *upper; /* OPTIONAL */
-} Z_ValueRange;
-
-typedef struct Z_ValueSetEnumerated
-{
- int num;
- Z_ValueDescription **elements;
-} Z_ValueSetEnumerated;
-
-typedef struct Z_ValueSet
-{
- int which;
-#define Z_ValueSet_range 0
-#define Z_ValueSet_enumerated 1
- union
- {
- Z_ValueRange *range;
- Z_ValueSetEnumerated *enumerated;
- } u;
-} Z_ValueSet;
-
-typedef struct Z_VariantValue
-{
- int *dataType;
- Z_ValueSet *values; /* OPTIONAL */
-} Z_VariantValue;
-
-typedef struct Z_VariantType
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- int *variantType;
- Z_VariantValue *variantValue; /* OPTIONAL */
-} Z_VariantType;
-
-typedef struct Z_VariantClass
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- int *variantClass;
- int num_variantTypes;
- Z_VariantType **variantTypes;
-} Z_VariantClass;
-
-typedef struct Z_VariantSetInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- Odr_oid *variantSet;
- /*
- * Brief elements
- */
- char *name;
- /*
- * Non-brief elements
- */
- int num_variants;
- Z_VariantClass **variants; /* OPTIONAL */
-} Z_VariantSetInfo;
-
-typedef struct Z_Units
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- Z_StringOrNumeric *unit;
-} Z_Units;
-
-typedef struct Z_UnitType
-{
- char *name; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- Z_StringOrNumeric *unitType;
- int num_units;
- Z_Units **units;
-} Z_UnitType;
-
-typedef struct Z_UnitInfo
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- /*
- * Key elements
- */
- char *unitSystem;
- /*
- * Non-brief elements
- */
- Z_HumanString *description; /* OPTIONAL */
- int num_units;
- Z_UnitType **units; /* OPTIONAL */
-} Z_UnitInfo;
-
-typedef struct Z_CategoryInfo
-{
- char *category;
- char *originalCategory; /* OPTIONAL */
- Z_HumanString *description; /* OPTIONAL */
- char *asn1Module; /* OPTIONAL */
-} Z_CategoryInfo;
-
-typedef struct Z_CategoryList
-{
- Z_CommonInfo *commonInfo; /* OPTIONAL */
- int num_categories;
- Z_CategoryInfo **categories;
-} Z_CategoryList;
-
-typedef struct Z_ExplainRecord
-{
- int which;
-#define Z_Explain_targetInfo 0
-#define Z_Explain_databaseInfo 1
-#define Z_Explain_schemaInfo 2
-#define Z_Explain_tagSetInfo 3
-#define Z_Explain_recordSyntaxInfo 4
-#define Z_Explain_attributeSetInfo 5
-#define Z_Explain_termListInfo 6
-#define Z_Explain_extendedServicesInfo 7
-#define Z_Explain_attributeDetails 8
-#define Z_Explain_termListDetails 9
-#define Z_Explain_elementSetDetails 10
-#define Z_Explain_retrievalRecordDetails 11
-#define Z_Explain_sortDetails 12
-#define Z_Explain_processing 13
-#define Z_Explain_variants 14
-#define Z_Explain_units 15
-#define Z_Explain_categoryList 16
- union
- {
- Z_TargetInfo *targetInfo;
- Z_DatabaseInfo *databaseInfo;
- Z_SchemaInfo *schemaInfo;
- Z_TagSetInfo *tagSetInfo;
- Z_RecordSyntaxInfo *recordSyntaxInfo;
- Z_AttributeSetInfo *attributeSetInfo;
- Z_TermListInfo *termListInfo;
- Z_ExtendedServicesInfo *extendedServicesInfo;
- Z_AttributeDetails *attributeDetails;
- Z_TermListDetails *termListDetails;
- Z_ElementSetDetails *elementSetDetails;
- Z_RetrievalRecordDetails *retrievalRecordDetails;
- Z_SortDetails *sortDetails;
- Z_ProcessingInformation *processing;
- Z_VariantSetInfo *variants;
- Z_UnitInfo *units;
- Z_CategoryList *categoryList;
- } u;
-} Z_ExplainRecord;
-
-YAZ_EXPORT int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-/*
- * Biased-choice External for Z39.50.
- */
-
-#ifndef PRT_EXT_H
-#define PRT_EXT_H
-
-#include <yaz/yconfig.h>
-#include <yaz/oid.h>
-
-
-YAZ_BEGIN_CDECL
-
-/*
- * Used to keep track of known External definitions (a loose approach
- * to DEFINED_BY).
- */
-
-typedef struct Z_ext_typeent
-{
- oid_value dref; /* the direct-reference OID value. */
- int what; /* discriminator value for the external CHOICE */
- Odr_fun fun; /* decoder function */
-} Z_ext_typeent;
-
-struct Z_External
-{
- Odr_oid *direct_reference;
- int *indirect_reference;
- char *descriptor;
- int which;
-/* Generic types */
-#define Z_External_single 0
-#define Z_External_octet 1
-#define Z_External_arbitrary 2
-/* Specific types */
-#define Z_External_sutrs 3
-#define Z_External_explainRecord 4
-#define Z_External_resourceReport1 5
-#define Z_External_resourceReport2 6
-#define Z_External_promptObject1 7
-#define Z_External_grs1 8
-#define Z_External_extendedService 9
-#define Z_External_itemOrder 10
-#define Z_External_diag1 11
-#define Z_External_espec1 12
-#define Z_External_summary 13
-#define Z_External_OPAC 14
-#define Z_External_searchResult1 15
-#define Z_External_update 16
-#define Z_External_dateTime 17
-#define Z_External_universeReport 18
-#define Z_External_ESAdmin 19
- union
- {
- /* Generic types */
- Odr_any *single_ASN1_type;
- Odr_oct *octet_aligned;
- Odr_bitmask *arbitrary;
-
- /* Specific types */
- Z_SUTRS *sutrs;
- Z_ExplainRecord *explainRecord;
- Z_ResourceReport1 *resourceReport1;
- Z_ResourceReport2 *resourceReport2;
- Z_PromptObject1 *promptObject1;
- Z_GenericRecord *grs1;
- Z_TaskPackage *extendedService;
- Z_ItemOrder *itemOrder;
- Z_DiagnosticFormat *diag1;
- Z_Espec1 *espec1;
- Z_BriefBib *summary;
- Z_SearchInfoReport *searchResult1;
- Z_IUUpdate *update;
- Z_DateTime *dateTime;
- Z_UniverseReport *universeReport;
-#ifdef ASN_COMPILED
- Z_Admin *adminService;
-#endif
- } u;
-};
-
-
-YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
-YAZ_EXPORT Z_ext_typeent *z_ext_getentbyref(oid_value val);
-YAZ_EXPORT Z_External *z_ext_record(ODR o, int format, const char *buf,
- int len);
-
-YAZ_END_CDECL
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-grs.c,v $
- * Revision 1.9 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.8 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.7 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.6 1997/05/14 06:53:23 adam
- * C++ support.
- *
- * Revision 1.5 1995/10/18 16:12:20 quinn
- * Added a couple of special cases to handle the WAIS server.
- *
- * Revision 1.4 1995/09/29 17:11:55 quinn
- * Smallish
- *
- * Revision 1.3 1995/09/27 15:02:43 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.2 1995/08/28 10:58:58 quinn
- * Added extra choice-entry to data to catch visiblestring.
- *
- * Revision 1.1 1995/08/17 12:47:09 quinn
- * Added GRS-1.
- *
- *
- */
-
-#include <yaz/proto.h>
-
-int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt, const char *name);
-int z_ElementData(ODR o, Z_ElementData **p, int opt, const char *name);
-int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt, const char *name);
-int z_TagUnit(ODR o, Z_TagUnit **p, int opt, const char *name);
-int z_TagPath(ODR o, Z_TagPath **p, int opt, const char *name);
-int z_Order(ODR o, Z_Order **p, int opt, const char *name);
-int z_Usage(ODR o, Z_Usage **p, int opt, const char *name);
-int z_HitVector(ODR o, Z_HitVector **p, int opt, const char *name);
-int z_Triple(ODR o, Z_Triple **p, int opt, const char *name);
-int z_Variant(ODR o, Z_Variant **p, int opt, const char *name);
-
-int z_GenericRecord(ODR o, Z_GenericRecord **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_GenericRecord *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_TaggedElement, &(*p)->elements,
- &(*p)->num_elements, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->tagType,
- ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_integer, &(*p)->tagOccurrence,
- ODR_CONTEXT, 3, 1) &&
- odr_explicit(o, z_ElementData, &(*p)->content,
- ODR_CONTEXT, 4, 0) &&
- odr_implicit(o, z_ElementMetaData, &(*p)->metaData,
- ODR_CONTEXT, 5, 1) &&
- odr_implicit(o, z_Variant, &(*p)->appliedVariant, ODR_CONTEXT, 6, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ElementData(ODR o, Z_ElementData **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_NONE, -1, -1, Z_ElementData_octets,
- (Odr_fun)odr_octetstring, 0},
- {ODR_NONE, -1, -1, Z_ElementData_numeric,
- (Odr_fun)odr_integer, 0},
- {ODR_NONE, -1, -1, Z_ElementData_date,
- (Odr_fun)odr_generalizedtime, 0},
- {ODR_NONE, -1, -1, Z_ElementData_ext,
- (Odr_fun)z_External, 0},
- {ODR_NONE, -1, -1, Z_ElementData_string,
- (Odr_fun)z_InternationalString, 0},
- /* The entry below provides some backwards compatibility */
- {ODR_NONE, -1, -1, Z_ElementData_string,
- (Odr_fun)odr_visiblestring, 0},
- {ODR_NONE, -1, -1, Z_ElementData_trueOrFalse,
- (Odr_fun)odr_bool, 0},
- {ODR_NONE, -1, -1, Z_ElementData_oid,
- (Odr_fun)odr_oid, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementData_intUnit,
- (Odr_fun)z_IntUnit, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementData_elementNotThere,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ElementData_elementEmpty,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ElementData_noDataRequested,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ElementData_diagnostic,
- (Odr_fun)z_External, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_ElementData_subtree,
- (Odr_fun)z_GenericRecord, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (o->direction == ODR_DECODE)
- *p = (Z_ElementData *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, z_Order, &(*p)->seriesOrder, ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_Usage, &(*p)->usageRight, ODR_CONTEXT, 2, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 3) &&
- (odr_sequence_of(o, (Odr_fun)z_HitVector, &(*p)->hits,
- &(*p)->num_hits, 0) ||
- odr_ok(o)) &&
- odr_implicit(o, z_InternationalString, &(*p)->displayName,
- ODR_CONTEXT, 4, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 5) &&
- (odr_sequence_of(o, (Odr_fun)z_Variant, &(*p)->supportedVariants,
- &(*p)->num_supportedVariants, 0) || odr_ok(o)) &&
- odr_implicit(o, z_InternationalString, &(*p)->message,
- ODR_CONTEXT, 6, 1) &&
- odr_implicit(o, odr_octetstring, &(*p)->elementDescriptor,
- ODR_CONTEXT, 7, 1) &&
- odr_implicit(o, z_TagPath, &(*p)->surrogateFor, ODR_CONTEXT, 8, 1) &&
- odr_implicit(o, z_TagPath, &(*p)->surrogateElement,
- ODR_CONTEXT, 9, 1) &&
- odr_implicit(o, z_External, &(*p)->other, ODR_CONTEXT, 99, 1) &&
- odr_sequence_end(o);
-}
-
-int z_TagUnit(ODR o, Z_TagUnit **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
- odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
- ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_integer, &(*p)->tagOccurrence,
- ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_TagPath(ODR o, Z_TagPath **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE)
- *p = (Z_TagPath *)odr_malloc(o, sizeof(**p));
- else if (!*p)
- return opt;
- if (odr_sequence_of(o, (Odr_fun)z_TagUnit, &(*p)->tags,
- &(*p)->num_tags, 0))
- return 1;
- *p = 0;
- return opt && odr_ok(o);
-}
-
-int z_Order(ODR o, Z_Order **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_bool, &(*p)->ascending, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->order, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_Usage(ODR o, Z_Usage **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_InternationalString, &(*p)->restriction, ODR_CONTEXT,
- 2, 1) &&
- odr_sequence_end(o);
-}
-
-int z_HitVector(ODR o, Z_HitVector **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- z_Term(o, &(*p)->satisfier, 1, 0) &&
- odr_implicit(o, z_IntUnit, &(*p)->offsetIntoElement,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit(o, z_IntUnit, &(*p)->length, ODR_CONTEXT, 2, 1) &&
- odr_implicit(o, odr_integer, &(*p)->hitRank, ODR_CONTEXT, 3, 1) &&
- odr_implicit(o, odr_octetstring, &(*p)->targetToken, ODR_CONTEXT,
- 4, 1) &&
- odr_sequence_end(o);
-}
-
-int z_Triple(ODR o, Z_Triple **p, int opt, const char *name)
-{
- static Odr_arm arm[] =
- {
- {ODR_NONE, -1, -1, Z_Triple_integer,
- (Odr_fun)odr_integer, 0},
- {ODR_NONE, -1, -1, Z_Triple_internationalString,
- (Odr_fun)z_InternationalString, 0},
- /* The entry below provides some backwards compatibility */
- {ODR_NONE, -1, -1, Z_Triple_internationalString,
- (Odr_fun)odr_visiblestring, 0},
- {ODR_NONE, -1, -1, Z_Triple_octetString,
- (Odr_fun)odr_octetstring, 0},
- {ODR_NONE, -1, -1, Z_Triple_oid,
- (Odr_fun)odr_oid, 0},
- {ODR_NONE, -1, -1, Z_Triple_boolean,
- (Odr_fun)odr_bool, 0},
- {ODR_NONE, -1, -1, Z_Triple_null,
- (Odr_fun)odr_null, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Triple_unit,
- (Odr_fun)z_Unit, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Triple_valueAndUnit,
- (Odr_fun)z_IntUnit, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->variantSetId, ODR_CONTEXT, 0, 1) &&
- odr_implicit(o, odr_integer, &(*p)->zclass, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 0) &&
- odr_constructed_begin(o, &(*p)->value, ODR_CONTEXT, 3, 0) &&
- odr_choice(o, arm, &(*p)->value, &(*p)->which, 0) &&
- odr_constructed_end(o) &&
- odr_sequence_end(o);
-}
-
-int z_Variant(ODR o, Z_Variant **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_oid, &(*p)->globalVariantSetId,
- ODR_CONTEXT, 1, 1) &&
- odr_implicit_settag(o, ODR_CONTEXT, 2) &&
- odr_sequence_of(o, (Odr_fun)z_Triple, &(*p)->triples,
- &(*p)->num_triples, 0) &&
- odr_sequence_end(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-1998, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_GRS_H
-#define PRT_GRS_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct Z_GenericRecord;
-typedef struct Z_GenericRecord Z_GenericRecord;
-
-typedef struct Z_ElementData
-{
- int which;
-#define Z_ElementData_octets 0
-#define Z_ElementData_numeric 1
-#define Z_ElementData_date 2
-#define Z_ElementData_ext 3
-#define Z_ElementData_string 4
-#define Z_ElementData_trueOrFalse 5
-#define Z_ElementData_oid 6
-#define Z_ElementData_intUnit 7
-#define Z_ElementData_elementNotThere 8
-#define Z_ElementData_elementEmpty 9
-#define Z_ElementData_noDataRequested 10
-#define Z_ElementData_diagnostic 11
-#define Z_ElementData_subtree 12
- union
- {
- Odr_oct *octets;
- int *numeric;
- char *date;
- Z_External *ext;
- char *string;
- bool_t *trueOrFalse;
- Odr_oid *oid;
- Z_IntUnit *intUnit;
- Odr_null *elementNotThere;
- Odr_null *elementEmpty;
- Odr_null *noDataRequested;
- Z_External *diagnostic;
- Z_GenericRecord *subtree;
- } u;
-} Z_ElementData;
-
-typedef struct Z_Order
-{
- bool_t *ascending;
- int *order;
-} Z_Order;
-
-typedef struct Z_Usage
-{
- int *type;
-#define Z_Usage_redistributable 1
-#define Z_Usage_restricted 2
-#define Z_Usage_licensePointer 3
- char *restriction; /* OPTIONAL */
-} Z_Usage;
-
-typedef struct Z_HitVector
-{
- Z_Term *satisfier; /* OPTIONAL */
- Z_IntUnit *offsetIntoElement; /* OPTIONAL */
- Z_IntUnit *length; /* OPTIONAL */
- int *hitRank; /* OPTIONAL */
- Odr_oct *targetToken; /* OPTIONAL */
-} Z_HitVector;
-
-typedef struct Z_Triple
-{
- Odr_oid *variantSetId; /* OPTIONAL */
- int *zclass;
- int *type;
- int which;
-#define Z_Triple_integer 0
-#define Z_Triple_internationalString 1
-#define Z_Triple_octetString 2
-#define Z_Triple_oid 3
-#define Z_Triple_boolean 4
-#define Z_Triple_null 5
-#define Z_Triple_unit 6
-#define Z_Triple_valueAndUnit 7
- union
- {
- int *integer;
- char *internationalString;
- Odr_oct *octetString;
- Odr_oid *oid;
- bool_t *zboolean;
- Odr_null *null;
- Z_Unit *unit;
- Z_IntUnit *valueAndUnit;
- } value;
-} Z_Triple;
-
-typedef struct Z_Variant
-{
- Odr_oid *globalVariantSetId; /* OPTIONAL */
- int num_triples;
- Z_Triple **triples;
-} Z_Variant;
-
-typedef struct Z_TagUnit
-{
- int *tagType; /* OPTIONAL */
- Z_StringOrNumeric *tagValue;
- int *tagOccurrence; /* OPTIONAL */
-} Z_TagUnit;
-
-typedef struct Z_TagPath
-{
- int num_tags;
- Z_TagUnit **tags;
-} Z_TagPath;
-
-typedef struct Z_ElementMetaData
-{
- Z_Order *seriesOrder; /* OPTIONAL */
- Z_Usage *usageRight; /* OPTIONAL */
- int num_hits;
- Z_HitVector **hits; /* OPTIONAL */
- char *displayName; /* OPTIONAL */
- int num_supportedVariants;
- Z_Variant **supportedVariants; /* OPTIONAL */
- char *message; /* OPTIONAL */
- Odr_oct *elementDescriptor; /* OPTIONAL */
- Z_TagPath *surrogateFor; /* OPTIONAL */
- Z_TagPath *surrogateElement; /* OPTIONAL */
- Z_External *other; /* OPTIONAL */
-} Z_ElementMetaData;
-
-typedef struct Z_TaggedElement
-{
- int *tagType; /* OPTIONAL */
- Z_StringOrNumeric *tagValue;
- int *tagOccurrence; /* OPTIONAL */
- Z_ElementData *content;
- Z_ElementMetaData *metaData; /* OPTIONAL */
- Z_Variant *appliedVariant; /* OPTIONAL */
-} Z_TaggedElement;
-
-struct Z_GenericRecord
-{
- int num_elements;
- Z_TaggedElement **elements;
-};
-
-YAZ_EXPORT int z_GenericRecord(ODR o, Z_GenericRecord **p, int opt,
- const char *name);
-YAZ_EXPORT int z_Variant(ODR o, Z_Variant **p, int opt,
- const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2001, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The name of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * $Id: prt-proto.h,v 1.3 2001-09-24 21:51:55 adam Exp $
- */
-
-#ifndef PRT_PROTO_H
-#define PRT_PROTO_H
-
-#include <yaz/yconfig.h>
-#include <yaz/odr.h>
-#include <yaz/oid.h>
-#include <yaz/yaz-version.h>
-
-YAZ_BEGIN_CDECL
-
-/* ----------------- GLOBAL AUXILIARY DEFS ----------------*/
-
-struct Z_External;
-typedef struct Z_External Z_External;
-
-typedef Odr_oct Z_ReferenceId;
-typedef char Z_DatabaseName;
-typedef char Z_ResultSetId;
-typedef Odr_oct Z_ResultsetId;
-
-typedef struct Z_InfoCategory
-{
- Odr_oid *categoryTypeId; /* OPTIONAL */
- int *categoryValue;
-} Z_InfoCategory;
-
-typedef struct Z_OtherInformationUnit
-{
- Z_InfoCategory *category; /* OPTIONAL */
- int which;
-#define Z_OtherInfo_characterInfo 0
-#define Z_OtherInfo_binaryInfo 1
-#define Z_OtherInfo_externallyDefinedInfo 2
-#define Z_OtherInfo_oid 3
- union
- {
- char *characterInfo;
- Odr_oct *binaryInfo;
- Z_External *externallyDefinedInfo;
- Odr_oid *oid;
- } information;
-} Z_OtherInformationUnit;
-
-typedef struct Z_OtherInformation
-{
- int num_elements;
- Z_OtherInformationUnit **list;
-} Z_OtherInformation;
-
-typedef struct Z_StringOrNumeric
-{
- int which;
-#define Z_StringOrNumeric_string 0
-#define Z_StringOrNumeric_numeric 1
- union
- {
- char *string;
- int *numeric;
- } u;
-} Z_StringOrNumeric;
-
-typedef struct Z_Unit
-{
- char *unitSystem; /* OPTIONAL */
- Z_StringOrNumeric *unitType; /* OPTIONAL */
- Z_StringOrNumeric *unit; /* OPTIONAL */
- int *scaleFactor; /* OPTIONAL */
-} Z_Unit;
-
-typedef struct Z_IntUnit
-{
- int *value;
- Z_Unit *unitUsed;
-} Z_IntUnit;
-
-typedef Odr_oct Z_SUTRS;
-
-typedef struct Z_StringList
-{
- int num_strings;
- char **strings;
-} Z_StringList;
-
-/* ----------------- INIT SERVICE ----------------*/
-
-typedef struct
-{
- char *groupId; /* OPTIONAL */
- char *userId; /* OPTIONAL */
- char *password; /* OPTIONAL */
-} Z_IdPass;
-
-typedef struct Z_IdAuthentication
-{
- int which;
-#define Z_IdAuthentication_open 0
-#define Z_IdAuthentication_idPass 1
-#define Z_IdAuthentication_anonymous 2
-#define Z_IdAuthentication_other 3
- union
- {
- char *open;
- Z_IdPass *idPass;
- Odr_null *anonymous;
- Z_External *other;
- } u;
-} Z_IdAuthentication;
-
-#define Z_ProtocolVersion_1 0
-#define Z_ProtocolVersion_2 1
-#define Z_ProtocolVersion_3 2
-
-#define Z_Options_search 0
-#define Z_Options_present 1
-#define Z_Options_delSet 2
-#define Z_Options_resourceReport 3
-#define Z_Options_triggerResourceCtrl 4
-#define Z_Options_resourceCtrl 5
-#define Z_Options_accessCtrl 6
-#define Z_Options_scan 7
-#define Z_Options_sort 8
-#define Z_Options_reserved 9
-#define Z_Options_extendedServices 10
-#define Z_Options_level_1Segmentation 11
-#define Z_Options_level_2Segmentation 12
-#define Z_Options_concurrentOperations 13
-#define Z_Options_namedResultSets 14
-
-typedef struct Z_InitRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- Odr_bitmask *protocolVersion;
- Odr_bitmask *options;
- int *preferredMessageSize;
- int *maximumRecordSize;
- Z_IdAuthentication* idAuthentication; /* OPTIONAL */
- char *implementationId; /* OPTIONAL */
- char *implementationName; /* OPTIONAL */
- char *implementationVersion; /* OPTIONAL */
- Z_External *userInformationField; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_InitRequest;
-
-typedef struct Z_InitResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- Odr_bitmask *protocolVersion;
- Odr_bitmask *options;
- int *preferredMessageSize;
- int *maximumRecordSize;
- bool_t *result;
- char *implementationId; /* OPTIONAL */
- char *implementationName; /* OPTIONAL */
- char *implementationVersion; /* OPTIONAL */
- Z_External *userInformationField; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_InitResponse;
-
-typedef struct Z_NSRAuthentication
-{
- char *user;
- char *password;
- char *account;
-} Z_NSRAuthentication;
-
-int z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt,
- const char *name);
-
-int z_StrAuthentication(ODR o, char **p, int opt, const char *name);
-
-/* ------------------ SEARCH SERVICE ----------------*/
-
-typedef struct Z_DatabaseSpecificUnit
-{
- char *databaseName;
- char *elementSetName;
-} Z_DatabaseSpecificUnit;
-
-typedef struct Z_DatabaseSpecific
-{
- int num_elements;
- Z_DatabaseSpecificUnit **elements;
-} Z_DatabaseSpecific;
-
-typedef struct Z_ElementSetNames
-{
- int which;
-#define Z_ElementSetNames_generic 0
-#define Z_ElementSetNames_databaseSpecific 1
- union
- {
- char *generic;
- Z_DatabaseSpecific *databaseSpecific;
- } u;
-} Z_ElementSetNames;
-
-/* ---------------------- RPN QUERY --------------------------- */
-
-typedef struct Z_ComplexAttribute
-{
- int num_list;
- Z_StringOrNumeric **list;
- int num_semanticAction;
- int **semanticAction; /* OPTIONAL */
-} Z_ComplexAttribute;
-
-typedef struct Z_AttributeElement
-{
- Odr_oid *attributeSet; /* OPTIONAL - v3 only */
- int *attributeType;
- int which;
-#define Z_AttributeValue_numeric 0
-#define Z_AttributeValue_complex 1
- union
- {
- int *numeric;
- Z_ComplexAttribute *complex;
- } value;
-} Z_AttributeElement;
-
-typedef struct Z_Term
-{
- int which;
-#define Z_Term_general 0
-#define Z_Term_numeric 1
-#define Z_Term_characterString 2
-#define Z_Term_oid 3
-#define Z_Term_dateTime 4
-#define Z_Term_external 5
-#define Z_Term_integerAndUnit 6
-#define Z_Term_null 7
- union
- {
- Odr_oct *general; /* this is required for v2 */
- int *numeric;
- char *characterString;
- Odr_oid *oid;
- char *dateTime;
- Z_External *external;
- /* Z_IntUnit *integerAndUnit; */
- Odr_null *null;
- } u;
-} Z_Term;
-
-typedef struct Z_AttributesPlusTerm
-{
- int num_attributes;
- Z_AttributeElement **attributeList;
- Z_Term *term;
-} Z_AttributesPlusTerm;
-
-typedef struct Z_ResultSetPlusAttributes
-{
- char *resultSet;
- int num_attributes;
- Z_AttributeElement **attributeList;
-} Z_ResultSetPlusAttributes;
-
-typedef struct Z_ProximityOperator
-{
- bool_t *exclusion; /* OPTIONAL */
- int *distance;
- bool_t *ordered;
- int *relationType;
-#define Z_Prox_lessThan 1
-#define Z_Prox_lessThanOrEqual 2
-#define Z_Prox_equal 3
-#define Z_Prox_greaterThanOrEqual 4
-#define Z_Prox_greaterThan 5
-#define Z_Prox_notEqual 6
- int which;
-#define Z_ProxCode_known 0
-#define Z_ProxCode_private 1
- int *proximityUnitCode;
-#define Z_ProxUnit_character 1
-#define Z_ProxUnit_word 2
-#define Z_ProxUnit_sentence 3
-#define Z_ProxUnit_paragraph 4
-#define Z_ProxUnit_section 5
-#define Z_ProxUnit_chapter 6
-#define Z_ProxUnit_document 7
-#define Z_ProxUnit_element 8
-#define Z_ProxUnit_subelement 9
-#define Z_ProxUnit_elementType 10
-#define Z_ProxUnit_byte 11 /* v3 only */
-} Z_ProximityOperator;
-
-typedef struct Z_Operator
-{
- int which;
-#define Z_Operator_and 0
-#define Z_Operator_or 1
-#define Z_Operator_and_not 2
-#define Z_Operator_prox 3
- union
- {
- Odr_null *op_and; /* these guys are nulls. */
- Odr_null *op_or;
- Odr_null *op_and_not;
- Z_ProximityOperator *prox;
- } u;
-} Z_Operator;
-
-typedef struct Z_Operand
-{
- int which;
-#define Z_Operand_APT 0
-#define Z_Operand_resultSetId 1
-#define Z_Operand_resultAttr /* v3 only */ 2
- union
- {
- Z_AttributesPlusTerm *attributesPlusTerm;
- Z_ResultSetId *resultSetId;
- Z_ResultSetPlusAttributes *resultAttr;
- } u;
-} Z_Operand;
-
-typedef struct Z_Complex
-{
- struct Z_RPNStructure *s1;
- struct Z_RPNStructure *s2;
- Z_Operator *roperator;
-} Z_Complex;
-
-typedef struct Z_RPNStructure
-{
- int which;
-#define Z_RPNStructure_simple 0
-#define Z_RPNStructure_complex 1
- union
- {
- Z_Operand *simple;
- Z_Complex *complex;
- } u;
-} Z_RPNStructure;
-
-typedef struct Z_RPNQuery
-{
- Odr_oid *attributeSetId;
- Z_RPNStructure *RPNStructure;
-} Z_RPNQuery;
-
-/* -------------------------- SEARCHREQUEST -------------------------- */
-
-typedef struct Z_Query
-{
- int which;
-#define Z_Query_type_1 1
-#define Z_Query_type_2 2
-#define Z_Query_type_101 3
- union
- {
- Z_RPNQuery *type_1;
- Odr_oct *type_2;
- Z_RPNQuery *type_101;
- } u;
-} Z_Query;
-
-typedef struct Z_SearchRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *smallSetUpperBound;
- int *largeSetLowerBound;
- int *mediumSetPresentNumber;
- bool_t *replaceIndicator;
- char *resultSetName;
- int num_databaseNames;
- char **databaseNames;
- Z_ElementSetNames *smallSetElementSetNames; /* OPTIONAL */
- Z_ElementSetNames *mediumSetElementSetNames; /* OPTIONAL */
- Odr_oid *preferredRecordSyntax; /* OPTIONAL */
- Z_Query *query;
- Z_OtherInformation *additionalSearchInfo; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_SearchRequest;
-
-/* ------------------------ RECORD -------------------------- */
-
-typedef Z_External Z_DatabaseRecord;
-
-typedef struct Z_DefaultDiagFormat
-{
- Odr_oid *diagnosticSetId; /* This is opt'l to interwork with bad targets */
- int *condition;
- /* until the whole character set issue becomes more definite,
- * you can probably ignore this on input. */
- int which;
-#define Z_DiagForm_v2AddInfo 0
-#define Z_DiagForm_v3AddInfo 1
- char *addinfo;
-} Z_DefaultDiagFormat;
-
-typedef struct Z_DiagRec
-{
- int which;
-#define Z_DiagRec_defaultFormat 0
-#define Z_DiagRec_externallyDefined 1
- union
- {
- Z_DefaultDiagFormat *defaultFormat;
- Z_External *externallyDefined;
- } u;
-} Z_DiagRec;
-
-typedef struct Z_DiagRecs
-{
- int num_diagRecs;
- Z_DiagRec **diagRecs;
-} Z_DiagRecs;
-
-typedef struct Z_NamePlusRecord
-{
- char *databaseName; /* OPTIONAL */
- int which;
-#define Z_NamePlusRecord_databaseRecord 0
-#define Z_NamePlusRecord_surrogateDiagnostic 1
- union
- {
- Z_DatabaseRecord *databaseRecord;
- Z_DiagRec *surrogateDiagnostic;
- } u;
-} Z_NamePlusRecord;
-
-typedef struct Z_NamePlusRecordList
-{
- int num_records;
- Z_NamePlusRecord **records;
-} Z_NamePlusRecordList;
-
-typedef struct Z_Records
-{
- int which;
-#define Z_Records_DBOSD 0
-#define Z_Records_NSD 1
-#define Z_Records_multipleNSD 2
- union
- {
- Z_NamePlusRecordList *databaseOrSurDiagnostics;
- Z_DiagRec *nonSurrogateDiagnostic;
- Z_DiagRecs *multipleNonSurDiagnostics;
- } u;
-} Z_Records;
-
-/* ------------------------ SEARCHRESPONSE ------------------ */
-
-typedef struct Z_SearchResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *resultCount;
- int *numberOfRecordsReturned;
- int *nextResultSetPosition;
- bool_t *searchStatus;
- int *resultSetStatus; /* OPTIONAL */
-#define Z_RES_SUBSET 1
-#define Z_RES_INTERIM 2
-#define Z_RES_NONE 3
- int *presentStatus; /* OPTIONAL */
-#define Z_PRES_SUCCESS 0
-#define Z_PRES_PARTIAL_1 1
-#define Z_PRES_PARTIAL_2 2
-#define Z_PRES_PARTIAL_3 3
-#define Z_PRES_PARTIAL_4 4
-#define Z_PRES_FAILURE 5
- Z_Records *records; /* OPTIONAL */
- Z_OtherInformation *additionalSearchInfo;
- Z_OtherInformation *otherInfo;
-} Z_SearchResponse;
-
-/* ------------------------- PRESENT SERVICE -----------------*/
-
-typedef struct Z_ElementSpec
-{
- int which;
-#define Z_ElementSpec_elementSetName 0
-#define Z_ElementSpec_externalSpec 1
- union
- {
- char *elementSetName;
- Z_External *externalSpec;
- } u;
-} Z_ElementSpec;
-
-typedef struct Z_Specification
-{
- Odr_oid *schema; /* OPTIONAL */
- Z_ElementSpec *elementSpec; /* OPTIONAL */
-} Z_Specification;
-
-typedef struct Z_DbSpecific
-{
- char *databaseName;
- Z_Specification *spec;
-} Z_DbSpecific;
-
-typedef struct Z_CompSpec
-{
- bool_t *selectAlternativeSyntax;
- Z_Specification *generic; /* OPTIONAL */
- int num_dbSpecific;
- Z_DbSpecific **dbSpecific; /* OPTIONAL */
- int num_recordSyntax;
- Odr_oid **recordSyntax; /* OPTIONAL */
-} Z_CompSpec;
-
-typedef struct Z_RecordComposition
-{
- int which;
-#define Z_RecordComp_simple 0
-#define Z_RecordComp_complex 1
- union
- {
- Z_ElementSetNames *simple;
- Z_CompSpec *complex;
- } u;
-} Z_RecordComposition;
-
-typedef struct Z_Range
-{
- int *startingPosition;
- int *numberOfRecords;
-} Z_Range;
-
-typedef struct Z_PresentRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- Z_ResultSetId *resultSetId;
- int *resultSetStartPoint;
- int *numberOfRecordsRequested;
- int num_ranges;
- Z_Range **additionalRanges; /* OPTIONAL */
- Z_RecordComposition *recordComposition; /* OPTIONAL */
- Odr_oid *preferredRecordSyntax; /* OPTIONAL */
- int *maxSegmentCount; /* OPTIONAL */
- int *maxRecordSize; /* OPTIONAL */
- int *maxSegmentSize; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_PresentRequest;
-
-typedef struct Z_PresentResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *numberOfRecordsReturned;
- int *nextResultSetPosition;
- int *presentStatus;
- Z_Records *records;
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_PresentResponse;
-
-/* ------------------ RESOURCE CONTROL ----------------*/
-
-typedef struct Z_TriggerResourceControlRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *requestedAction;
-#define Z_TriggerResourceCtrl_resourceReport 1
-#define Z_TriggerResourceCtrl_resourceControl 2
-#define Z_TriggerResourceCtrl_cancel 3
- Odr_oid *prefResourceReportFormat; /* OPTIONAL */
- bool_t *resultSetWanted; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_TriggerResourceControlRequest;
-
-typedef struct Z_ResourceControlRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- bool_t *suspendedFlag; /* OPTIONAL */
- Z_External *resourceReport; /* OPTIONAL */
- int *partialResultsAvailable; /* OPTIONAL */
-#define Z_ResourceControlRequest_subset 1
-#define Z_ResourceControlRequest_interim 2
-#define Z_ResourceControlRequest_none 3
- bool_t *responseRequired;
- bool_t *triggeredRequestFlag; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_ResourceControlRequest;
-
-typedef struct Z_ResourceControlResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- bool_t *continueFlag;
- bool_t *resultSetWanted; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_ResourceControlResponse;
-
-
-/* ------------------ ACCESS CTRL SERVICE ----------------*/
-
-typedef struct Z_AccessControlRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int which;
-#define Z_AccessRequest_simpleForm 0
-#define Z_AccessRequest_externallyDefined 1
- union
- {
- Odr_oct *simpleForm;
- Z_External *externallyDefined;
- } u;
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_AccessControlRequest;
-
-typedef struct Z_AccessControlResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int which;
-#define Z_AccessResponse_simpleForm 0
-#define Z_AccessResponse_externallyDefined 1
- union
- {
- Odr_oct *simpleForm;
- Z_External *externallyDefined;
- } u;
- Z_DiagRec *diagnostic; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_AccessControlResponse;
-
-/* ------------------------ SCAN SERVICE -------------------- */
-
-typedef struct Z_AttributeList
-{
- int num_attributes;
- Z_AttributeElement **attributes;
-} Z_AttributeList;
-
-typedef struct Z_AlternativeTerm
-{
- int num_terms;
- Z_AttributesPlusTerm **terms;
-} Z_AlternativeTerm;
-
-typedef struct Z_ByDatabase
-{
- char *db;
- int *num; /* OPTIONAL */
- Z_OtherInformation *otherDbInfo; /* OPTIONAL */
-} Z_ByDatabase;
-
-typedef struct Z_ByDatabaseList
-{
- int num_elements;
- Z_ByDatabase **elements;
-} Z_ByDatabaseList;
-
-typedef struct Z_ScanOccurrences
-{
- int which;
-#define Z_ScanOccurrences_global 0
-#define Z_ScanOccurrences_byDatabase 1
- union
- {
- int *global;
- Z_ByDatabaseList *byDatabase;
- } u;
-
-} Z_ScanOccurrences;
-
-typedef struct Z_OccurrenceByAttributesElem
-{
- Z_AttributeList *attributes;
- Z_ScanOccurrences *occurrences; /* OPTIONAL */
- Z_OtherInformation *otherOccurInfo; /* OPTIONAL */
-} Z_OccurrenceByAttributesElem;
-
-typedef struct Z_OccurrenceByAttributes
-{
- int num_elements;
- Z_OccurrenceByAttributesElem **elements;
-} Z_OccurrenceByAttributes;
-
-typedef struct Z_TermInfo
-{
- Z_Term *term;
- char *displayTerm; /* OPTIONAL */
- Z_AttributeList *suggestedAttributes; /* OPTIONAL */
- Z_AlternativeTerm *alternativeTerm; /* OPTIONAL */
- int *globalOccurrences; /* OPTIONAL */
- Z_OccurrenceByAttributes *byAttributes; /* OPTIONAL */
- Z_OtherInformation *otherTermInfo; /* OPTIONAL */
-} Z_TermInfo;
-
-typedef struct Z_Entry
-{
- int which;
-#define Z_Entry_termInfo 0
-#define Z_Entry_surrogateDiagnostic 1
- union
- {
- Z_TermInfo *termInfo;
- Z_DiagRec *surrogateDiagnostic;
- } u;
-} Z_Entry;
-
-#ifdef BUGGY_LISTENTRIES
-
-typedef struct Z_Entries
-{
- int num_entries;
- Z_Entry **entries;
-} Z_Entries;
-
-typedef struct Z_ListEntries
-{
- int which;
-#define Z_ListEntries_entries 0
-#define Z_ListEntries_nonSurrogateDiagnostics 1
- union
- {
- Z_Entries *entries;
- Z_DiagRecs *nonSurrogateDiagnostics;
- } u;
-} Z_ListEntries;
-
-#endif
-
-typedef struct Z_ListEntries {
- int num_entries;
- Z_Entry **entries; /* OPT */
- int num_nonsurrogateDiagnostics;
- Z_DiagRec **nonsurrogateDiagnostics; /* OPT */
-} Z_ListEntries;
-
-typedef struct Z_ScanRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int num_databaseNames;
- char **databaseNames;
- Odr_oid *attributeSet; /* OPTIONAL */
- Z_AttributesPlusTerm *termListAndStartPoint;
- int *stepSize; /* OPTIONAL */
- int *numberOfTermsRequested;
- int *preferredPositionInResponse; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_ScanRequest;
-
-typedef struct Z_ScanResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *stepSize; /* OPTIONAL */
- int *scanStatus;
-#define Z_Scan_success 0
-#define Z_Scan_partial_1 1
-#define Z_Scan_partial_2 2
-#define Z_Scan_partial_3 3
-#define Z_Scan_partial_4 4
-#define Z_Scan_partial_5 5
-#define Z_Scan_failure 6
- int *numberOfEntriesReturned;
- int *positionOfTerm; /* OPTIONAL */
- Z_ListEntries *entries; /* OPTIONAL */
- Odr_oid *attributeSet; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_ScanResponse;
-
-
-/* ------------------------ DELETE -------------------------- */
-
-#define Z_DeleteStatus_success 0
-#define Z_DeleteStatus_resultSetDidNotExist 1
-#define Z_DeleteStatus_previouslyDeletedByTarget 2
-#define Z_DeleteStatus_systemProblemAtTarget 3
-#define Z_DeleteStatus_accessNotAllowed 4
-#define Z_DeleteStatus_resourceControlAtOrigin 5
-#define Z_DeleteStatus_resourceControlAtTarget 6
-#define Z_DeleteStatus_bulkDeleteNotSupported 7
-#define Z_DeleteStatus_notAllRsltSetsDeletedOnBulkDlte 8
-#define Z_DeleteStatus_notAllRequestedResultSetsDeleted 9
-#define Z_DeleteStatus_resultSetInUse 10
-
-typedef struct Z_ListStatus
-{
- Z_ResultSetId *id;
- int *status;
-} Z_ListStatus;
-
-typedef struct Z_DeleteResultSetRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *deleteFunction;
-#define Z_DeleteRequest_list 0
-#define Z_DeleteRequest_all 1
- int num_resultSetList;
- Z_ResultSetId **resultSetList; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_DeleteResultSetRequest;
-
-typedef struct Z_ListStatuses {
- int num;
- Z_ListStatus **elements;
-} Z_ListStatuses;
-
-typedef struct Z_DeleteResultSetResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *deleteOperationStatus;
- Z_ListStatuses *deleteListStatuses;/* OPTIONAL */
- int *numberNotDeleted; /* OPTIONAL */
- Z_ListStatuses *bulkStatuses; /* OPTIONAL */
- char *deleteMessage; /* OPTIONAL */
- Z_OtherInformation *otherInfo;
-} Z_DeleteResultSetResponse;
-
-/* ------------------------ CLOSE SERVICE ------------------- */
-
-typedef struct Z_Close
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *closeReason;
-#define Z_Close_finished 0
-#define Z_Close_shutdown 1
-#define Z_Close_systemProblem 2
-#define Z_Close_costLimit 3
-#define Z_Close_resources 4
-#define Z_Close_securityViolation 5
-#define Z_Close_protocolError 6
-#define Z_Close_lackOfActivity 7
-#define Z_Close_peerAbort 8
-#define Z_Close_unspecified 9
- char *diagnosticInformation; /* OPTIONAL */
- Odr_oid *resourceReportFormat; /* OPTIONAL */
- Z_External *resourceReport; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_Close;
-
-/* ------------------------ SEGMENTATION -------------------- */
-
-typedef struct Z_Segment
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *numberOfRecordsReturned;
- int num_segmentRecords;
- Z_NamePlusRecord **segmentRecords;
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_Segment;
-
-/* ----------------------- Extended Services ---------------- */
-
-typedef struct Z_Permissions
-{
- char *userId;
- int num_allowableFunctions;
- int **allowableFunctions;
-#define Z_Permissions_delete 1
-#define Z_Permissions_modifyContents 2
-#define Z_Permissions_modifyPermissions 3
-#define Z_Permissions_present 4
-#define Z_Permissions_invoke 5
-} Z_Permissions;
-
-typedef struct Z_ExtendedServicesRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *function;
-#define Z_ExtendedServicesRequest_create 1
-#define Z_ExtendedServicesRequest_delete 2
-#define Z_ExtendedServicesRequest_modify 3
- Odr_oid *packageType;
- char *packageName; /* OPTIONAL */
- char *userId; /* OPTIONAL */
- Z_IntUnit *retentionTime; /* OPTIONAL */
- Z_Permissions *permissions; /* OPTIONAL */
- char *description; /* OPTIONAL */
- Z_External *taskSpecificParameters; /* OPTIONAL */
- int *waitAction;
-#define Z_ExtendedServicesRequest_wait 1
-#define Z_ExtendedServicesRequest_waitIfPossible 2
-#define Z_ExtendedServicesRequest_dontWait 3
-#define Z_ExtendedServicesRequest_dontReturnPackage 4
- char *elements; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_ExtendedServicesRequest;
-
-typedef struct Z_ExtendedServicesResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *operationStatus;
-#define Z_ExtendedServicesResponse_done 1
-#define Z_ExtendedServicesResponse_accepted 2
-#define Z_ExtendedServicesResponse_failure 3
- int num_diagnostics;
- Z_DiagRec **diagnostics; /* OPTIONAL */
- Z_External *taskPackage; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_ExtendedServicesResponse;
-
-/* ------------------------ Sort --------------------------- */
-
-typedef struct Z_SortAttributes
-{
- Odr_oid *id;
- Z_AttributeList *list;
-} Z_SortAttributes;
-
-typedef struct Z_SortKey
-{
- int which;
-#define Z_SortKey_sortField 0
-#define Z_SortKey_elementSpec 1
-#define Z_SortKey_sortAttributes 2
- union
- {
- char *sortField;
- Z_Specification *elementSpec;
- Z_SortAttributes *sortAttributes;
- } u;
-} Z_SortKey;
-
-typedef struct Z_SortDbSpecific
-{
- char *databaseName;
- Z_SortKey *dbSort;
-} Z_SortDbSpecific;
-
-typedef struct Z_SortDbSpecificList
-{
- int num_dbSpecific;
- Z_SortDbSpecific **dbSpecific;
-} Z_SortDbSpecificList;
-
-typedef struct Z_SortElement
-{
- int which;
-#define Z_SortElement_generic 0
-#define Z_SortElement_databaseSpecific 1
- union
- {
- Z_SortKey *generic;
- Z_SortDbSpecificList *databaseSpecific;
- } u;
-} Z_SortElement;
-
-typedef struct Z_SortMissingValueAction
-{
- int which;
-#define Z_SortMissingValAct_abort 0
-#define Z_SortMissingValAct_null 1
-#define Z_SortMissingValAct_valData 2
- union
- {
- Odr_null *abort;
- Odr_null *null;
- Odr_oct *valData;
- } u;
-} Z_SortMissingValueAction;
-
-typedef struct Z_SortKeySpec
-{
- Z_SortElement *sortElement;
- int *sortRelation;
-#define Z_SortRelation_ascending 0
-#define Z_SortRelation_descending 1
-#define Z_SortRelation_ascendingByFreq 3
-#define Z_SortRelation_descendingByFreq 4
- int *caseSensitivity;
-#define Z_SortCase_caseSensitive 0
-#define Z_SortCase_caseInsensitive 1
- Z_SortMissingValueAction *missingValueAction; /* OPTIONAL */
-} Z_SortKeySpec;
-
-typedef struct Z_SortResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *sortStatus;
-#define Z_SortStatus_success 0
-#define Z_SortStatus_partial_1 1
-#define Z_SortStatus_failure 2
- int *resultSetStatus; /* OPTIONAL */
-#define Z_SortResultSetStatus_empty 1
-#define Z_SortResultSetStatus_interim 2
-#define Z_SortResultSetStatus_unchanged 3
-#define Z_SortResultSetStatus_none 4
- Z_DiagRecs *diagnostics; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_SortResponse;
-
-typedef struct Z_SortKeySpecList
-{
- int num_specs;
- Z_SortKeySpec **specs;
-} Z_SortKeySpecList;
-
-typedef struct Z_SortRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- Z_StringList *inputResultSetNames;
- char *sortedResultSetName;
- Z_SortKeySpecList *sortSequence;
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_SortRequest;
-
-/* ----------------------- Resource Report ------------------ */
-
-typedef struct Z_ResourceReportRequest
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- Z_ReferenceId *opId; /* OPTIONAL */
- Odr_oid *prefResourceReportFormat; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_ResourceReportRequest;
-
-typedef struct Z_ResourceReportResponse
-{
- Z_ReferenceId *referenceId; /* OPTIONAL */
- int *resourceReportStatus;
-#define Z_ResourceReportStatus_success 0
-#define Z_ResourceReportStatus_partial 1
-#define Z_ResourceReportStatus_failure_1 2
-#define Z_ResourceReportStatus_failure_2 3
-#define Z_ResourceReportStatus_failure_3 4
-#define Z_ResourceReportStatus_failure_4 5
-#define Z_ResourceReportStatus_failure_5 6
-#define Z_ResourceReportStatus_failure_6 7
- Z_External *resourceReport; /* OPTIONAL */
- Z_OtherInformation *otherInfo; /* OPTIONAL */
-} Z_ResourceReportResponse;
-
-/* ------------------------ APDU ---------------------------- */
-
-typedef struct Z_APDU
-{
- int which;
-#define Z_APDU_initRequest 0
-#define Z_APDU_initResponse 1
-#define Z_APDU_searchRequest 2
-#define Z_APDU_searchResponse 3
-#define Z_APDU_presentRequest 4
-#define Z_APDU_presentResponse 5
-#define Z_APDU_deleteResultSetRequest 6
-#define Z_APDU_deleteResultSetResponse 7
-#define Z_APDU_resourceControlRequest 8
-#define Z_APDU_resourceControlResponse 9
-#define Z_APDU_triggerResourceControlRequest 10
-#define Z_APDU_scanRequest 11
-#define Z_APDU_scanResponse 12
-#define Z_APDU_segmentRequest 13
-#define Z_APDU_extendedServicesRequest 14
-#define Z_APDU_extendedServicesResponse 15
-#define Z_APDU_close 16
-#define Z_APDU_accessControlRequest 17
-#define Z_APDU_accessControlResponse 18
-#define Z_APDU_sortRequest 20
-#define Z_APDU_sortResponse 21
-#define Z_APDU_resourceReportRequest 22
-#define Z_APDU_resourceReportResponse 23
- union
- {
- Z_InitRequest *initRequest;
- Z_InitResponse *initResponse;
- Z_SearchRequest *searchRequest;
- Z_SearchResponse *searchResponse;
- Z_PresentRequest *presentRequest;
- Z_PresentResponse *presentResponse;
- Z_DeleteResultSetRequest *deleteResultSetRequest;
- Z_DeleteResultSetResponse *deleteResultSetResponse;
- Z_AccessControlRequest *accessControlRequest;
- Z_AccessControlResponse *accessControlResponse;
- Z_ResourceControlRequest *resourceControlRequest;
- Z_ResourceControlResponse *resourceControlResponse;
- Z_TriggerResourceControlRequest *triggerResourceControlRequest;
- Z_ResourceReportRequest *resourceReportRequest;
- Z_ResourceReportResponse *resourceReportResponse;
- Z_ScanRequest *scanRequest;
- Z_ScanResponse *scanResponse;
- Z_SortRequest *sortRequest;
- Z_SortResponse *sortResponse;
- Z_Segment *segmentRequest;
- Z_ExtendedServicesRequest *extendedServicesRequest;
- Z_ExtendedServicesResponse *extendedServicesResponse;
- Z_Close *close;
- } u;
-} Z_APDU;
-
-#define z_APDU z_APDU_old
-
-YAZ_EXPORT int z_APDU(ODR o, Z_APDU **p, int opt, const char *name);
-YAZ_EXPORT int z_SUTRS(ODR o, Odr_oct **p, int opt, const char *name);
-
-YAZ_EXPORT Z_InitRequest *zget_InitRequest(ODR o);
-YAZ_EXPORT Z_InitResponse *zget_InitResponse(ODR o);
-YAZ_EXPORT Z_SearchRequest *zget_SearchRequest(ODR o);
-YAZ_EXPORT Z_SearchResponse *zget_SearchResponse(ODR o);
-YAZ_EXPORT Z_PresentRequest *zget_PresentRequest(ODR o);
-YAZ_EXPORT Z_PresentResponse *zget_PresentResponse(ODR o);
-YAZ_EXPORT Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o);
-YAZ_EXPORT Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o);
-YAZ_EXPORT Z_ScanRequest *zget_ScanRequest(ODR o);
-YAZ_EXPORT Z_ScanResponse *zget_ScanResponse(ODR o);
-YAZ_EXPORT Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o);
-YAZ_EXPORT Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o);
-YAZ_EXPORT Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o);
-YAZ_EXPORT Z_Close *zget_Close(ODR o);
-YAZ_EXPORT int z_StringList(ODR o, Z_StringList **p, int opt,
- const char *name);
-YAZ_EXPORT int z_InternationalString(ODR o, char **p, int opt,
- const char *name);
-YAZ_EXPORT int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt,
- const char *naem);
-YAZ_EXPORT int z_ElementSetName(ODR o, char **p, int opt, const char *name);
-YAZ_EXPORT int z_IntUnit(ODR o, Z_IntUnit **p, int opt, const char *name);
-YAZ_EXPORT int z_Unit(ODR o, Z_Unit **p, int opt, const char *name);
-YAZ_EXPORT int z_DatabaseName(ODR o, Z_DatabaseName **p, int opt,
- const char *name);
-YAZ_EXPORT int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt,
- const char *name);
-YAZ_EXPORT int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p,
- int opt, const char *name);
-YAZ_EXPORT int z_Term(ODR o, Z_Term **p, int opt, const char *name);
-YAZ_EXPORT int z_Specification(ODR o, Z_Specification **p, int opt,
- const char *name);
-YAZ_EXPORT int z_Permissions(ODR o, Z_Permissions **p, int opt,
- const char *name);
-YAZ_EXPORT int z_DiagRec(ODR o, Z_DiagRec **p, int opt, const char *name);
-YAZ_EXPORT int z_DiagRecs(ODR o, Z_DiagRecs **p, int opt, const char *name);
-YAZ_EXPORT int z_AttributeList(ODR o, Z_AttributeList **p, int opt,
- const char *name);
-YAZ_EXPORT int z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt,
- const char *name);
-YAZ_EXPORT Z_APDU *zget_APDU(ODR o, int which);
-YAZ_EXPORT int z_Query(ODR o, Z_Query **p, int opt, const char *name);
-
-YAZ_EXPORT Odr_oid *yaz_oidval_to_z3950oid (ODR o, int oid_class,
- int oid_value);
-YAZ_EXPORT Odr_oid *yaz_str_to_z3950oid (ODR o, int oid_class,
- const char *str);
-YAZ_EXPORT const char *yaz_z3950oid_to_str (Odr_oid *oid, int *oid_class);
-
-YAZ_END_CDECL
-
-#include <yaz/prt-rsc.h>
-#include <yaz/prt-acc.h>
-#include <yaz/prt-exp.h>
-#include <yaz/prt-grs.h>
-#include <yaz/prt-arc.h>
-#include <yaz/prt-exd.h>
-#include <yaz/prt-dia.h>
-#include <yaz/prt-esp.h>
-#include <yaz/prt-add.h>
-
-#include <yaz/prt-dat.h>
-#include <yaz/prt-univ.h>
-#include <yaz/prt-ext.h>
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-rsc.c,v $
- * Revision 1.8 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.7 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.6 1998/02/11 11:53:32 adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.5 1995/09/29 17:11:55 quinn
- * Smallish
- *
- * Revision 1.4 1995/09/27 15:02:43 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.3 1995/06/02 09:49:15 quinn
- * Adding access control
- *
- * Revision 1.2 1995/06/01 14:34:53 quinn
- * Work
- *
- * Revision 1.1 1995/06/01 11:22:17 quinn
- * Resource control
- *
- *
- */
-
-#include <yaz/proto.h>
-
-/* -------------------- Resource 1 ------------------------- */
-
-int z_Estimate1(ODR o, Z_Estimate1 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 2, 0) &&
- odr_implicit(o, odr_integer, &(*p)->currencyCode, ODR_CONTEXT, 3, 1) &&
- odr_sequence_end(o);
-}
-
-int z_ResourceReport1(ODR o, Z_ResourceReport1 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- odr_sequence_of(o, (Odr_fun)z_Estimate1, &(*p)->estimates,
- &(*p)->num_estimates, 0) &&
- odr_implicit(o, odr_visiblestring, &(*p)->message,
- ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-/* -------------------- Resource 2 ------------------------- */
-
-/* int z_StringOrNumeric(ODR, Z_StringOrNumeric **, int); */
-/* int z_IntUnit(ODR, Z_IntUnit **, int); */
-
-int z_Estimate2(ODR o, Z_Estimate2 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_explicit(o, z_StringOrNumeric, &(*p)->type, ODR_CONTEXT, 1, 0) &&
- odr_implicit(o, z_IntUnit, &(*p)->value, ODR_CONTEXT, 2, 0) &&
- odr_sequence_end(o);
-}
-
-int z_ResourceReport2(ODR o, Z_ResourceReport2 **p, int opt, const char *name)
-{
- if (!odr_sequence_begin(o, p, sizeof(**p), 0))
- return opt && odr_ok(o);
- return
- odr_implicit_settag(o, ODR_CONTEXT, 1) &&
- (odr_sequence_of(o, (Odr_fun)z_Estimate2, &(*p)->estimates,
- &(*p)->num_estimates, 0) || odr_ok(o)) &&
- odr_implicit(o, odr_visiblestring, &(*p)->message,
- ODR_CONTEXT, 2, 1) &&
- odr_sequence_end(o);
-}
-
-
+++ /dev/null
-/*
- * Copyright (c) 1995, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The name of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * $Log: prt-rsc.h,v $
- * Revision 1.1 2000-10-03 12:55:50 adam
- * Removed several auto-generated files from CVS.
- *
- * Revision 1.1 1999/11/30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.7 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.6 1997/05/14 06:53:50 adam
- * C++ support.
- *
- * Revision 1.5 1995/09/29 17:12:11 quinn
- * Smallish
- *
- * Revision 1.4 1995/09/27 15:02:52 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.3 1995/08/17 12:45:17 quinn
- * Fixed minor problems with GRS-1. Added support in c&s.
- *
- * Revision 1.2 1995/06/02 09:49:50 quinn
- * Add access control
- *
- * Revision 1.1 1995/06/01 11:24:52 quinn
- * Resource Control
- *
- *
- */
-
-#ifndef PRT_RSC_H
-#define PRT_RSC_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* -------------------- Resource-1 -------------------- */
-
-#define Z_EstimateType_currentSearchRecords 1
-#define Z_EstimateType_finalSearchRecords 2
-#define Z_EstimateType_currentPresentRecords 3
-#define Z_EstimateType_finalPresentRecords 4
-#define Z_EstimateType_currentOpTimeProcessing 5
-#define Z_EstimateType_finalOpTimeProcessing 6
-#define Z_EstimateType_currentAssocTime 7
-#define Z_EstimateType_currentOperationCost 8
-#define Z_EstimateType_finalOperationCost 9
-#define Z_EstimateType_currentAssocCost 10
-#define Z_EstimateType_finalOpTimeElapsed 11
-#define Z_EstimateType_percentComplete 12
-#define Z_EstimateType_currentSearchAssCost 13
-#define Z_EstimateType_currentPresentAssCost 14
-#define Z_EstimateType_currentConnectAssCost 15
-#define Z_EstimateType_currentOtherAssCost 16
-
-typedef struct Z_Estimate1
-{
- int *type;
- int *value;
- int *currencyCode; /* OPTIONAL */
-} Z_Estimate1;
-
-typedef struct Z_ResourceReport1
-{
- int num_estimates;
- Z_Estimate1 **estimates;
- char *message;
-} Z_ResourceReport1;
-
-int z_ResourceReport1(ODR o, Z_ResourceReport1 **p, int opt, const char *name);
-
-/* -------------------- Resource-2 -------------------- */
-
-typedef struct Z_Estimate2
-{
- Z_StringOrNumeric *type; /* same as in estimate1, if numeric */
- Z_IntUnit *value;
-} Z_Estimate2;
-
-typedef struct Z_ResourceReport2
-{
- int num_estimates;
- Z_Estimate2 **estimates; /* OPTIONAL */
- char *message; /* OPTIONAL */
-} Z_ResourceReport2;
-
-int z_ResourceReport2(ODR o, Z_ResourceReport2 **p, int opt, const char *name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1998-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: prt-univ.c,v $
- * Revision 1.3 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.2 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.1 1998/03/20 14:46:06 adam
- * Added UNIverse Resource Reports.
- *
- */
-
-#include <yaz/proto.h>
-
-int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- z_StringOrNumeric(o, &(*p)->database, 0, 0) &&
- z_StringOrNumeric(o, &(*p)->hits, 0, 0) &&
- odr_sequence_end (o);
-}
-
-int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt,
- const char *name)
-{
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- z_StringOrNumeric(o, &(*p)->hitno, 0, 0) &&
- odr_sequence_end (o);
-}
-
-int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt, const char *name)
-{
- static Odr_arm arm[] = {
- {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_UniverseReport_databaseHits,
- (Odr_fun) z_UniverseReportHits, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_UniverseReport_duplicate,
- (Odr_fun) z_UniverseReportDuplicate, 0},
- {-1, -1, -1, -1, (Odr_fun) 0, 0}
- };
- if (!odr_sequence_begin (o, p, sizeof(**p), 0))
- return opt && odr_ok (o);
- return
- odr_integer(o, &(*p)->totalHits, 0, 0) &&
- odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
- odr_sequence_end (o);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1998
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- */
-
-#ifndef PRT_UNIV_H
-#define PRT_UNIV_H
-
-#include <yaz/yconfig.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* YC 0.1: Fri Mar 20 14:28:54 CET 1998 */
-/* Module-H ResourceReport-Format-Universe-1 */
-
-typedef struct Z_UniverseReportHits Z_UniverseReportHits;
-int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt,
- const char *name);
-
-typedef struct Z_UniverseReportDuplicate Z_UniverseReportDuplicate;
-int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt,
- const char *name);
-
-typedef struct Z_UniverseReport Z_UniverseReport;
-int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt,
- const char *name);
-
-struct Z_UniverseReportHits {
- Z_StringOrNumeric *database;
- Z_StringOrNumeric *hits;
-};
-
-struct Z_UniverseReportDuplicate {
- Z_StringOrNumeric *hitno;
-};
-
-struct Z_UniverseReport {
- int *totalHits;
- int which;
- union {
- Z_UniverseReportHits *databaseHits;
- Z_UniverseReportDuplicate *duplicate;
-#define Z_UniverseReport_databaseHits 1
-#define Z_UniverseReport_duplicate 2
- } u;
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-#include <stdio.h>
-#include <yaz/odr.h>
-#include <yaz/proto.h>
-
-int main()
-{
- int i;
- unsigned char buf[10000];
- struct odr o;
- Z_APDU apdu, *papdu, *papdu2;
- Z_SearchRequest sreq;
- int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
- bool_t rep;
- static char *names[] = {"Erik", "William", "George", "Bob"};
- Z_Query query;
- Z_RPNQuery rpnquery;
- Odr_oid att[] = { 1, 2, 3, 4, 5, 6, -1};
- Z_RPNStructure rpnstructure;
- Z_Operand operand;
- Z_AttributesPlusTerm apt;
- Odr_oct term;
-
- papdu = &apdu;
- apdu.which = Z_APDU_searchRequest;
- apdu.u.searchRequest = &sreq;
- a1 = 1000; sreq.smallSetUpperBound = &a1;
- a2 = 2000; sreq.largeSetLowerBound = &a2;
- a3 = 100; sreq.mediumSetPresentNumber = &a3;
- rep = 1; sreq.replaceIndicator = &rep;
- sreq.resultSetName = "FOOBAR";
- sreq.num_databaseNames = 4;
- sreq.databaseNames = names;
- sreq.smallSetElementSetNames = 0;
- sreq.mediumSetElementSetNames = 0;
- sreq.preferredRecordSyntax = 0;
- query.which = Z_Query_type_1;
- query.u.type_1 = &rpnquery;
- sreq.query = &query;
- rpnquery.attributeSetId = att;
- rpnquery.RPNStructure = &rpnstructure;
- rpnstructure.which = Z_RPNStructure_simple;
- rpnstructure.u.simple = &operand;
- operand.which = Z_Operand_APT;
- operand.u.attributesPlusTerm = &apt;
- apt.num_attributes=0;
- apt.attributeList = 0;
- apt.term = &term;
- term.buf = (unsigned char*) "BARFOO";
- term.len = term.size = strlen((char*)term.buf);
-
- o.buf = buf;
- o.bp=o.buf;
- o.left = o.buflen = 10000;
- o.direction = ODR_PRINT;
- o.print = stdout;
- o.indent = 0;
- o.t_class = -1;
-
- printf("status=%d\n", z_APDU(&o, &papdu, 0));
-
- return 0;
-
- o.direction = ODR_DECODE;
- o.bp = o.buf;
-
- z_APDU(&o, &papdu2, 0);
-}
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-cclsh
-libccl.la
-*.lo
+++ /dev/null
-/*
- * Copyright (c) 1995-1996, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
+++ /dev/null
-## $Id: Makefile.am,v 1.10 2003-06-23 10:22:21 adam Exp $
-
-noinst_LTLIBRARIES = libccl.la
-
-noinst_PROGRAMS = cclsh
-
-check_PROGRAMS = tstccl
-
-TESTS = $(check_PROGRAMS)
-
-EXTRA_DIST = bib1
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-libccl_la_SOURCES = cclfind.c ccltoken.c cclerrms.c cclqual.c cclptree.c \
- cclqfile.c cclstr.c
-
-cclsh_SOURCES=cclsh.c
-cclsh_LDADD = libccl.la ../util/libutil.la $(READLINE_LIBS)
-
-tstccl_SOURCES = tstccl.c
-tstccl_LDADD = libccl.la ../util/libutil.la
-
+++ /dev/null
-CCL test module
-
-This module is required to parse the queries given to the yaz-client
-test program. It is *not* a part of the YAZ module, and it is
-distributed under a different license.
-
-Eventually, the products of the EUROPAGATE will be made available to
-the general public, free of charge (the exact nature of the license is
-unknown at this point). Until then, you should *NOT* distribute copies
-of this software to organisations that are not partners in EUROPAGATE.
-
-If you need to distribute copies of YAZ to organisations which are not
-partners in EUROPAGATE, you should remove this module, and, if
-necessary, modify client/yaz-client.c to work wihout it. The test program
-is not essential to the general working of YAZ.
+++ /dev/null
-# $Id: bib1,v 1.13 2003-06-23 10:22:21 adam Exp $
-# CCL qualifiers and their mappings
-#
-# Each line takes the form:
-# name [<attributeset>,]<type>=<val>,<val>.. <type>=<val> ...
-# Where type is one of:
-# u use-attribute
-# r relation-attribute )
-# p position-attribute
-# s structure-attribute
-# t truncation-attribute
-# c completeness-attribute
-#
-# Special value for relation:
-# o ordered. Tells the CCL parser to convert a ccl relation
-# to a bib-1 relation (1,2,..6).
-# Special value for structure:
-# pw phrase/word. The CCL parser will decide whether phrase or word
-# is needed. Phrase is used if term contain blanks; otherwise
-# Word is used.
-# al and-list. AND operation is put between each term.
-# ol or-list. OR operation is put between each term.
-# Special value for truncation:
-# l Allow left truncation if ? is at left side of term.
-# r Allow right truncation if ? is at left side of term.
-# b Allow left&right truncation if ? is at left&right side of term.
-# n Set truncation explicitly to "none" if no ? is given.
-
-# This rule is for CCL tokens where no fields are specified
-#term u=1016 t=l,r s=pw,al
-term u=1016 t=l,r s=pw,al
-# Common short-hand access points.
-au u=1 s=pw t=l,r # author
-sp u=1 s=pw t=l,r # author
-ti u=4 s=pw t=l,r # title
-isbn u=7
-issn u=8
-cc u=20
-su u=21 s=pw
-date u=30 r=o s=pw
-dp u=31 r=o
-da u=32 r=o
-la u=54 s=pw
-ab u=62 s=pw
-note u=63 s=pw
-af u=1006 s=pw
-rel s=9
-cln
-
-# Relation Attributes
-rel:lt r=1
-rel:le r=2
-rel:eq r=3
-rel:ge r=4
-rel:gt r=5
-rel:ne r=6
-rel:phon r=100
-rel:stem r=101
-rel:rele r=102
-rel:alwa r=103
-
-# Position Attributes
-pos:ff p=1
-pos:fs p=2
-pos:af p=3
-
-# Structure Attributes
-str:wp s=pw
-str:phrase s=1
-str:word s=2
-str:key s=3
-str:year s=4
-str:date s=5
-str:wlist s=6
-str:dateu s=100
-str:daten s=101
-str:nameu s=102
-str:struc s=103
-str:urx s=104
-str:fft s=105
-str:dt s=106
-str:ln s=107
-str:str s=108
-str:num s=109
-
-# Truncation Attributes
-tru:right t=1
-tru:left t=2
-tru:both t=3
-tru:none t=100
-tru:proh t=101
-tru:re1 t=102
-tru:re2 t=103
-
-# Completeness Attributes
-com:is c=1
-com:cs c=2
-com:cf c=3
-
-exp:category exp1,1=1
-
-# These special directives defines names of keywords for parser
-@and og * # either 'or' or *
-@or eller # either 'eller' or +
-@not ikke # and so on..
-@set s set
-@case 0 # case insenstive (1 for case sensitive)
-@truncation * ?
-@field or
-
-# Aliases
-#
-# forfatter=x is equivalent to au=x
-forfatter au
-# tiau=x is equivalent to ti=x or ti=x
-tiau ti au
-#
-# string atributes
-dc.title 1=/my/title
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Europagate, 1995
- *
- * $Id: cclerrms.c,v 1.10 2001-11-27 22:38:50 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.8 1995/05/16 09:39:25 adam
- * LICENSE.
- *
- * Revision 1.7 1995/04/17 09:31:40 adam
- * Improved handling of qualifiers. Aliases or reserved words.
- *
- * Revision 1.6 1995/02/23 08:31:59 adam
- * Changed header.
- *
- * Revision 1.4 1995/02/14 16:20:54 adam
- * Qualifiers are read from a file now.
- *
- * Revision 1.3 1995/02/14 10:25:56 adam
- * The constructions 'qualifier rel term ...' implemented.
- *
- * Revision 1.2 1995/02/13 15:15:06 adam
- * Added handling of qualifiers. Not finished yet.
- *
- * Revision 1.1 1995/02/13 12:35:20 adam
- * First version of CCL. Qualifiers aren't handled yet.
- *
- */
-
-#include <yaz/ccl.h>
-
-static char *err_msg_array[] = {
- "Ok",
- "Search word expected",
- "')' expected",
- "Set name expected",
- "Operator expected",
- "Unbalanced ')'",
- "Unknown qualifier",
- "Qualifiers applied twice",
- "'=' expected",
- "Bad relation",
- "Left truncation not supported",
- "Both left - and right truncation not supported",
- "Right truncation not supported"
-};
-
-/*
- * ccl_err_msg: return name of CCL error
- * ccl_errno: Error no.
- * return: Name of error.
- */
-const char *ccl_err_msg (int ccl_errno)
-{
- return err_msg_array[ccl_errno];
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL find (to rpn conversion)
- * Europagate, 1995
- *
- * $Id: cclfind.c,v 1.34 2003-06-23 10:22:21 adam Exp $
- *
- * Old Europagate log:
- *
- * Revision 1.16 1996/01/08 08:41:13 adam
- * Removed unused function.
- *
- * Revision 1.15 1995/07/20 08:14:34 adam
- * Qualifiers were observed too often. Instead tokens are treated as
- * qualifiers only when separated by comma.
- *
- * Revision 1.14 1995/05/16 09:39:26 adam
- * LICENSE.
- *
- * Revision 1.13 1995/04/17 09:31:42 adam
- * Improved handling of qualifiers. Aliases or reserved words.
- *
- * Revision 1.12 1995/03/20 15:27:43 adam
- * Minor changes.
- *
- * Revision 1.11 1995/02/23 08:31:59 adam
- * Changed header.
- *
- * Revision 1.9 1995/02/16 13:20:06 adam
- * Spell fix.
- *
- * Revision 1.8 1995/02/14 19:59:42 adam
- * Removed a syntax error.
- *
- * Revision 1.7 1995/02/14 19:55:10 adam
- * Header files ccl.h/cclp.h are gone! They have been merged an
- * moved to ../include/ccl.h.
- * Node kind(s) in ccl_rpn_node have changed names.
- *
- * Revision 1.6 1995/02/14 16:20:55 adam
- * Qualifiers are read from a file now.
- *
- * Revision 1.5 1995/02/14 14:12:41 adam
- * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
- *
- * Revision 1.4 1995/02/14 13:16:29 adam
- * Left and/or right truncation implemented.
- *
- * Revision 1.3 1995/02/14 10:25:56 adam
- * The constructions 'qualifier rel term ...' implemented.
- *
- * Revision 1.2 1995/02/13 15:15:07 adam
- * Added handling of qualifiers. Not finished yet.
- *
- * Revision 1.1 1995/02/13 12:35:20 adam
- * First version of CCL. Qualifiers aren't handled yet.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <yaz/ccl.h>
-
-/* returns type of current lookahead */
-#define KIND (cclp->look_token->kind)
-
-/* move one token forward */
-#define ADVANCE cclp->look_token = cclp->look_token->next
-
-/*
- * qual_val_type: test for existance of attribute type/value pair.
- * qa: Attribute array
- * type: Type of attribute to search for
- * value: Value of attribute to seach for
- * return: 1 if found; 0 otherwise.
- */
-static int qual_val_type (struct ccl_rpn_attr **qa, int type, int value,
- char **attset)
-{
- int i;
- struct ccl_rpn_attr *q;
-
- if (!qa)
- return 0;
- for (i = 0; (q=qa[i]); i++)
- while (q)
- {
- if (q->type == type && q->kind == CCL_RPN_ATTR_NUMERIC &&
- q->value.numeric == value)
- {
- if (attset)
- *attset = q->set;
- return 1;
- }
- q = q->next;
- }
- return 0;
-}
-
-/*
- * strxcat: concatenate strings.
- * n: Null-terminated Destination string
- * src: Source string to be appended (not null-terminated)
- * len: Length of source string.
- */
-static void strxcat (char *n, const char *src, int len)
-{
- while (*n)
- n++;
- while (--len >= 0)
- *n++ = *src++;
- *n = '\0';
-}
-
-/*
- * copy_token_name: Return copy of CCL token name
- * tp: Pointer to token info.
- * return: malloc(3) allocated copy of token name.
- */
-static char *copy_token_name (struct ccl_token *tp)
-{
- char *str = (char *)xmalloc (tp->len + 1);
- ccl_assert (str);
- memcpy (str, tp->name, tp->len);
- str[tp->len] = '\0';
- return str;
-}
-
-/*
- * mk_node: Create RPN node.
- * kind: Type of node.
- * return: pointer to allocated node.
- */
-static struct ccl_rpn_node *mk_node (int kind)
-{
- struct ccl_rpn_node *p;
- p = (struct ccl_rpn_node *)xmalloc (sizeof(*p));
- ccl_assert (p);
- p->kind = kind;
- return p;
-}
-
-/*
- * ccl_rpn_delete: Delete RPN tree.
- * rpn: Pointer to tree.
- */
-void ccl_rpn_delete (struct ccl_rpn_node *rpn)
-{
- struct ccl_rpn_attr *attr, *attr1;
- if (!rpn)
- return;
- switch (rpn->kind)
- {
- case CCL_RPN_AND:
- case CCL_RPN_OR:
- case CCL_RPN_NOT:
- ccl_rpn_delete (rpn->u.p[0]);
- ccl_rpn_delete (rpn->u.p[1]);
- break;
- case CCL_RPN_TERM:
- xfree (rpn->u.t.term);
- for (attr = rpn->u.t.attr_list; attr; attr = attr1)
- {
- attr1 = attr->next;
- if (attr->kind == CCL_RPN_ATTR_STRING)
- xfree(attr->value.str);
- if (attr->set)
- xfree (attr->set);
- xfree (attr);
- }
- break;
- case CCL_RPN_SET:
- xfree (rpn->u.setname);
- break;
- case CCL_RPN_PROX:
- ccl_rpn_delete (rpn->u.p[0]);
- ccl_rpn_delete (rpn->u.p[1]);
- break;
- }
- xfree (rpn);
-}
-
-static struct ccl_rpn_node *find_spec (CCL_parser cclp,
- struct ccl_rpn_attr **qa);
-
-static int is_term_ok (int look, int *list)
-{
- for (;*list >= 0; list++)
- if (look == *list)
- return 1;
- return 0;
-}
-
-static struct ccl_rpn_node *search_terms (CCL_parser cclp,
- struct ccl_rpn_attr **qa);
-
-static struct ccl_rpn_attr *add_attr_node (struct ccl_rpn_node *p,
- const char *set, int type)
-{
- struct ccl_rpn_attr *n;
-
- n = (struct ccl_rpn_attr *)xmalloc (sizeof(*n));
- ccl_assert (n);
- if (set)
- {
- n->set = (char*) xmalloc (strlen(set)+1);
- strcpy (n->set, set);
- }
- else
- n->set = 0;
- n->type = type;
- n->next = p->u.t.attr_list;
- p->u.t.attr_list = n;
-
- n->kind = CCL_RPN_ATTR_NUMERIC;
- n->value.numeric = 0;
- return n;
-}
-
-/*
- * add_attr_numeric: Add attribute (type/value) to RPN term node.
- * p: RPN node of type term.
- * type: Type of attribute
- * value: Value of attribute
- * set: Attribute set name
- */
-static void add_attr_numeric (struct ccl_rpn_node *p, const char *set,
- int type, int value)
-{
- struct ccl_rpn_attr *n;
-
- n = add_attr_node(p, set, type);
- n->kind = CCL_RPN_ATTR_NUMERIC;
- n->value.numeric = value;
-}
-
-static void add_attr_string (struct ccl_rpn_node *p, const char *set,
- int type, char *value)
-{
- struct ccl_rpn_attr *n;
-
- n = add_attr_node(p, set, type);
- n->kind = CCL_RPN_ATTR_STRING;
- n->value.str = xstrdup(value);
-}
-
-
-/*
- * search_term: Parse CCL search term.
- * cclp: CCL Parser
- * qa: Qualifier attributes already applied.
- * term_list: tokens we accept as terms in context
- * multi: whether we accept "multiple" tokens
- * return: pointer to node(s); NULL on error.
- */
-static struct ccl_rpn_node *search_term_x (CCL_parser cclp,
- struct ccl_rpn_attr **qa,
- int *term_list, int multi)
-{
- struct ccl_rpn_node *p_top = 0;
- struct ccl_token *lookahead = cclp->look_token;
- int and_list = 0;
- int or_list = 0;
- char *attset;
- const char *truncation_aliases;
-
- truncation_aliases =
- ccl_qual_search_special(cclp->bibset, "truncation");
- if (!truncation_aliases)
- truncation_aliases = "?";
-
- if (qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_AND_LIST, 0))
- and_list = 1;
- if (qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_OR_LIST, 0))
- or_list = 1;
- while (1)
- {
- struct ccl_rpn_node *p;
- size_t no, i;
- int no_spaces = 0;
- int left_trunc = 0;
- int right_trunc = 0;
- int mid_trunc = 0;
- int relation_value = -1;
- int position_value = -1;
- int structure_value = -1;
- int truncation_value = -1;
- int completeness_value = -1;
- int len = 0;
- size_t max = 200;
- if (and_list || or_list || !multi)
- max = 1;
-
- /* ignore commas when dealing with and-lists .. */
- if (and_list && lookahead && lookahead->kind == CCL_TOK_COMMA)
- {
- lookahead = lookahead->next;
- ADVANCE;
- continue;
- }
- /* go through each TERM token. If no truncation attribute is yet
- met, then look for left/right truncation markers (?) and
- set left_trunc/right_trunc/mid_trunc accordingly */
- for (no = 0; no < max && is_term_ok(lookahead->kind, term_list); no++)
- {
- for (i = 0; i<lookahead->len; i++)
- if (lookahead->name[i] == ' ')
- no_spaces++;
- else if (strchr(truncation_aliases, lookahead->name[i]))
- {
- if (no == 0 && i == 0 && lookahead->len >= 1)
- left_trunc = 1;
- else if (!is_term_ok(lookahead->next->kind, term_list) &&
- i == lookahead->len-1 && i >= 1)
- right_trunc = 1;
- else
- mid_trunc = 1;
- }
- len += 1+lookahead->len;
- lookahead = lookahead->next;
- }
-
- if (len == 0)
- break; /* no more terms . stop . */
-
-
- if (p_top)
- {
- if (or_list)
- p = mk_node (CCL_RPN_OR);
- else if (and_list)
- p = mk_node (CCL_RPN_AND);
- else
- p = mk_node (CCL_RPN_AND);
- p->u.p[0] = p_top;
- p_top = p;
- }
-
- /* create the term node, but wait a moment before adding the term */
- p = mk_node (CCL_RPN_TERM);
- p->u.t.attr_list = NULL;
- p->u.t.term = NULL;
-
- /* make the top node point to us.. */
- if (p_top)
- p_top->u.p[1] = p;
- else
- p_top = p;
-
-
- /* go through all attributes and add them to the attribute list */
- for (i=0; qa && qa[i]; i++)
- {
- struct ccl_rpn_attr *attr;
-
- for (attr = qa[i]; attr; attr = attr->next)
- switch(attr->kind)
- {
- case CCL_RPN_ATTR_STRING:
- add_attr_string(p, attr->set, attr->type,
- attr->value.str);
- break;
- case CCL_RPN_ATTR_NUMERIC:
- if (attr->value.numeric > 0)
- { /* deal only with REAL attributes (positive) */
- switch (attr->type)
- {
- case CCL_BIB1_REL:
- if (relation_value != -1)
- continue;
- relation_value = attr->value.numeric;
- break;
- case CCL_BIB1_POS:
- if (position_value != -1)
- continue;
- position_value = attr->value.numeric;
- break;
- case CCL_BIB1_STR:
- if (structure_value != -1)
- continue;
- structure_value = attr->value.numeric;
- break;
- case CCL_BIB1_TRU:
- if (truncation_value != -1)
- continue;
- truncation_value = attr->value.numeric;
- left_trunc = right_trunc = mid_trunc = 0;
- break;
- case CCL_BIB1_COM:
- if (completeness_value != -1)
- continue;
- completeness_value = attr->value.numeric;
- break;
- }
- add_attr_numeric(p, attr->set, attr->type,
- attr->value.numeric);
- }
- }
- }
- /* len now holds the number of characters in the RPN term */
- /* no holds the number of CCL tokens (1 or more) */
-
- if (structure_value == -1 &&
- qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_WP, &attset))
- { /* no structure attribute met. Apply either structure attribute
- WORD or PHRASE depending on number of CCL tokens */
- if (no == 1 && no_spaces == 0)
- add_attr_numeric (p, attset, CCL_BIB1_STR, 2);
- else
- add_attr_numeric (p, attset, CCL_BIB1_STR, 1);
- }
-
- /* make the RPN token */
- p->u.t.term = (char *)xmalloc (len);
- ccl_assert (p->u.t.term);
- p->u.t.term[0] = '\0';
- for (i = 0; i<no; i++)
- {
- const char *src_str = cclp->look_token->name;
- int src_len = cclp->look_token->len;
-
- if (i == 0 && left_trunc)
- {
- src_len--;
- src_str++;
- }
- else if (i == no-1 && right_trunc)
- src_len--;
- if (src_len)
- {
- int len = strlen(p->u.t.term);
- if (len &&
- !strchr("-+", *src_str) &&
- !strchr("-+", p->u.t.term[len-1]))
- {
- strcat (p->u.t.term, " ");
- }
- }
- strxcat (p->u.t.term, src_str, src_len);
- ADVANCE;
- }
- if (left_trunc && right_trunc)
- {
- if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH,
- &attset))
- {
- cclp->error_code = CCL_ERR_TRUNC_NOT_BOTH;
- ccl_rpn_delete (p);
- return NULL;
- }
- add_attr_numeric (p, attset, CCL_BIB1_TRU, 3);
- }
- else if (right_trunc)
- {
- if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT,
- &attset))
- {
- cclp->error_code = CCL_ERR_TRUNC_NOT_RIGHT;
- ccl_rpn_delete (p);
- return NULL;
- }
- add_attr_numeric (p, attset, CCL_BIB1_TRU, 1);
- }
- else if (left_trunc)
- {
- if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT,
- &attset))
- {
- cclp->error_code = CCL_ERR_TRUNC_NOT_LEFT;
- ccl_rpn_delete (p);
- return NULL;
- }
- add_attr_numeric (p, attset, CCL_BIB1_TRU, 2);
- }
- else
- {
- if (qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_NONE,
- &attset))
- add_attr_numeric (p, attset, CCL_BIB1_TRU, 100);
- }
- if (!multi)
- break;
- }
- if (!p_top)
- cclp->error_code = CCL_ERR_TERM_EXPECTED;
- return p_top;
-}
-
-static struct ccl_rpn_node *search_term (CCL_parser cclp,
- struct ccl_rpn_attr **qa)
-{
- static int list[] = {CCL_TOK_TERM, CCL_TOK_COMMA, -1};
- return search_term_x(cclp, qa, list, 0);
-}
-
-static struct ccl_rpn_node *qualifiers2 (CCL_parser cclp,
- struct ccl_rpn_attr **ap)
-{
- char *attset;
- int rel;
-
- if (!qual_val_type(ap, CCL_BIB1_REL, CCL_BIB1_REL_ORDER, &attset))
- {
- /* unordered relation */
- struct ccl_rpn_node *p;
- if (KIND != CCL_TOK_EQ)
- {
- cclp->error_code = CCL_ERR_EQ_EXPECTED;
- return NULL;
- }
- ADVANCE;
- if (KIND == CCL_TOK_LP)
- {
- ADVANCE;
- if (!(p = find_spec (cclp, ap)))
- {
- return NULL;
- }
- if (KIND != CCL_TOK_RP)
- {
- cclp->error_code = CCL_ERR_RP_EXPECTED;
- ccl_rpn_delete (p);
- return NULL;
- }
- ADVANCE;
- }
- else
- p = search_terms (cclp, ap);
- return p;
- }
- /* ordered relation ... */
- rel = 0;
- if (cclp->look_token->len == 1)
- {
- if (cclp->look_token->name[0] == '<')
- rel = 1;
- else if (cclp->look_token->name[0] == '=')
- rel = 3;
- else if (cclp->look_token->name[0] == '>')
- rel = 5;
- }
- else if (cclp->look_token->len == 2)
- {
- if (!memcmp (cclp->look_token->name, "<=", 2))
- rel = 2;
- else if (!memcmp (cclp->look_token->name, ">=", 2))
- rel = 4;
- else if (!memcmp (cclp->look_token->name, "<>", 2))
- rel = 6;
- }
- if (!rel)
- cclp->error_code = CCL_ERR_BAD_RELATION;
- else
- {
- struct ccl_rpn_node *p;
-
- ADVANCE; /* skip relation */
- if (KIND == CCL_TOK_TERM &&
- cclp->look_token->next && cclp->look_token->next->len == 1 &&
- cclp->look_token->next->name[0] == '-')
- {
- struct ccl_rpn_node *p1;
- if (!(p1 = search_term (cclp, ap)))
- return NULL;
- ADVANCE; /* skip '-' */
- if (KIND == CCL_TOK_TERM) /* = term - term ? */
- {
- struct ccl_rpn_node *p2;
-
- if (!(p2 = search_term (cclp, ap)))
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- p = mk_node (CCL_RPN_AND);
- p->u.p[0] = p1;
- add_attr_numeric (p1, attset, CCL_BIB1_REL, 4);
- p->u.p[1] = p2;
- add_attr_numeric (p2, attset, CCL_BIB1_REL, 2);
- return p;
- }
- else /* = term - */
- {
- add_attr_numeric (p1, attset, CCL_BIB1_REL, 4);
- return p1;
- }
- }
- else if (cclp->look_token->len == 1 &&
- cclp->look_token->name[0] == '-') /* = - term ? */
- {
- ADVANCE;
- if (!(p = search_term (cclp, ap)))
- return NULL;
- add_attr_numeric (p, attset, CCL_BIB1_REL, 2);
- return p;
- }
- else if (KIND == CCL_TOK_LP)
- {
- ADVANCE;
- if (!(p = find_spec (cclp, ap)))
- return NULL;
- if (KIND != CCL_TOK_RP)
- {
- cclp->error_code = CCL_ERR_RP_EXPECTED;
- ccl_rpn_delete (p);
- return NULL;
- }
- ADVANCE;
- return p;
- }
- else
- {
- if (!(p = search_terms (cclp, ap)))
- return NULL;
- add_attr_numeric (p, attset, CCL_BIB1_REL, rel);
- return p;
- }
- cclp->error_code = CCL_ERR_TERM_EXPECTED;
- }
- return NULL;
-}
-
-/*
- * qualifiers1: Parse CCL qualifiers and search terms.
- * cclp: CCL Parser
- * la: Token pointer to RELATION token.
- * qa: Qualifier attributes already applied.
- * return: pointer to node(s); NULL on error.
- */
-static struct ccl_rpn_node *qualifiers1 (CCL_parser cclp, struct ccl_token *la,
- struct ccl_rpn_attr **qa)
-{
- struct ccl_token *lookahead = cclp->look_token;
- struct ccl_token *look_start = cclp->look_token;
- struct ccl_rpn_attr **ap;
- struct ccl_rpn_node *node = 0;
- const char *field_str;
- int no = 0;
- int seq = 0;
- int i;
- int mode_merge = 1;
-#if 0
- if (qa)
- {
- cclp->error_code = CCL_ERR_DOUBLE_QUAL;
- return NULL;
- }
-#endif
- for (lookahead = cclp->look_token; lookahead != la;
- lookahead=lookahead->next)
- no++;
- if (qa)
- for (i=0; qa[i]; i++)
- no++;
- ap = (struct ccl_rpn_attr **)xmalloc ((no ? (no+1) : 2) * sizeof(*ap));
- ccl_assert (ap);
-
- field_str = ccl_qual_search_special(cclp->bibset, "field");
- if (field_str)
- {
- if (!strcmp (field_str, "or"))
- mode_merge = 0;
- else if (!strcmp (field_str, "merge"))
- mode_merge = 1;
- }
- if (!mode_merge)
- {
- /* consider each field separately and OR */
- lookahead = look_start;
- while (lookahead != la)
- {
- ap[1] = 0;
- seq = 0;
- while ((ap[0] = ccl_qual_search (cclp, lookahead->name,
- lookahead->len, seq)) != 0)
- {
- struct ccl_rpn_node *node_sub;
- cclp->look_token = la;
-
- node_sub = qualifiers2(cclp, ap);
- if (!node_sub)
- {
- ccl_rpn_delete (node);
- xfree (ap);
- return 0;
- }
- if (node)
- {
- struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
- node_this->u.p[0] = node;
- node_this->u.p[1] = node_sub;
- node = node_this;
- }
- else
- node = node_sub;
- seq++;
- }
- if (seq == 0)
- {
- cclp->look_token = lookahead;
- cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
- xfree (ap);
- return NULL;
- }
- lookahead = lookahead->next;
- if (lookahead->kind == CCL_TOK_COMMA)
- lookahead = lookahead->next;
- }
- }
- else
- {
- /* merge attributes from ALL fields - including inherited ones */
- while (1)
- {
- struct ccl_rpn_node *node_sub;
- int found = 0;
- lookahead = look_start;
- for (i = 0; lookahead != la; i++)
- {
- ap[i] = ccl_qual_search (cclp, lookahead->name,
- lookahead->len, seq);
- if (ap[i])
- found++;
- if (!ap[i] && seq > 0)
- ap[i] = ccl_qual_search (cclp, lookahead->name,
- lookahead->len, 0);
- if (!ap[i])
- {
- cclp->look_token = lookahead;
- cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
- xfree (ap);
- return NULL;
- }
- lookahead = lookahead->next;
- if (lookahead->kind == CCL_TOK_COMMA)
- lookahead = lookahead->next;
- }
- if (qa)
- {
- struct ccl_rpn_attr **qa0 = qa;
-
- while (*qa0)
- ap[i++] = *qa0++;
- }
- ap[i] = NULL;
-
- if (!found)
- break;
-
- cclp->look_token = lookahead;
-
- node_sub = qualifiers2(cclp, ap);
- if (!node_sub)
- {
- ccl_rpn_delete (node);
- break;
- }
- if (node)
- {
- struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
- node_this->u.p[0] = node;
- node_this->u.p[1] = node_sub;
- node = node_this;
- }
- else
- node = node_sub;
- seq++;
- }
- }
- xfree (ap);
- return node;
-}
-
-
-/*
- * search_terms: Parse CCL search terms - including proximity.
- * cclp: CCL Parser
- * qa: Qualifier attributes already applied.
- * return: pointer to node(s); NULL on error.
- */
-static struct ccl_rpn_node *search_terms (CCL_parser cclp,
- struct ccl_rpn_attr **qa)
-{
- static int list[] = {
- CCL_TOK_TERM, CCL_TOK_COMMA,CCL_TOK_EQ, CCL_TOK_REL, CCL_TOK_SET, -1};
- struct ccl_rpn_node *p1, *p2, *pn;
- p1 = search_term_x (cclp, qa, list, 1);
- if (!p1)
- return NULL;
- while (1)
- {
- if (KIND == CCL_TOK_PROX)
- {
- struct ccl_rpn_node *p_prox = 0;
- /* ! word order specified */
- /* % word order not specified */
- p_prox = mk_node(CCL_RPN_TERM);
- p_prox->u.t.term = (char *) xmalloc(cclp->look_token->len);
- memcpy(p_prox->u.t.term, cclp->look_token->name,
- cclp->look_token->len);
- p_prox->u.t.term[cclp->look_token->len] = 0;
- p_prox->u.t.attr_list = 0;
-
- ADVANCE;
- p2 = search_term_x (cclp, qa, list, 1);
- if (!p2)
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- pn = mk_node (CCL_RPN_PROX);
- pn->u.p[0] = p1;
- pn->u.p[1] = p2;
- pn->u.p[2] = p_prox;
- p1 = pn;
- }
- else if (is_term_ok(KIND, list))
- {
- p2 = search_term_x (cclp, qa, list, 1);
- if (!p2)
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- pn = mk_node (CCL_RPN_PROX);
- pn->u.p[0] = p1;
- pn->u.p[1] = p2;
- pn->u.p[2] = 0;
- p1 = pn;
- }
- else
- break;
- }
- return p1;
-}
-
-/*
- * search_elements: Parse CCL search elements
- * cclp: CCL Parser
- * qa: Qualifier attributes already applied.
- * return: pointer to node(s); NULL on error.
- */
-static struct ccl_rpn_node *search_elements (CCL_parser cclp,
- struct ccl_rpn_attr **qa)
-{
- struct ccl_rpn_node *p1;
- struct ccl_token *lookahead;
- if (KIND == CCL_TOK_LP)
- {
- ADVANCE;
- p1 = find_spec (cclp, qa);
- if (!p1)
- return NULL;
- if (KIND != CCL_TOK_RP)
- {
- cclp->error_code = CCL_ERR_RP_EXPECTED;
- ccl_rpn_delete (p1);
- return NULL;
- }
- ADVANCE;
- return p1;
- }
- else if (KIND == CCL_TOK_SET)
- {
- ADVANCE;
- if (KIND == CCL_TOK_EQ)
- ADVANCE;
- if (KIND != CCL_TOK_TERM)
- {
- cclp->error_code = CCL_ERR_SETNAME_EXPECTED;
- return NULL;
- }
- p1 = mk_node (CCL_RPN_SET);
- p1->u.setname = copy_token_name (cclp->look_token);
- ADVANCE;
- return p1;
- }
- lookahead = cclp->look_token;
-
- while (lookahead->kind==CCL_TOK_TERM)
- {
- lookahead = lookahead->next;
- if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
- return qualifiers1 (cclp, lookahead, qa);
- if (lookahead->kind != CCL_TOK_COMMA)
- break;
- lookahead = lookahead->next;
- }
- if (qa)
- return search_terms (cclp, qa);
- else
- {
- struct ccl_rpn_attr *qa[2];
- struct ccl_rpn_node *node = 0;
- int seq;
- lookahead = cclp->look_token;
-
- qa[1] = 0;
- for(seq = 0; ;seq++)
- {
- struct ccl_rpn_node *node_sub;
- qa[0] = ccl_qual_search(cclp, "term", 4, seq);
- if (!qa[0])
- break;
-
- cclp->look_token = lookahead;
-
- node_sub = search_terms (cclp, qa);
- if (!node_sub)
- {
- ccl_rpn_delete (node);
- return 0;
- }
- if (node)
- {
- struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
- node_this->u.p[0] = node;
- node_this->u.p[1] = node_sub;
- node_this->u.p[2] = 0;
- node = node_this;
- }
- else
- node = node_sub;
- }
- if (!node)
- node = search_terms (cclp, 0);
- return node;
- }
-}
-
-/*
- * find_spec: Parse CCL find specification
- * cclp: CCL Parser
- * qa: Qualifier attributes already applied.
- * return: pointer to node(s); NULL on error.
- */
-static struct ccl_rpn_node *find_spec (CCL_parser cclp,
- struct ccl_rpn_attr **qa)
-{
- struct ccl_rpn_node *p1, *p2, *pn;
- if (!(p1 = search_elements (cclp, qa)))
- return NULL;
- while (1)
- {
- switch (KIND)
- {
- case CCL_TOK_AND:
- ADVANCE;
- p2 = search_elements (cclp, qa);
- if (!p2)
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- pn = mk_node (CCL_RPN_AND);
- pn->u.p[0] = p1;
- pn->u.p[1] = p2;
- pn->u.p[2] = 0;
- p1 = pn;
- continue;
- case CCL_TOK_OR:
- ADVANCE;
- p2 = search_elements (cclp, qa);
- if (!p2)
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- pn = mk_node (CCL_RPN_OR);
- pn->u.p[0] = p1;
- pn->u.p[1] = p2;
- pn->u.p[2] = 0;
- p1 = pn;
- continue;
- case CCL_TOK_NOT:
- ADVANCE;
- p2 = search_elements (cclp, qa);
- if (!p2)
- {
- ccl_rpn_delete (p1);
- return NULL;
- }
- pn = mk_node (CCL_RPN_NOT);
- pn->u.p[0] = p1;
- pn->u.p[1] = p2;
- pn->u.p[2] = 0;
- p1 = pn;
- continue;
- }
- break;
- }
- return p1;
-}
-
-struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list)
-{
- struct ccl_rpn_node *p;
-
-
-
- cclp->look_token = list;
- p = find_spec (cclp, NULL);
- if (p && KIND != CCL_TOK_EOL)
- {
- if (KIND == CCL_TOK_RP)
- cclp->error_code = CCL_ERR_BAD_RP;
- else
- cclp->error_code = CCL_ERR_OP_EXPECTED;
- ccl_rpn_delete (p);
- p = NULL;
- }
- cclp->error_pos = cclp->look_token->name;
- if (p)
- cclp->error_code = CCL_ERR_OK;
- else
- cclp->error_code = cclp->error_code;
- return p;
-}
-
-/*
- * ccl_find: Parse CCL find - token representation
- * bibset: Bibset to be used for the parsing
- * list: List of tokens
- * error: Pointer to integer. Holds error no. on completion.
- * pos: Pointer to char position. Holds approximate error position.
- * return: RPN tree on successful completion; NULL otherwise.
- */
-struct ccl_rpn_node *ccl_find (CCL_bibset bibset, struct ccl_token *list,
- int *error, const char **pos)
-{
- struct ccl_rpn_node *p;
- CCL_parser cclp = ccl_parser_create ();
-
- cclp->bibset = bibset;
-
- p = ccl_parser_find (cclp, list);
-
- *error = cclp->error_code;
- *pos = cclp->error_pos;
-
- ccl_parser_destroy (cclp);
-
- return p;
-}
-
-/*
- * ccl_find_str: Parse CCL find - string representation
- * bibset: Bibset to be used for the parsing
- * str: String to be parsed
- * error: Pointer to integer. Holds error no. on completion.
- * pos: Pointer to char position. Holds approximate error position.
- * return: RPN tree on successful completion; NULL otherwise.
- */
-struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
- int *error, int *pos)
-{
- CCL_parser cclp = ccl_parser_create ();
- struct ccl_token *list;
- struct ccl_rpn_node *p;
-
- cclp->bibset = bibset;
-
- list = ccl_parser_tokenize (cclp, str);
- p = ccl_parser_find (cclp, list);
-
- *error = cclp->error_code;
- if (*error)
- *pos = cclp->error_pos - str;
- ccl_parser_destroy (cclp);
- ccl_token_del (list);
- return p;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL print rpn tree - infix notation
- * Europagate, 1995
- *
- * $Id: cclptree.c,v 1.15 2003-10-16 10:18:29 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.6 1995/05/16 09:39:26 adam
- * LICENSE.
- *
- * Revision 1.5 1995/02/23 08:31:59 adam
- * Changed header.
- *
- * Revision 1.3 1995/02/15 17:42:16 adam
- * Minor changes of the api of this module. FILE* argument added
- * to ccl_pr_tree.
- *
- * Revision 1.2 1995/02/14 19:55:11 adam
- * Header files ccl.h/cclp.h are gone! They have been merged an
- * moved to ../include/ccl.h.
- * Node kind(s) in ccl_rpn_node have changed names.
- *
- * Revision 1.1 1995/02/14 10:25:56 adam
- * The constructions 'qualifier rel term ...' implemented.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/ccl.h>
-
-void fprintSpaces(int indent,FILE * fd_out)
-{
- char buf[100];
- sprintf(buf,"%%%d.s",indent);
- fprintf(fd_out,buf," ");
-}
-
-void ccl_pr_tree_as_qrpn(struct ccl_rpn_node *rpn, FILE *fd_out, int indent)
-{
- if(indent>0) fprintSpaces(indent,fd_out);
- switch (rpn->kind)
- {
- case CCL_RPN_TERM:
- if (rpn->u.t.attr_list)
- {
- struct ccl_rpn_attr *attr;
- for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
- {
- if (attr->set)
- fprintf(fd_out, "@attr %s", attr->set);
- else
- fprintf(fd_out, "@attr ");
- switch(attr->kind)
- {
- case CCL_RPN_ATTR_NUMERIC:
- fprintf (fd_out, "%d=%d ", attr->type,
- attr->value.numeric);
- break;
- case CCL_RPN_ATTR_STRING:
- fprintf (fd_out, "%d=%s ", attr->type,
- attr->value.str);
- }
- }
- }
- fprintf (fd_out, "\"%s\"\n", rpn->u.t.term);
- break;
- case CCL_RPN_AND:
- fprintf (fd_out, "@and \n");
- ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
- ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
- break;
- case CCL_RPN_OR:
- fprintf (fd_out, "@or \n");
- ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
- ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
- break;
- case CCL_RPN_NOT:
- fprintf (fd_out, "@not ");
- ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
- ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
- break;
- case CCL_RPN_SET:
- fprintf (fd_out, "set=%s ", rpn->u.setname);
- break;
- case CCL_RPN_PROX:
- if (rpn->u.p[2] && rpn->u.p[2]->kind == CCL_RPN_TERM)
- {
- const char *cp = rpn->u.p[2]->u.t.term;
- /* exlusion distance ordered relation which-code unit-code */
- if (*cp == '!')
- {
- /* word order specified */
- if (isdigit(cp[1]))
- fprintf(fd_out, "@prox 0 %s 1 2 known 2", cp+1);
- else
- fprintf(fd_out, "@prox 0 1 1 2 known 2");
- }
- else if (*cp == '%')
- {
- /* word order not specified */
- if (isdigit(cp[1]))
- fprintf(fd_out, "@prox 0 %s 0 2 known 2", cp+1);
- else
- fprintf(fd_out, "@prox 0 1 0 2 known 2");
- }
- }
- ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
- ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
- break;
- default:
- fprintf(stderr,"Internal Error Unknown ccl_rpn node type %d\n",rpn->kind);
- }
-}
-
-
-void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out)
-{
- ccl_pr_tree_as_qrpn(rpn,fd_out,0);
-}
-
-
-static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
-{
- switch (p->kind)
- {
- case CCL_RPN_AND:
- wrbuf_puts(w, "@and ");
- break;
- case CCL_RPN_OR:
- wrbuf_puts(w, "@or ");
- break;
- case CCL_RPN_NOT:
- wrbuf_puts(w, "@not ");
- break;
- case CCL_RPN_PROX:
- if (p->u.p[2] && p->u.p[2]->kind == CCL_RPN_TERM)
- {
- const char *cp = p->u.p[2]->u.t.term;
- /* exlusion distance ordered relation which-code unit-code */
- if (*cp == '!')
- {
- /* word order specified */
- if (isdigit(cp[1]))
- wrbuf_printf(w, "@prox 0 %s 1 2 k 2 ", cp+1);
- else
- wrbuf_printf(w, "@prox 0 1 1 2 k 2 ");
- }
- else if (*cp == '%')
- {
- /* word order not specified */
- if (isdigit(cp[1]))
- wrbuf_printf(w, "@prox 0 %s 0 2 k 2 ", cp+1);
- else
- wrbuf_printf(w, "@prox 0 1 0 2 k 2 ");
- }
- }
- else
- wrbuf_puts(w, "@prox 0 2 0 1 k 2 ");
- break;
- default:
- wrbuf_puts(w, "@ bad op (unknown) ");
- }
- ccl_pquery(w, p->u.p[0]);
- ccl_pquery(w, p->u.p[1]);
-}
-
-void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
-{
- struct ccl_rpn_attr *att;
- const char *cp;
-
- switch (p->kind)
- {
- case CCL_RPN_AND:
- case CCL_RPN_OR:
- case CCL_RPN_NOT:
- case CCL_RPN_PROX:
- ccl_pquery_complex (w, p);
- break;
- case CCL_RPN_SET:
- wrbuf_puts (w, "@set ");
- wrbuf_puts (w, p->u.setname);
- wrbuf_puts (w, " ");
- break;
- case CCL_RPN_TERM:
- for (att = p->u.t.attr_list; att; att = att->next)
- {
- char tmpattr[128];
- wrbuf_puts (w, "@attr ");
- if (att->set)
- {
- wrbuf_puts (w, att->set);
- wrbuf_puts (w, " ");
- }
- switch(att->kind)
- {
- case CCL_RPN_ATTR_NUMERIC:
- sprintf(tmpattr, "%d=%d ", att->type, att->value.numeric);
- wrbuf_puts (w, tmpattr);
- break;
- case CCL_RPN_ATTR_STRING:
- sprintf(tmpattr, "%d=", att->type);
- wrbuf_puts (w, tmpattr);
- wrbuf_puts(w, att->value.str);
- wrbuf_puts (w, " ");
- break;
- }
- }
- for (cp = p->u.t.term; *cp; cp++)
- {
- if (*cp == ' ' || *cp == '\\')
- wrbuf_putc (w, '\\');
- wrbuf_putc (w, *cp);
- }
- wrbuf_puts (w, " ");
- break;
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL qualifiers
- * Europagate, 1995
- *
- * $Id: cclqfile.c,v 1.14 2003-06-23 10:22:21 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.3 1995/05/16 09:39:26 adam
- * LICENSE.
- *
- * Revision 1.2 1995/05/11 14:03:56 adam
- * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
- * New variable ccl_case_sensitive, which controls whether reserved
- * words and field names are case sensitive or not.
- *
- * Revision 1.1 1995/04/17 09:31:45 adam
- * Improved handling of qualifiers. Aliases or reserved words.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <yaz/ccl.h>
-
-void ccl_qual_field (CCL_bibset bibset, const char *cp, const char *qual_name)
-{
- char qual_spec[128];
- int type_ar[128];
- int value_ar[128];
- char *svalue_ar[128];
- char *attsets[128];
- int pair_no = 0;
-
- while (pair_no < 128)
- {
- char *qual_value, *qual_type;
- char *split, *setp;
- int no_scan = 0;
-
- if (sscanf (cp, "%100s%n", qual_spec, &no_scan) < 1)
- break;
-
- if (!(split = strchr (qual_spec, '=')))
- {
- /* alias specification .. */
- if (pair_no == 0)
- {
- ccl_qual_add_combi (bibset, qual_name, cp);
- return;
- }
- break;
- }
- /* [set,]type=value ... */
- cp += no_scan;
-
- *split++ = '\0';
-
- setp = strchr (qual_spec, ',');
- if (setp)
- {
- /* set,type=value ... */
- *setp++ = '\0';
- qual_type = setp;
- }
- else
- {
- /* type=value ... */
- qual_type = qual_spec;
- }
- while (pair_no < 128)
- {
- int type, value;
-
- qual_value = split;
- if ((split = strchr (qual_value, ',')))
- *split++ = '\0';
-
- value = 0;
- switch (qual_type[0])
- {
- case 'u':
- case 'U':
- type = CCL_BIB1_USE;
- break;
- case 'r':
- case 'R':
- type = CCL_BIB1_REL;
- if (!ccl_stricmp (qual_value, "o"))
- value = CCL_BIB1_REL_ORDER;
- break;
- case 'p':
- case 'P':
- type = CCL_BIB1_POS;
- break;
- case 's':
- case 'S':
- type = CCL_BIB1_STR;
- if (!ccl_stricmp (qual_value, "pw"))
- value = CCL_BIB1_STR_WP;
- if (!ccl_stricmp (qual_value, "al"))
- value = CCL_BIB1_STR_AND_LIST;
- if (!ccl_stricmp (qual_value, "ol"))
- value = CCL_BIB1_STR_OR_LIST;
- break;
- case 't':
- case 'T':
- type = CCL_BIB1_TRU;
- if (!ccl_stricmp (qual_value, "l"))
- value = CCL_BIB1_TRU_CAN_LEFT;
- else if (!ccl_stricmp (qual_value, "r"))
- value = CCL_BIB1_TRU_CAN_RIGHT;
- else if (!ccl_stricmp (qual_value, "b"))
- value = CCL_BIB1_TRU_CAN_BOTH;
- else if (!ccl_stricmp (qual_value, "n"))
- value = CCL_BIB1_TRU_CAN_NONE;
- break;
- case 'c':
- case 'C':
- type = CCL_BIB1_COM;
- break;
- default:
- type = atoi (qual_type);
- }
-
- type_ar[pair_no] = type;
-
- if (value)
- {
- value_ar[pair_no] = value;
- svalue_ar[pair_no] = 0;
- }
- else if (*qual_value >= '0' && *qual_value <= '9')
- {
- value_ar[pair_no] = atoi (qual_value);
- svalue_ar[pair_no] = 0;
- }
- else
- {
- size_t len;
- if (split)
- len = split - qual_value;
- else
- len = strlen(qual_value);
- svalue_ar[pair_no] = xmalloc(len+1);
- memcpy(svalue_ar[pair_no], qual_value, len);
- svalue_ar[pair_no][len] = '\0';
- }
- if (setp)
- {
- attsets[pair_no] = (char*) xmalloc (strlen(qual_spec)+1);
- strcpy (attsets[pair_no], qual_spec);
- }
- else
- attsets[pair_no] = 0;
- pair_no++;
- if (!split)
- break;
- }
- }
- ccl_qual_add_set (bibset, qual_name, pair_no, type_ar, value_ar, svalue_ar,
- attsets);
-}
-
-void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name)
-{
- if (*qual_name == '@')
- ccl_qual_add_special(bibset, qual_name+1, cp);
- else
- ccl_qual_field(bibset, cp, qual_name);
-}
-
-/*
- * ccl_qual_file: Read bibset definition from file.
- * bibset: Bibset
- * inf: FILE pointer.
- *
- * Each line format is:
- * <name> <t>=<v> <t>=<v> ....
- * Where <name> is name of qualifier;
- * <t>=<v> is a attribute definition pair where <t> is one of:
- * u(use), r(relation), p(position), t(truncation), c(completeness)
- * or plain integer.
- * <v> is an integer or special pseudo-value.
- */
-void ccl_qual_file (CCL_bibset bibset, FILE *inf)
-{
- char line[256];
- char *cp, *cp1;
- char qual_name[128];
-
- while (fgets (line, 255, inf))
- {
- int no_scan = 0;
-
- cp = line;
- if (*cp == '#')
- continue; /* ignore lines starting with # */
- if (sscanf (cp, "%100s%n", qual_name, &no_scan) < 1)
- continue; /* also ignore empty lines */
- cp += no_scan;
- cp1 = strchr(cp, '#');
- if (cp1)
- *cp1 = '\0';
- ccl_qual_fitem (bibset, cp, qual_name);
- }
-}
-
-int ccl_qual_fname (CCL_bibset bibset, const char *fname)
-{
- FILE *inf;
- inf = fopen (fname, "r");
- if (!inf)
- return -1;
- ccl_qual_file (bibset, inf);
- fclose (inf);
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL qualifiers
- * Europagate, 1995
- *
- * $Id: cclqual.c,v 1.19 2003-06-23 10:22:21 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.9 1995/05/16 09:39:27 adam
- * LICENSE.
- *
- * Revision 1.8 1995/05/11 14:03:57 adam
- * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
- * New variable ccl_case_sensitive, which controls whether reserved
- * words and field names are case sensitive or not.
- *
- * Revision 1.7 1995/04/17 09:31:46 adam
- * Improved handling of qualifiers. Aliases or reserved words.
- *
- * Revision 1.6 1995/02/23 08:32:00 adam
- * Changed header.
- *
- * Revision 1.4 1995/02/14 19:55:12 adam
- * Header files ccl.h/cclp.h are gone! They have been merged an
- * moved to ../include/ccl.h.
- * Node kind(s) in ccl_rpn_node have changed names.
- *
- * Revision 1.3 1995/02/14 16:20:56 adam
- * Qualifiers are read from a file now.
- *
- * Revision 1.2 1995/02/14 10:25:56 adam
- * The constructions 'qualifier rel term ...' implemented.
- *
- * Revision 1.1 1995/02/13 15:15:07 adam
- * Added handling of qualifiers. Not finished yet.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <yaz/ccl.h>
-
-/* Definition of CCL_bibset pointer */
-struct ccl_qualifiers {
- struct ccl_qualifier *list;
- struct ccl_qualifier_special *special;
-};
-
-
-/* CCL Qualifier special */
-struct ccl_qualifier_special {
- char *name;
- char *value;
- struct ccl_qualifier_special *next;
-};
-
-
-static struct ccl_qualifier *ccl_qual_lookup (CCL_bibset b,
- const char *n, size_t len)
-{
- struct ccl_qualifier *q;
- for (q = b->list; q; q = q->next)
- if (len == strlen(q->name) && !memcmp (q->name, n, len))
- break;
- return q;
-}
-
-
-void ccl_qual_add_special (CCL_bibset bibset, const char *n, const char *v)
-{
- struct ccl_qualifier_special *p;
- const char *pe;
-
- for (p = bibset->special; p && strcmp(p->name, n); p = p->next)
- ;
- if (p)
- xfree (p->value);
- else
- {
- p = (struct ccl_qualifier_special *) xmalloc (sizeof(*p));
- p->name = ccl_strdup (n);
- p->value = 0;
- p->next = bibset->special;
- bibset->special = p;
- }
- while (strchr(" \t", *v))
- ++v;
- for (pe = v + strlen(v); pe != v; --pe)
- if (!strchr(" \n\r\t", pe[-1]))
- break;
- p->value = (char*) xmalloc (pe - v + 1);
- if (pe - v)
- memcpy (p->value, v, pe - v);
- p->value[pe - v] = '\0';
-}
-
-static int next_token(const char **cpp, const char **dst)
-{
- int len = 0;
- const char *cp = *cpp;
- while (*cp && strchr(" \r\n\t\f", *cp))
- cp++;
- if (dst)
- *dst = cp;
- len = 0;
- while (*cp && !strchr(" \r\n\t\f", *cp))
- {
- cp++;
- len++;
- }
- *cpp = cp;
- return len;
-}
-
-void ccl_qual_add_combi (CCL_bibset b, const char *n, const char *names)
-{
- const char *cp, *cp1;
- int i, len;
- struct ccl_qualifier *q;
- for (q = b->list; q && strcmp(q->name, n); q = q->next)
- ;
- if (q)
- return ;
- q = (struct ccl_qualifier *) xmalloc (sizeof(*q));
- q->name = ccl_strdup (n);
- q->attr_list = 0;
- q->next = b->list;
- b->list = q;
-
- cp = names;
- for (i = 0; next_token(&cp, 0); i++)
- ;
- q->no_sub = i;
- q->sub = (struct ccl_qualifier **) xmalloc (sizeof(*q->sub) *
- (1+q->no_sub));
- cp = names;
- for (i = 0; (len = next_token(&cp, &cp1)); i++)
- {
- q->sub[i] = ccl_qual_lookup (b, cp1, len);
- }
-}
-
-/*
- * ccl_qual_add: Add qualifier to Bibset. If qualifier already
- * exists, then attributes are appendend to old
- * definition.
- * name: name of qualifier
- * no: No of attribute type/value pairs.
- * pairs: Attributes. pairs[0] first type, pair[1] first value,
- * ... pair[2*no-2] last type, pair[2*no-1] last value.
- */
-
-void ccl_qual_add_set (CCL_bibset b, const char *name, int no,
- int *type_ar, int *value_ar, char **svalue_ar,
- char **attsets)
-{
- struct ccl_qualifier *q;
- struct ccl_rpn_attr **attrp;
-
- ccl_assert (b);
- for (q = b->list; q; q = q->next)
- if (!strcmp (name, q->name))
- break;
- if (!q)
- {
- struct ccl_qualifier *new_qual =
- (struct ccl_qualifier *)xmalloc (sizeof(*new_qual));
- ccl_assert (new_qual);
-
- new_qual->next = b->list;
- b->list = new_qual;
-
- new_qual->name = ccl_strdup (name);
- attrp = &new_qual->attr_list;
-
- new_qual->no_sub = 0;
- new_qual->sub = 0;
- }
- else
- {
- if (q->sub) /* suspect.. */
- xfree (q->sub);
- attrp = &q->attr_list;
- while (*attrp)
- attrp = &(*attrp)->next;
- }
- while (--no >= 0)
- {
- struct ccl_rpn_attr *attr;
-
- attr = (struct ccl_rpn_attr *)xmalloc (sizeof(*attr));
- ccl_assert (attr);
- attr->set = *attsets++;
- attr->type = *type_ar++;
- if (*svalue_ar)
- {
- attr->kind = CCL_RPN_ATTR_STRING;
- attr->value.str = *svalue_ar;
- }
- else
- {
- attr->kind = CCL_RPN_ATTR_NUMERIC;
- attr->value.numeric = *value_ar;
- }
- svalue_ar++;
- value_ar++;
- *attrp = attr;
- attrp = &attr->next;
- }
- *attrp = NULL;
-}
-
-/*
- * ccl_qual_mk: Make new (empty) bibset.
- * return: empty bibset.
- */
-CCL_bibset ccl_qual_mk (void)
-{
- CCL_bibset b = (CCL_bibset)xmalloc (sizeof(*b));
- ccl_assert (b);
- b->list = NULL;
- b->special = NULL;
- return b;
-}
-
-/*
- * ccl_qual_rm: Delete bibset.
- * b: pointer to bibset
- */
-void ccl_qual_rm (CCL_bibset *b)
-{
- struct ccl_qualifier *q, *q1;
- struct ccl_qualifier_special *sp, *sp1;
-
- if (!*b)
- return;
- for (q = (*b)->list; q; q = q1)
- {
- struct ccl_rpn_attr *attr, *attr1;
-
- for (attr = q->attr_list; attr; attr = attr1)
- {
- attr1 = attr->next;
- if (attr->set)
- xfree(attr->set);
- if (attr->kind == CCL_RPN_ATTR_STRING)
- xfree(attr->value.str);
- xfree (attr);
- }
- q1 = q->next;
- xfree (q->name);
- if (q->sub)
- xfree (q->sub);
- xfree (q);
- }
- for (sp = (*b)->special; sp; sp = sp1)
- {
- sp1 = sp->next;
- xfree (sp->name);
- xfree (sp->value);
- xfree (sp);
- }
- xfree (*b);
- *b = NULL;
-}
-
-/*
- * ccl_qual_search: Search for qualifier in bibset.
- * b: Bibset
- * name: Name of qualifier to search for (need no null-termination)
- * len: Length of name.
- * return: Attribute info. NULL if not found.
- */
-struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp,
- const char *name, size_t len,
- int seq)
-{
- struct ccl_qualifier *q;
- const char *aliases;
- int case_sensitive = cclp->ccl_case_sensitive;
-
- ccl_assert (cclp);
- if (!cclp->bibset)
- return NULL;
-
- aliases = ccl_qual_search_special(cclp->bibset, "case");
- if (aliases)
- case_sensitive = atoi(aliases);
-
- for (q = cclp->bibset->list; q; q = q->next)
- if (strlen(q->name) == len)
- {
- if (case_sensitive)
- {
- if (!memcmp (name, q->name, len))
- break;
- }
- else
- {
- if (!ccl_memicmp (name, q->name, len))
- break;
- }
- }
- if (q)
- {
- if (q->attr_list && seq == 0)
- return q->attr_list;
- if (seq < q->no_sub && q->sub[seq])
- {
- return q->sub[seq]->attr_list;
- }
- }
- return 0;
-}
-
-const char *ccl_qual_search_special (CCL_bibset b,
- const char *name)
-{
- struct ccl_qualifier_special *q;
- if (!b)
- return 0;
- for (q = b->special; q && strcmp(q->name, name); q = q->next)
- ;
- if (q)
- return q->value;
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL shell.
- * Europagate 1995
- *
- * $Id: cclsh.c,v 1.11 2001-11-27 22:38:50 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.11 1995/05/16 09:39:27 adam
- * LICENSE.
- *
- * Revision 1.10 1995/05/11 14:03:57 adam
- * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
- * New variable ccl_case_sensitive, which controls whether reserved
- * words and field names are case sensitive or not.
- *
- * Revision 1.9 1995/02/23 08:32:00 adam
- * Changed header.
- *
- * Revision 1.7 1995/02/15 17:42:16 adam
- * Minor changes of the api of this module. FILE* argument added
- * to ccl_pr_tree.
- *
- * Revision 1.6 1995/02/14 19:55:13 adam
- * Header files ccl.h/cclp.h are gone! They have been merged an
- * moved to ../include/ccl.h.
- * Node kind(s) in ccl_rpn_node have changed names.
- *
- * Revision 1.5 1995/02/14 16:20:57 adam
- * Qualifiers are read from a file now.
- *
- * Revision 1.4 1995/02/14 14:12:42 adam
- * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
- *
- * Revision 1.3 1995/02/14 10:25:57 adam
- * The constructions 'qualifier rel term ...' implemented.
- *
- * Revision 1.2 1995/02/13 15:15:07 adam
- * Added handling of qualifiers. Not finished yet.
- *
- * Revision 1.1 1995/02/13 12:35:21 adam
- * First version of CCL. Qualifiers aren't handled yet.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <yaz/ccl.h>
-
-
-#if HAVE_READLINE_READLINE_H
-#include <readline/readline.h>
-#endif
-#if HAVE_READLINE_HISTORY_H
-#include <readline/history.h>
-#endif
-
-
-static int debug = 0;
-static char *prog;
-
-void usage(const char *prog)
-{
- fprintf (stderr, "%s: [-d] [-b configfile]\n", prog);
- exit (1);
-}
-
-int main (int argc, char **argv)
-{
- CCL_bibset bibset;
- FILE *bib_inf;
- char *bib_fname;
-
- prog = *argv;
- bibset = ccl_qual_mk ();
- while (--argc > 0)
- {
- if (**++argv == '-')
- {
- switch (argv[0][1])
- {
- case 'd':
- debug = 1;
- break;
- case 'b':
- if (argv[0][2])
- bib_fname = argv[0]+2;
- else if (argc > 0)
- {
- --argc;
- bib_fname = *++argv;
- }
- else
- {
- fprintf (stderr, "%s: missing bib filename\n", prog);
- exit (1);
- }
- bib_inf = fopen (bib_fname, "r");
- if (!bib_inf)
- {
- fprintf (stderr, "%s: cannot open %s\n", prog,
- bib_fname);
- exit (1);
- }
- ccl_qual_file (bibset, bib_inf);
- fclose (bib_inf);
- break;
- default:
- usage(prog);
- }
- }
- else
- {
- fprintf (stderr, "%s: no filenames, please\n", prog);
- exit (1);
- }
- }
- while (1)
- {
- char buf[1000];
- int i, error, pos;
- struct ccl_rpn_node *rpn;
-
-#if HAVE_READLINE_READLINE_H
- char* line_in;
- line_in=readline("CCLSH>");
- if (!line_in)
- break;
-#if HAVE_READLINE_HISTORY_H
- if (*line_in)
- add_history(line_in);
-#endif
- if (strlen(line_in) > 999) {
- fprintf(stderr,"Input line to long\n");
- break;
- }
- strcpy(buf,line_in);
- free (line_in);
-#else
- printf ("CCLSH>"); fflush (stdout);
- if (!fgets (buf, 999, stdin))
- break;
-#endif
-
- for (i = 0; i<1; i++)
- {
- CCL_parser cclp = ccl_parser_create ();
- struct ccl_token *list;
-
- cclp->bibset = bibset;
-
- list = ccl_parser_tokenize (cclp, buf);
- rpn = ccl_parser_find (cclp, list);
-
- error = cclp->error_code;
- if (error)
- pos = cclp->error_pos - buf;
-
- if (error)
- {
- printf ("%*s^ - ", 6+pos, " ");
- printf ("%s\n", ccl_err_msg (error));
- }
- else
- {
- if (rpn && i == 0)
- {
- ccl_pr_tree (rpn, stdout);
- printf ("\n");
- }
- }
- if (debug)
- {
- struct ccl_token *lp;
- for (lp = list; lp; lp = lp->next)
- printf ("%d %.*s\n", lp->kind, (int) (lp->len), lp->name);
- }
- ccl_token_del (list);
- ccl_parser_destroy (cclp);
- if (rpn)
- ccl_rpn_delete(rpn);
- }
- }
- printf ("\n");
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL string compare utilities
- * Europagate, 1995
- *
- * $Id: cclstr.c,v 1.4 2001-11-27 22:38:50 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.3 1996/01/24 10:11:19 adam
- * Added include of stdlib.h.
- *
- * Revision 1.2 1995/05/16 09:39:27 adam
- * LICENSE.
- *
- * Revision 1.1 1995/05/11 14:03:57 adam
- * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
- * New variable ccl_case_sensitive, which controls whether reserved
- * words and field names are case sensitive or not.
- *
- */
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <yaz/ccl.h>
-
-static int ccli_toupper (int c)
-{
- return toupper (c);
-}
-
-int (*ccl_toupper)(int c) = NULL;
-
-int ccl_stricmp (const char *s1, const char *s2)
-{
- if (!ccl_toupper)
- ccl_toupper = ccli_toupper;
- while (*s1 && *s2)
- {
- int c1, c2;
- c1 = (*ccl_toupper)(*s1);
- c2 = (*ccl_toupper)(*s2);
- if (c1 != c2)
- return c1 - c2;
- s1++;
- s2++;
- }
- return (*ccl_toupper)(*s1) - (*ccl_toupper)(*s2);
-}
-
-int ccl_memicmp (const char *s1, const char *s2, size_t n)
-{
- if (!ccl_toupper)
- ccl_toupper = ccli_toupper;
- while (1)
- {
- int c1, c2;
-
- c1 = (*ccl_toupper)(*s1);
- c2 = (*ccl_toupper)(*s2);
- if (n <= 1 || c1 != c2)
- return c1 - c2;
- s1++;
- s2++;
- --n;
- }
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995, the EUROPAGATE consortium (see below).
- *
- * The EUROPAGATE consortium members are:
- *
- * University College Dublin
- * Danmarks Teknologiske Videnscenter
- * An Chomhairle Leabharlanna
- * Consejo Superior de Investigaciones Cientificas
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The names of EUROPAGATE or the project partners may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * 3. Users of this software (implementors and gateway operators) agree to
- * inform the EUROPAGATE consortium of their use of the software. This
- * information will be used to evaluate the EUROPAGATE project and the
- * software, and to plan further developments. The consortium may use
- * the information in later publications.
- *
- * 4. Users of this software agree to make their best efforts, when
- * documenting their use of the software, to acknowledge the EUROPAGATE
- * consortium, and the role played by the software in their work.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
- * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
- * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
- * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* CCL - lexical analysis
- * Europagate, 1995
- *
- * $Id: ccltoken.c,v 1.22 2003-02-14 18:49:23 adam Exp $
- *
- * Old Europagate Log:
- *
- * Revision 1.10 1995/07/11 12:28:31 adam
- * New function: ccl_token_simple (split into simple tokens) and
- * ccl_token_del (delete tokens).
- *
- * Revision 1.9 1995/05/16 09:39:28 adam
- * LICENSE.
- *
- * Revision 1.8 1995/05/11 14:03:57 adam
- * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
- * New variable ccl_case_sensitive, which controls whether reserved
- * words and field names are case sensitive or not.
- *
- * Revision 1.7 1995/04/19 12:11:24 adam
- * Minor change.
- *
- * Revision 1.6 1995/04/17 09:31:48 adam
- * Improved handling of qualifiers. Aliases or reserved words.
- *
- * Revision 1.5 1995/02/23 08:32:00 adam
- * Changed header.
- *
- * Revision 1.3 1995/02/15 17:42:16 adam
- * Minor changes of the api of this module. FILE* argument added
- * to ccl_pr_tree.
- *
- * Revision 1.2 1995/02/14 19:55:13 adam
- * Header files ccl.h/cclp.h are gone! They have been merged an
- * moved to ../include/ccl.h.
- * Node kind(s) in ccl_rpn_node have changed names.
- *
- * Revision 1.1 1995/02/13 12:35:21 adam
- * First version of CCL. Qualifiers aren't handled yet.
- *
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <yaz/ccl.h>
-
-/*
- * token_cmp: Compare token with keyword(s)
- * kw: Keyword list. Each keyword is separated by space.
- * token: CCL token.
- * return: 1 if token string matches one of the keywords in list;
- * 0 otherwise.
- */
-static int token_cmp (CCL_parser cclp, const char *kw, struct ccl_token *token)
-{
- const char *cp1 = kw;
- const char *cp2;
- const char *aliases;
- int case_sensitive = cclp->ccl_case_sensitive;
-
- aliases = ccl_qual_search_special(cclp->bibset, "case");
- if (aliases)
- case_sensitive = atoi(aliases);
- if (!kw)
- return 0;
- while ((cp2 = strchr (cp1, ' ')))
- {
- if (token->len == (size_t) (cp2-cp1))
- {
- if (case_sensitive)
- {
- if (!memcmp (cp1, token->name, token->len))
- return 1;
- }
- else
- {
- if (!ccl_memicmp (cp1, token->name, token->len))
- return 1;
- }
- }
- cp1 = cp2+1;
- }
- if (case_sensitive)
- return token->len == strlen(cp1)
- && !memcmp (cp1, token->name, token->len);
- return token->len == strlen(cp1) &&
- !ccl_memicmp (cp1, token->name, token->len);
-}
-
-/*
- * ccl_token_simple: tokenize CCL raw tokens
- */
-struct ccl_token *ccl_token_simple (const char *command)
-{
- const char *cp = command;
- struct ccl_token *first = NULL;
- struct ccl_token *last = NULL;
-
- while (1)
- {
- while (*cp && strchr (" \t\r\n", *cp))
- {
- cp++;
- continue;
- }
- if (!first)
- {
- first = last = (struct ccl_token *)xmalloc (sizeof (*first));
- ccl_assert (first);
- last->prev = NULL;
- }
- else
- {
- last->next = (struct ccl_token *)xmalloc (sizeof(*first));
- ccl_assert (last->next);
- last->next->prev = last;
- last = last->next;
- }
- last->next = NULL;
- last->name = cp;
- last->len = 1;
- switch (*cp++)
- {
- case '\0':
- last->kind = CCL_TOK_EOL;
- return first;
- case '\"':
- last->kind = CCL_TOK_TERM;
- last->name = cp;
- last->len = 0;
- while (*cp && *cp != '\"')
- {
- cp++;
- ++ last->len;
- }
- if (*cp == '\"')
- cp++;
- break;
- default:
- while (*cp && !strchr (" \t\n\r", *cp))
- {
- cp++;
- ++ last->len;
- }
- last->kind = CCL_TOK_TERM;
- }
- }
- return first;
-}
-
-
-/*
- * ccl_tokenize: tokenize CCL command string.
- * return: CCL token list.
- */
-struct ccl_token *ccl_parser_tokenize (CCL_parser cclp, const char *command)
-{
- const char *aliases;
- const char *cp = command;
- struct ccl_token *first = NULL;
- struct ccl_token *last = NULL;
-
- while (1)
- {
- while (*cp && strchr (" \t\r\n", *cp))
- {
- cp++;
- continue;
- }
- if (!first)
- {
- first = last = (struct ccl_token *)xmalloc (sizeof (*first));
- ccl_assert (first);
- last->prev = NULL;
- }
- else
- {
- last->next = (struct ccl_token *)xmalloc (sizeof(*first));
- ccl_assert (last->next);
- last->next->prev = last;
- last = last->next;
- }
- last->next = NULL;
- last->name = cp;
- last->len = 1;
- switch (*cp++)
- {
- case '\0':
- last->kind = CCL_TOK_EOL;
- return first;
- case '(':
- last->kind = CCL_TOK_LP;
- break;
- case ')':
- last->kind = CCL_TOK_RP;
- break;
- case ',':
- last->kind = CCL_TOK_COMMA;
- break;
- case '%':
- case '!':
- last->kind = CCL_TOK_PROX;
- while (isdigit(*cp))
- {
- ++ last->len;
- cp++;
- }
- break;
- case '>':
- case '<':
- case '=':
- if (*cp == '=' || *cp == '<' || *cp == '>')
- {
- cp++;
- last->kind = CCL_TOK_REL;
- ++ last->len;
- }
- else if (cp[-1] == '=')
- last->kind = CCL_TOK_EQ;
- else
- last->kind = CCL_TOK_REL;
- break;
- case '\"':
- last->kind = CCL_TOK_TERM;
- last->name = cp;
- last->len = 0;
- while (*cp && *cp != '\"')
- {
- cp++;
- ++ last->len;
- }
- if (*cp == '\"')
- cp++;
- break;
- default:
- if (!strchr ("(),%!><= \t\n\r", cp[-1]))
- {
- while (*cp && !strchr ("(),%!><= \t\n\r", *cp))
- {
- cp++;
- ++ last->len;
- }
- }
- last->kind = CCL_TOK_TERM;
-
- aliases = ccl_qual_search_special(cclp->bibset, "and");
- if (!aliases)
- aliases = cclp->ccl_token_and;
- if (token_cmp (cclp, aliases, last))
- last->kind = CCL_TOK_AND;
-
- aliases = ccl_qual_search_special(cclp->bibset, "or");
- if (!aliases)
- aliases = cclp->ccl_token_or;
- if (token_cmp (cclp, aliases, last))
- last->kind = CCL_TOK_OR;
-
- aliases = ccl_qual_search_special(cclp->bibset, "not");
- if (!aliases)
- aliases = cclp->ccl_token_not;
- if (token_cmp (cclp, aliases, last))
- last->kind = CCL_TOK_NOT;
-
- aliases = ccl_qual_search_special(cclp->bibset, "set");
- if (!aliases)
- aliases = cclp->ccl_token_set;
-
- if (token_cmp (cclp, aliases, last))
- last->kind = CCL_TOK_SET;
- }
- }
- return first;
-}
-
-struct ccl_token *ccl_tokenize (const char *command)
-{
- CCL_parser cclp = ccl_parser_create ();
- struct ccl_token *list;
-
- list = ccl_parser_tokenize (cclp, command);
-
- ccl_parser_destroy (cclp);
- return list;
-}
-
-/*
- * ccl_token_del: delete CCL tokens
- */
-void ccl_token_del (struct ccl_token *list)
-{
- struct ccl_token *list1;
-
- while (list)
- {
- list1 = list->next;
- xfree (list);
- list = list1;
- }
-}
-
-char *ccl_strdup (const char *str)
-{
- int len = strlen(str);
- char *p = (char*) xmalloc (len+1);
- strcpy (p, str);
- return p;
-}
-
-CCL_parser ccl_parser_create (void)
-{
- CCL_parser p = (CCL_parser)xmalloc (sizeof(*p));
- if (!p)
- return p;
- p->look_token = NULL;
- p->error_code = 0;
- p->error_pos = NULL;
- p->bibset = NULL;
-
- p->ccl_token_and = ccl_strdup("and");
- p->ccl_token_or = ccl_strdup("or");
- p->ccl_token_not = ccl_strdup("not andnot");
- p->ccl_token_set = ccl_strdup("set");
- p->ccl_case_sensitive = 1;
-
- return p;
-}
-
-void ccl_parser_destroy (CCL_parser p)
-{
- if (!p)
- return;
- xfree (p->ccl_token_and);
- xfree (p->ccl_token_or);
- xfree (p->ccl_token_not);
- xfree (p->ccl_token_set);
- xfree (p);
-}
-
-void ccl_parser_set_op_and (CCL_parser p, const char *op)
-{
- if (p && op)
- {
- if (p->ccl_token_and)
- xfree (p->ccl_token_and);
- p->ccl_token_and = ccl_strdup (op);
- }
-}
-
-void ccl_parser_set_op_or (CCL_parser p, const char *op)
-{
- if (p && op)
- {
- if (p->ccl_token_or)
- xfree (p->ccl_token_or);
- p->ccl_token_or = ccl_strdup (op);
- }
-}
-void ccl_parser_set_op_not (CCL_parser p, const char *op)
-{
- if (p && op)
- {
- if (p->ccl_token_not)
- xfree (p->ccl_token_not);
- p->ccl_token_not = ccl_strdup (op);
- }
-}
-void ccl_parser_set_op_set (CCL_parser p, const char *op)
-{
- if (p && op)
- {
- if (p->ccl_token_set)
- xfree (p->ccl_token_set);
- p->ccl_token_set = ccl_strdup (op);
- }
-}
-
-void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag)
-{
- if (p)
- p->ccl_case_sensitive = case_sensitivity_flag;
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tstccl.c,v 1.2 2003-06-24 23:03:04 adam Exp $
- */
-
-/* CCL test */
-
-#include <yaz/ccl.h>
-
-struct ccl_tst {
- char *query;
- char *result;
-};
-
-static struct ccl_tst query_str[] = {
- { "x1", "@attr 4=2 @attr 1=1016 x1 "},
- { "(((((x1)))))", "@attr 4=2 @attr 1=1016 x1 "},
- {"x1 and x2", "@and @attr 4=2 @attr 1=1016 x1 @attr 4=2 @attr 1=1016 x2 "},
- { "ti=x3", "@attr 4=2 @attr 1=4 x3 "},
- { "dc.title=x4", "@attr 1=/my/title x4 "},
- { "x1 and", 0},
- { "tix=x5", 0},
- {0, 0}
-};
-
-void tst1(void)
-{
- CCL_parser parser = ccl_parser_create ();
- CCL_bibset bibset = ccl_qual_mk();
- int i;
-
- ccl_qual_fitem(bibset, "u=4 s=pw t=l,r", "ti");
- ccl_qual_fitem(bibset, "1=1016 s=al,pw", "term");
- ccl_qual_fitem(bibset, "1=/my/title", "dc.title");
-
- parser->bibset = bibset;
-
- for (i = 0; query_str[i].query; i++)
- {
- struct ccl_token *token_list =
- ccl_parser_tokenize(parser, query_str[i].query);
- struct ccl_rpn_node *rpn = ccl_parser_find(parser, token_list);
- ccl_token_del (token_list);
- if (rpn)
- {
- WRBUF wrbuf = wrbuf_alloc();
- ccl_pquery(wrbuf, rpn);
-
- if (!query_str[i].result)
- {
- printf ("Failed %s\n", query_str[i].query);
- printf (" got:%s:\n", wrbuf_buf(wrbuf));
- printf (" expected failure\n");
- exit(3);
- }
- else if (strcmp(wrbuf_buf(wrbuf), query_str[i].result))
- {
- printf ("Failed %s\n", query_str[i].query);
- printf (" got:%s:\n", wrbuf_buf(wrbuf));
- printf (" expected:%s:\n", query_str[i].result);
- exit(2);
- }
- ccl_rpn_delete(rpn);
- wrbuf_free(wrbuf, 1);
- }
- else if (query_str[i].result)
- {
- printf ("Failed %s\n", query_str[i].query);
- printf (" got failure\n");
- printf (" expected:%s:\n", query_str[i].result);
- exit(4);
- }
- }
- ccl_parser_destroy (parser);
- ccl_qual_rm(&bibset);
-}
-
-int main(int argc, char **argv)
-{
- tst1();
- exit(0);
-}
## Copyright (C) 1995-2003, Index Data
## All rights reserved.
-## $Id: Makefile.am,v 1.19 2003-03-11 11:07:47 adam Exp $
+## $Id: Makefile.am,v 1.20 2003-10-27 12:21:23 adam Exp $
if ISSSL
extra=yaz-client-ssl
yaz_client_SOURCES=client.c admin.c admin.h tabcomplete.c tabcomplete.h
yaz_client_ssl_SOURCES=$(yaz_client_SOURCES)
-yaz_client_LDADD = ../lib/libyaz.la $(READLINE_LIBS)
-yaz_client_ssl_LDADD = ../lib/libyazssl.la ../lib/libyaz.la $(READLINE_LIBS) $(SSL_LIBS)
-bertorture_LDADD = ../lib/libyaz.la
+yaz_client_LDADD = ../src/libyaz.la $(READLINE_LIBS)
+yaz_client_ssl_LDADD = ../src/libyazssl.la ../src/libyaz.la $(READLINE_LIBS) $(SSL_LIBS)
+bertorture_LDADD = ../src/libyaz.la
bertorture_SOURCES=bertorture.c
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libcomstack.la
-*.lo
+++ /dev/null
-## $Id: Makefile.am,v 1.7 2002-09-11 21:25:57 adam Exp $
-
-noinst_LTLIBRARIES=libcomstack.la
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-libcomstack_la_SOURCES=comstack.c tcpip.c waislen.c unix.c
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: comstack.c,v 1.16 2003-10-20 18:21:45 adam Exp $
- */
-
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/comstack.h>
-#include <yaz/tcpip.h>
-#include <yaz/unix.h>
-#include <yaz/odr.h>
-
-static const char *cs_errlist[] =
-{
- "No error or unspecified error",
- "System (lower-layer) error",
- "Operation out of state",
- "No data (operation would block)",
- "New data while half of old buffer is on the line (flow control)",
- "Permission denied",
- "SSL error"
-};
-
-const char *cs_errmsg(int n)
-{
- if (n < 0 || n > 6)
- n = 0;
- return cs_errlist[n];
-}
-
-const char *cs_strerror(COMSTACK h)
-{
- return cs_errmsg(h->cerrno);
-}
-
-void cs_get_host_args(const char *type_and_host, const char **args)
-{
-
- *args = "";
- if (*type_and_host && strncmp(type_and_host, "unix:", 5))
- {
- const char *cp;
- cp = strstr(type_and_host, "://");
- if (cp)
- cp = cp+3;
- else
- cp = type_and_host;
- cp = strchr(cp, '/');
- if (cp)
- *args = cp+1;
- }
-}
-
-COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
-{
- enum oid_proto proto = PROTO_Z3950;
- const char *host = 0;
- COMSTACK cs;
- CS_TYPE t;
-
- if (strncmp (type_and_host, "tcp:", 4) == 0)
- {
- t = tcpip_type;
- host = type_and_host + 4;
- }
- else if (strncmp (type_and_host, "ssl:", 4) == 0)
- {
-#if HAVE_OPENSSL_SSL_H
- t = ssl_type;
- host = type_and_host + 4;
-#else
- return 0;
-#endif
- }
- else if (strncmp (type_and_host, "unix:", 5) == 0)
- {
-#ifndef WIN32
- t = unix_type;
- host = type_and_host + 5;
-#else
- return 0;
-#endif
- }
- else if (strncmp(type_and_host, "http:", 5) == 0)
- {
- t = tcpip_type;
- host = type_and_host + 5;
- if (host[0] == '/' && host[1] == '/')
- host = host + 2;
- proto = PROTO_HTTP;
- }
- else if (strncmp(type_and_host, "https:", 6) == 0)
- {
-#if HAVE_OPENSSL_SSL_H
- t = ssl_type;
- host = type_and_host + 6;
- if (host[0] == '/' && host[1] == '/')
- host = host + 2;
- proto = PROTO_HTTP;
-#else
- return 0;
-#endif
- }
- else
- {
- t = tcpip_type;
- host = type_and_host;
-
- }
- cs = cs_create (t, blocking, proto);
- if (!cs)
- return 0;
-
- if (!(*vp = cs_straddr(cs, host)))
- {
- cs_close (cs);
- return 0;
- }
- return cs;
-}
-
-int cs_look (COMSTACK cs)
-{
- return cs->event;
-}
-
-int cs_complete_auto(const unsigned char *buf, int len)
-{
- if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
- && buf[1] >= 0x20 && buf[1] < 0x7f
- && buf[2] >= 0x20 && buf[2] < 0x7f)
- {
- /* deal with HTTP request/response */
- int i = 2, content_len = 0, chunked = 0;
-
- while (i <= len-4)
- {
- if (i > 8192)
- return i; /* do not allow more than 8K HTTP header */
- if (buf[i] == '\r' && buf[i+1] == '\n')
- {
- i += 2;
- if (buf[i] == '\r' && buf[i+1] == '\n')
- {
- if (chunked)
- {
- while(1)
- {
- int chunk_len = 0;
- i += 2;
-#if 0
-/* debugging */
- if (i <len-2)
- {
- printf ("\n>>>");
- for (j = i; j <= i+4; j++)
- printf ("%c", buf[j]);
- printf ("<<<\n");
- }
-#endif
- while (1)
- if (i >= len-2) {
-#if 0
-/* debugging */
- printf ("XXXXXXXX not there yet 1\n");
- printf ("i=%d len=%d\n", i, len);
-#endif
- return 0;
- } else if (isdigit(buf[i]))
- chunk_len = chunk_len * 16 +
- (buf[i++] - '0');
- else if (isupper(buf[i]))
- chunk_len = chunk_len * 16 +
- (buf[i++] - ('A'-10));
- else if (islower(buf[i]))
- chunk_len = chunk_len * 16 +
- (buf[i++] - ('a'-10));
- else
- break;
- if (buf[i] != '\r' || buf[i+1] != '\n' ||
- chunk_len < 0)
- return i+2; /* bad. stop now */
- if (chunk_len == 0)
- {
- /* consider trailing headers .. */
- while(i <= len-4)
- {
- if (buf[i] == '\r' && buf[i+1] == '\n' &&
- buf[i+2] == '\r' && buf[i+3] == '\n')
- if (len >= i+4)
- return i+4;
- i++;
- }
-#if 0
-/* debugging */
- printf ("XXXXXXXXX not there yet 2\n");
- printf ("i=%d len=%d\n", i, len);
-#endif
- return 0;
- }
- i += chunk_len+2;
- }
- }
- else
- { /* not chunked ; inside body */
- /* i += 2 seems not to work with GCC -O2 ..
- so i+2 is used instead .. */
- if (len >= (i+2)+ content_len)
- return (i+2)+ content_len;
- }
- break;
- }
- else if (i < len - 21 &&
- !memcmp(buf+i, "Transfer-Encoding: ", 18))
- {
- i+=18;
- if (buf[i] == ' ')
- i++;
- if (i < len - 8)
- if (!memcmp(buf+i, "chunked", 7))
- chunked = 1;
- }
- else if (i < len - 18 &&
- !memcmp(buf+i, "Content-Length: ", 15))
- {
- i+= 15;
- if (buf[i] == ' ')
- i++;
- content_len = 0;
- while (i <= len-4 && isdigit(buf[i]))
- content_len = content_len*10 + (buf[i++] - '0');
- if (content_len < 0) /* prevent negative offsets */
- content_len = 0;
- }
- else
- i++;
- }
- else
- i++;
- }
- return 0;
- }
- return completeBER(buf, len);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tcpip.c,v 1.59 2003-10-08 21:47:15 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef WIN32
-#else
-#include <unistd.h>
-#endif
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#if HAVE_OPENSSL_SSL_H
-#include <openssl/ssl.h>
-#include <openssl/err.h>
-#endif
-
-#include <yaz/comstack.h>
-#include <yaz/tcpip.h>
-#include <yaz/log.h>
-#include <yaz/nmem.h>
-
-#ifdef WIN32
-#else
-#include <netinet/tcp.h>
-#endif
-
-static int tcpip_close(COMSTACK h);
-static int tcpip_put(COMSTACK h, char *buf, int size);
-static int tcpip_get(COMSTACK h, char **buf, int *bufsize);
-static int tcpip_connect(COMSTACK h, void *address);
-static int tcpip_more(COMSTACK h);
-static int tcpip_rcvconnect(COMSTACK h);
-static int tcpip_bind(COMSTACK h, void *address, int mode);
-static int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
- int (*check_ip)(void *cd, const char *a, int len, int type),
- void *cd);
-static int tcpip_set_blocking(COMSTACK p, int blocking);
-
-#if HAVE_OPENSSL_SSL_H
-static int ssl_get(COMSTACK h, char **buf, int *bufsize);
-static int ssl_put(COMSTACK h, char *buf, int size);
-#endif
-
-static COMSTACK tcpip_accept(COMSTACK h);
-static char *tcpip_addrstr(COMSTACK h);
-static void *tcpip_straddr(COMSTACK h, const char *str);
-
-#if 0
-#define TRC(x) x
-#else
-#define TRC(X)
-#endif
-
-#ifndef YAZ_SOCKLEN_T
-#define YAZ_SOCKLEN_T int
-#endif
-
-/* this state is used for both SSL and straight TCP/IP */
-typedef struct tcpip_state
-{
- char *altbuf; /* alternate buffer for surplus data */
- int altsize; /* size as xmalloced */
- int altlen; /* length of data or 0 if none */
-
- int written; /* -1 if we aren't writing */
- int towrite; /* to verify against user input */
- int (*complete)(const unsigned char *buf, int len); /* length/comple. */
- struct sockaddr_in addr; /* returned by cs_straddr */
- char buf[128]; /* returned by cs_addrstr */
-#if HAVE_OPENSSL_SSL_H
- SSL_CTX *ctx;
- SSL_CTX *ctx_alloc;
- SSL *ssl;
-#endif
-} tcpip_state;
-
-#ifdef WIN32
-static int tcpip_init (void)
-{
- static int initialized = 0;
- if (!initialized)
- {
- WORD requested;
- WSADATA wd;
-
- requested = MAKEWORD(1, 1);
- if (WSAStartup(requested, &wd))
- return 0;
- initialized = 1;
- }
- return 1;
-}
-#else
-static int tcpip_init (void)
-{
- return 1;
-}
-#endif
-
-/*
- * This function is always called through the cs_create() macro.
- * s >= 0: socket has already been established for us.
- */
-COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
-{
- COMSTACK p;
- tcpip_state *state;
- int new_socket;
-#ifdef WIN32
- unsigned long tru = 1;
-#endif
-
- if (!tcpip_init ())
- return 0;
- if (s < 0)
- {
- if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- return 0;
- new_socket = 1;
- }
- else
- new_socket = 0;
- if (!(p = (struct comstack *)xmalloc(sizeof(struct comstack))))
- return 0;
- if (!(state = (struct tcpip_state *)(p->cprivate =
- xmalloc(sizeof(tcpip_state)))))
- return 0;
-
- if (!((p->blocking = blocking)&1))
- {
-#ifdef WIN32
- if (ioctlsocket(s, FIONBIO, &tru) < 0)
- return 0;
-#else
- if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
- return 0;
-#ifndef MSG_NOSIGNAL
- signal (SIGPIPE, SIG_IGN);
-#endif
-#endif
- }
-
- p->io_pending = 0;
- p->iofile = s;
- p->type = tcpip_type;
- p->protocol = (enum oid_proto) protocol;
-
- p->f_connect = tcpip_connect;
- p->f_rcvconnect = tcpip_rcvconnect;
- p->f_get = tcpip_get;
- p->f_put = tcpip_put;
- p->f_close = tcpip_close;
- p->f_more = tcpip_more;
- p->f_bind = tcpip_bind;
- p->f_listen = tcpip_listen;
- p->f_accept = tcpip_accept;
- p->f_addrstr = tcpip_addrstr;
- p->f_straddr = tcpip_straddr;
- p->f_set_blocking = tcpip_set_blocking;
-
- p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
- p->event = CS_NONE;
- p->cerrno = 0;
- p->stackerr = 0;
-
-#if HAVE_OPENSSL_SSL_H
- state->ctx = state->ctx_alloc = 0;
- state->ssl = 0;
-#endif
-
- state->altbuf = 0;
- state->altsize = state->altlen = 0;
- state->towrite = state->written = -1;
- if (protocol == PROTO_WAIS)
- state->complete = completeWAIS;
- else
- state->complete = cs_complete_auto;
-
- p->timeout = COMSTACK_DEFAULT_TIMEOUT;
- TRC(fprintf(stderr, "Created new TCPIP comstack\n"));
-
- return p;
-}
-
-#if HAVE_OPENSSL_SSL_H
-
-COMSTACK ssl_type(int s, int blocking, int protocol, void *vp)
-{
- tcpip_state *state;
- COMSTACK p;
- yaz_log(LOG_LOG, "ssl_type begin");
-
- p = tcpip_type (s, blocking, protocol, 0);
- if (!p)
- return 0;
- p->f_get = ssl_get;
- p->f_put = ssl_put;
- p->type = ssl_type;
- state = (tcpip_state *) p->cprivate;
- if (vp)
- state->ctx = vp;
- else
- {
- SSL_load_error_strings();
- SSLeay_add_all_algorithms();
-
- state->ctx = state->ctx_alloc = SSL_CTX_new (SSLv23_method());
- if (!state->ctx)
- {
- tcpip_close(p);
- return 0;
- }
- }
- /* note: we don't handle already opened socket in SSL mode - yet */
- yaz_log(LOG_LOG, "ssl_type end");
- return p;
-}
-#endif
-
-int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add,
- int default_port)
-{
- struct hostent *hp;
- char *p, buf[512];
- short int port = default_port;
- unsigned tmpadd;
-
- if (!tcpip_init ())
- return 0;
- TRC(fprintf(stderr, "tcpip_strtoaddress: %s\n", str ? str : "NULL"));
- add->sin_family = AF_INET;
- strncpy(buf, str, 511);
- buf[511] = 0;
- if ((p = strchr(buf, '/')))
- *p = 0;
- if ((p = strchr(buf, ':')))
- {
- *p = 0;
- port = atoi(p + 1);
- }
- add->sin_port = htons(port);
- if (!strcmp("@", buf))
- add->sin_addr.s_addr = INADDR_ANY;
- else if ((hp = gethostbyname(buf)))
- memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
- sizeof(struct in_addr));
- else if ((tmpadd = (unsigned) inet_addr(buf)) != 0)
- memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
- else
- return 0;
- return 1;
-}
-
-void *tcpip_straddr(COMSTACK h, const char *str)
-{
- tcpip_state *sp = (tcpip_state *)h->cprivate;
- int port = 210;
-
- if (h->protocol == PROTO_HTTP)
- port = 80;
-
- if (!tcpip_strtoaddr_ex (str, &sp->addr, port))
- return 0;
- return &sp->addr;
-}
-
-struct sockaddr_in *tcpip_strtoaddr(const char *str)
-{
- static struct sockaddr_in add;
-
- if (!tcpip_strtoaddr_ex (str, &add, 210))
- return 0;
- return &add;
-}
-
-int tcpip_more(COMSTACK h)
-{
- tcpip_state *sp = (tcpip_state *)h->cprivate;
-
- return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
- sp->altlen);
-}
-
-/*
- * connect(2) will block (sometimes) - nothing we can do short of doing
- * weird things like spawning subprocesses or threading or some weird junk
- * like that.
- */
-int tcpip_connect(COMSTACK h, void *address)
-{
- struct sockaddr_in *add = (struct sockaddr_in *)address;
-#if HAVE_OPENSSL_SSL_H
- tcpip_state *sp = (tcpip_state *)h->cprivate;
-#endif
- int r;
-#ifdef __sun__
- int recbuflen;
- YAZ_SOCKLEN_T rbufsize = sizeof(recbuflen);
-#endif
- TRC(fprintf(stderr, "tcpip_connect\n"));
- h->io_pending = 0;
- if (h->state != CS_ST_UNBND)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
-#ifdef __sun__
- /* On Suns, you must set a bigger Receive Buffer BEFORE a call to connect
- * This gives the connect a chance to negotiate with the other side
- * (see 'man tcp')
- */
- if ( getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) < 0 )
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- TRC(fprintf( stderr, "Current Size of TCP Receive Buffer= %d\n",
- recbuflen ));
- recbuflen *= 10; /* lets be optimistic */
- if ( setsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, rbufsize ) < 0 )
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- if ( getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) )
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- TRC(fprintf( stderr, "New Size of TCP Receive Buffer = %d\n",
- recbuflen ));
-#endif
- r = connect(h->iofile, (struct sockaddr *) add, sizeof(*add));
- if (r < 0)
- {
-#ifdef WIN32
- if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- h->event = CS_CONNECT;
- h->state = CS_ST_CONNECTING;
- h->io_pending = CS_WANT_WRITE;
- return 1;
- }
-#else
- if (yaz_errno() == EINPROGRESS)
- {
- h->event = CS_CONNECT;
- h->state = CS_ST_CONNECTING;
- h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
- return 1;
- }
-#endif
- h->cerrno = CSYSERR;
- return -1;
- }
- h->event = CS_CONNECT;
- h->state = CS_ST_CONNECTING;
-
- return tcpip_rcvconnect (h);
-}
-
-/*
- * nop
- */
-int tcpip_rcvconnect(COMSTACK h)
-{
-#if HAVE_OPENSSL_SSL_H
- tcpip_state *sp = (tcpip_state *)h->cprivate;
-#endif
- TRC(fprintf(stderr, "tcpip_rcvconnect\n"));
-
- if (h->state == CS_ST_DATAXFER)
- return 0;
- if (h->state != CS_ST_CONNECTING)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
-#if HAVE_OPENSSL_SSL_H
- if (sp->ctx)
- {
- int res;
-
- if (!sp->ssl)
- {
- sp->ssl = SSL_new (sp->ctx);
- SSL_set_fd (sp->ssl, h->iofile);
- }
- res = SSL_connect (sp->ssl);
- if (res <= 0)
- {
- int err = SSL_get_error(sp->ssl, res);
- if (err == SSL_ERROR_WANT_READ)
- {
- h->io_pending = CS_WANT_READ;
- return 1;
- }
- if (err == SSL_ERROR_WANT_WRITE)
- {
- h->io_pending = CS_WANT_WRITE;
- return 1;
- }
- h->cerrno = CSERRORSSL;
- return -1;
- }
- }
-#endif
- h->event = CS_DATA;
- h->state = CS_ST_DATAXFER;
- return 0;
-}
-
-#define CERTF "ztest.pem"
-#define KEYF "ztest.pem"
-
-static void tcpip_setsockopt (int fd)
-{
-#if 0
- int len = 4096;
- int set = 1;
-
- if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt TCP_NODELAY");
- }
- if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt SNDBUF");
- }
- if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt RCVBUF");
- }
-#endif
-}
-
-static int tcpip_bind(COMSTACK h, void *address, int mode)
-{
- struct sockaddr *addr = (struct sockaddr *)address;
-#ifdef WIN32
- BOOL one = 1;
-#else
- unsigned long one = 1;
-#endif
-
-#if HAVE_OPENSSL_SSL_H
- tcpip_state *sp = (tcpip_state *)h->cprivate;
- if (sp->ctx)
- {
- if (sp->ctx_alloc)
- {
- int res;
- res = SSL_CTX_use_certificate_file (sp->ctx, CERTF,
- SSL_FILETYPE_PEM);
- if (res <= 0)
- {
- ERR_print_errors_fp(stderr);
- exit (2);
- }
- res = SSL_CTX_use_PrivateKey_file (sp->ctx, KEYF,
- SSL_FILETYPE_PEM);
- if (res <= 0)
- {
- ERR_print_errors_fp(stderr);
- exit (3);
- }
- res = SSL_CTX_check_private_key (sp->ctx);
- if (res <= 0)
- {
- ERR_print_errors_fp(stderr);
- exit(5);
- }
- }
- TRC (fprintf (stderr, "ssl_bind\n"));
- }
- else
- {
- TRC (fprintf (stderr, "tcpip_bind\n"));
- }
-#else
- TRC (fprintf (stderr, "tcpip_bind\n"));
-#endif
-#ifndef WIN32
- if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, (char*)
- &one, sizeof(one)) < 0)
- {
- h->cerrno = CSYSERR;
- return -1;
- }
-#endif
- tcpip_setsockopt(h->iofile);
- if (bind(h->iofile, addr, sizeof(struct sockaddr_in)))
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- h->state = CS_ST_IDLE;
- h->event = CS_LISTEN;
- return 0;
-}
-
-int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
- int (*check_ip)(void *cd, const char *a, int len, int t),
- void *cd)
-{
- struct sockaddr_in addr;
- YAZ_SOCKLEN_T len = sizeof(addr);
-
- TRC(fprintf(stderr, "tcpip_listen pid=%d\n", getpid()));
- if (h->state != CS_ST_IDLE)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
- h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len);
- if (h->newfd < 0)
- {
- if (
-#ifdef WIN32
- WSAGetLastError() == WSAEWOULDBLOCK
-#else
- yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
-#endif
- )
- h->cerrno = CSNODATA;
- else
- h->cerrno = CSYSERR;
- return -1;
- }
- if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_in))
- memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_in));
- else if (addrlen)
- *addrlen = 0;
- if (check_ip && (*check_ip)(cd, (const char *) &addr,
- sizeof(addr), AF_INET))
- {
- h->cerrno = CSDENY;
-#ifdef WIN32
- closesocket(h->newfd);
-#else
- close(h->newfd);
-#endif
- h->newfd = -1;
- return -1;
- }
- h->state = CS_ST_INCON;
- tcpip_setsockopt (h->newfd);
- return 0;
-}
-
-COMSTACK tcpip_accept(COMSTACK h)
-{
- COMSTACK cnew;
- tcpip_state *state, *st = (tcpip_state *)h->cprivate;
-#ifdef WIN32
- unsigned long tru = 1;
-#endif
-
- TRC(fprintf(stderr, "tcpip_accept\n"));
- if (h->state == CS_ST_INCON)
- {
- if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew))))
- {
- h->cerrno = CSYSERR;
-#ifdef WIN32
- closesocket(h->newfd);
-#else
- close(h->newfd);
-#endif
- h->newfd = -1;
- return 0;
- }
- memcpy(cnew, h, sizeof(*h));
- cnew->iofile = h->newfd;
- cnew->io_pending = 0;
- if (!(state = (tcpip_state *)
- (cnew->cprivate = xmalloc(sizeof(tcpip_state)))))
- {
- h->cerrno = CSYSERR;
- if (h->newfd != -1)
- {
-#ifdef WIN32
- closesocket(h->newfd);
-#else
- close(h->newfd);
-#endif
- h->newfd = -1;
- }
- return 0;
- }
- if (!(cnew->blocking&1) &&
-#ifdef WIN32
- (ioctlsocket(cnew->iofile, FIONBIO, &tru) < 0)
-#else
- (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
-#endif
- )
- {
- h->cerrno = CSYSERR;
- if (h->newfd != -1)
- {
-#ifdef WIN32
- closesocket(h->newfd);
-#else
- close(h->newfd);
-#endif
- h->newfd = -1;
- }
- xfree (cnew);
- xfree (state);
- return 0;
- }
- h->newfd = -1;
- state->altbuf = 0;
- state->altsize = state->altlen = 0;
- state->towrite = state->written = -1;
- state->complete = st->complete;
- cnew->state = CS_ST_ACCEPT;
- h->state = CS_ST_IDLE;
-
-#if HAVE_OPENSSL_SSL_H
- state->ctx = st->ctx;
- state->ctx_alloc = 0;
- state->ssl = st->ssl;
- if (state->ctx)
- {
- state->ssl = SSL_new (state->ctx);
- SSL_set_fd (state->ssl, cnew->iofile);
- }
-#endif
- h = cnew;
- }
- if (h->state == CS_ST_ACCEPT)
- {
-#if HAVE_OPENSSL_SSL_H
- tcpip_state *state = (tcpip_state *)h->cprivate;
- if (state->ctx)
- {
- int res = SSL_accept (state->ssl);
- TRC(fprintf(stderr, "SSL_accept\n"));
- if (res <= 0)
- {
- int err = SSL_get_error(state->ssl, res);
- if (err == SSL_ERROR_WANT_READ)
- {
- h->io_pending = CS_WANT_READ;
- return h;
- }
- if (err == SSL_ERROR_WANT_WRITE)
- {
- h->io_pending = CS_WANT_WRITE;
- return h;
- }
- cs_close (h);
- return 0;
- }
- }
-#endif
- }
- else
- {
- h->cerrno = CSOUTSTATE;
- return 0;
- }
- h->io_pending = 0;
- h->state = CS_ST_DATAXFER;
- h->event = CS_DATA;
- return h;
-}
-
-#define CS_TCPIP_BUFCHUNK 4096
-
-/*
- * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
- * 0=connection closed.
- */
-int tcpip_get(COMSTACK h, char **buf, int *bufsize)
-{
- tcpip_state *sp = (tcpip_state *)h->cprivate;
- char *tmpc;
- int tmpi, berlen, rest, req, tomove;
- int hasread = 0, res;
-
- TRC(fprintf(stderr, "tcpip_get: bufsize=%d\n", *bufsize));
- if (sp->altlen) /* switch buffers */
- {
- TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
- (unsigned) sp->altbuf));
- tmpc = *buf;
- tmpi = *bufsize;
- *buf = sp->altbuf;
- *bufsize = sp->altsize;
- hasread = sp->altlen;
- sp->altlen = 0;
- sp->altbuf = tmpc;
- sp->altsize = tmpi;
- }
- h->io_pending = 0;
- while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
- {
- if (!*bufsize)
- {
- if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
- return -1;
- }
- else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
- if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
- return -1;
-#ifdef __sun__
- yaz_set_errno( 0 );
- /* unfortunatly, sun sometimes forgets to set errno in recv
- when EWOULDBLOCK etc. would be required (res = -1) */
-#endif
- res = recv(h->iofile, *buf + hasread, CS_TCPIP_BUFCHUNK, 0);
- TRC(fprintf(stderr, " recv res=%d, hasread=%d\n", res, hasread));
- if (res < 0)
- {
- TRC(fprintf(stderr, " recv errno=%d, (%s)\n", yaz_errno(),
- strerror(yaz_errno())));
-#ifdef WIN32
- if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- h->io_pending = CS_WANT_READ;
- break;
- }
- else
- return -1;
-#else
- if (yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
- || yaz_errno() == EINPROGRESS
-#ifdef __sun__
- || yaz_errno() == ENOENT /* Sun's sometimes set errno to this */
-#endif
- )
- {
- h->io_pending = CS_WANT_READ;
- break;
- }
- else if (yaz_errno() == 0)
- continue;
- else
- return -1;
-#endif
- }
- else if (!res)
- return 0;
- hasread += res;
- }
- TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
- hasread, berlen));
- /* move surplus buffer (or everything if we didn't get a BER rec.) */
- if (hasread > berlen)
- {
- tomove = req = hasread - berlen;
- rest = tomove % CS_TCPIP_BUFCHUNK;
- if (rest)
- req += CS_TCPIP_BUFCHUNK - rest;
- if (!sp->altbuf)
- {
- if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
- return -1;
- } else if (sp->altsize < req)
- if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
- return -1;
- TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
- (unsigned) sp->altbuf));
- memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
- }
- if (berlen < CS_TCPIP_BUFCHUNK - 1)
- *(*buf + berlen) = '\0';
- return berlen ? berlen : 1;
-}
-
-
-#if HAVE_OPENSSL_SSL_H
-/*
- * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
- * 0=connection closed.
- */
-int ssl_get(COMSTACK h, char **buf, int *bufsize)
-{
- tcpip_state *sp = (tcpip_state *)h->cprivate;
- char *tmpc;
- int tmpi, berlen, rest, req, tomove;
- int hasread = 0, res;
-
- TRC(fprintf(stderr, "ssl_get: bufsize=%d\n", *bufsize));
- if (sp->altlen) /* switch buffers */
- {
- TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
- (unsigned) sp->altbuf));
- tmpc = *buf;
- tmpi = *bufsize;
- *buf = sp->altbuf;
- *bufsize = sp->altsize;
- hasread = sp->altlen;
- sp->altlen = 0;
- sp->altbuf = tmpc;
- sp->altsize = tmpi;
- }
- h->io_pending = 0;
- while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
- {
- if (!*bufsize)
- {
- if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
- return -1;
- }
- else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
- if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
- return -1;
- res = SSL_read (sp->ssl, *buf + hasread, CS_TCPIP_BUFCHUNK);
- TRC(fprintf(stderr, " SSL_read res=%d, hasread=%d\n", res, hasread));
- if (res <= 0)
- {
- int ssl_err = SSL_get_error(sp->ssl, res);
- if (ssl_err == SSL_ERROR_WANT_READ)
- {
- h->io_pending = CS_WANT_READ;
- break;
- }
- if (ssl_err == SSL_ERROR_WANT_WRITE)
- {
- h->io_pending = CS_WANT_WRITE;
- break;
- }
- if (res == 0)
- return 0;
- h->cerrno = CSERRORSSL;
- return -1;
- }
- hasread += res;
- }
- TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
- hasread, berlen));
- /* move surplus buffer (or everything if we didn't get a BER rec.) */
- if (hasread > berlen)
- {
- tomove = req = hasread - berlen;
- rest = tomove % CS_TCPIP_BUFCHUNK;
- if (rest)
- req += CS_TCPIP_BUFCHUNK - rest;
- if (!sp->altbuf)
- {
- if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
- return -1;
- } else if (sp->altsize < req)
- if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
- return -1;
- TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
- (unsigned) sp->altbuf));
- memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
- }
- if (berlen < CS_TCPIP_BUFCHUNK - 1)
- *(*buf + berlen) = '\0';
- return berlen ? berlen : 1;
-}
-#endif
-
-/*
- * Returns 1, 0 or -1
- * In nonblocking mode, you must call again with same buffer while
- * return value is 1.
- */
-int tcpip_put(COMSTACK h, char *buf, int size)
-{
- int res;
- struct tcpip_state *state = (struct tcpip_state *)h->cprivate;
-
- TRC(fprintf(stderr, "tcpip_put: size=%d\n", size));
- h->io_pending = 0;
- h->event = CS_DATA;
- if (state->towrite < 0)
- {
- state->towrite = size;
- state->written = 0;
- }
- else if (state->towrite != size)
- {
- h->cerrno = CSWRONGBUF;
- return -1;
- }
- while (state->towrite > state->written)
- {
- if ((res =
- send(h->iofile, buf + state->written, size -
- state->written,
-#ifdef MSG_NOSIGNAL
- MSG_NOSIGNAL
-#else
- 0
-#endif
- )) < 0)
- {
- if (
-#ifdef WIN32
- WSAGetLastError() == WSAEWOULDBLOCK
-#else
- yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
-#ifdef __sun__
- || yaz_errno() == ENOENT /* Sun's sometimes set errno to this value! */
-#endif
- || yaz_errno() == EINPROGRESS
-#endif
- )
- {
- TRC(fprintf(stderr, " Flow control stop\n"));
- h->io_pending = CS_WANT_WRITE;
- return 1;
- }
- h->cerrno = CSYSERR;
- return -1;
- }
- state->written += res;
- TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
- res, state->written, size));
- }
- state->towrite = state->written = -1;
- TRC(fprintf(stderr, " Ok\n"));
- return 0;
-}
-
-
-#if HAVE_OPENSSL_SSL_H
-/*
- * Returns 1, 0 or -1
- * In nonblocking mode, you must call again with same buffer while
- * return value is 1.
- */
-int ssl_put(COMSTACK h, char *buf, int size)
-{
- int res;
- struct tcpip_state *state = (struct tcpip_state *)h->cprivate;
-
- TRC(fprintf(stderr, "ssl_put: size=%d\n", size));
- h->io_pending = 0;
- h->event = CS_DATA;
- if (state->towrite < 0)
- {
- state->towrite = size;
- state->written = 0;
- }
- else if (state->towrite != size)
- {
- h->cerrno = CSWRONGBUF;
- return -1;
- }
- while (state->towrite > state->written)
- {
- res = SSL_write (state->ssl, buf + state->written,
- size - state->written);
- if (res <= 0)
- {
- int ssl_err = SSL_get_error(state->ssl, res);
- if (ssl_err == SSL_ERROR_WANT_READ)
- {
- h->io_pending = CS_WANT_READ;
- return 1;
- }
- if (ssl_err == SSL_ERROR_WANT_WRITE)
- {
- h->io_pending = CS_WANT_WRITE;
- return 1;
- }
- h->cerrno = CSERRORSSL;
- return -1;
- }
- state->written += res;
- TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
- res, state->written, size));
- }
- state->towrite = state->written = -1;
- TRC(fprintf(stderr, " Ok\n"));
- return 0;
-}
-#endif
-
-int tcpip_close(COMSTACK h)
-{
- tcpip_state *sp = (struct tcpip_state *)h->cprivate;
-
- TRC(fprintf(stderr, "tcpip_close\n"));
- if (h->iofile != -1)
- {
-#if HAVE_OPENSSL_SSL_H
- if (sp->ssl)
- {
- SSL_shutdown (sp->ssl);
- }
-#endif
-#ifdef WIN32
- closesocket(h->iofile);
-#else
- close(h->iofile);
-#endif
- }
- if (sp->altbuf)
- xfree(sp->altbuf);
-#if HAVE_OPENSSL_SSL_H
- if (sp->ssl)
- {
- TRC (fprintf(stderr, "SSL_free\n"));
- SSL_free (sp->ssl);
- }
- sp->ssl = 0;
- if (sp->ctx_alloc)
- SSL_CTX_free (sp->ctx_alloc);
-#endif
- xfree(sp);
- xfree(h);
- return 0;
-}
-
-char *tcpip_addrstr(COMSTACK h)
-{
- struct sockaddr_in addr;
- tcpip_state *sp = (struct tcpip_state *)h->cprivate;
- char *r = 0, *buf = sp->buf;
- YAZ_SOCKLEN_T len;
- struct hostent *host;
-
- len = sizeof(addr);
- if (getpeername(h->iofile, (struct sockaddr*) &addr, &len) < 0)
- {
- h->cerrno = CSYSERR;
- return 0;
- }
- if (!(h->blocking&2)) {
- if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
- AF_INET)))
- r = (char*) host->h_name;
- }
- if (!r)
- r = inet_ntoa(addr.sin_addr);
- if (h->protocol == PROTO_HTTP)
- sprintf(buf, "http:%s", r);
- else
- sprintf(buf, "tcp:%s", r);
-#if HAVE_OPENSSL_SSL_H
- if (sp->ctx)
- {
- if (h->protocol == PROTO_HTTP)
- sprintf(buf, "https:%s", r);
- else
- sprintf(buf, "ssl:%s", r);
- }
-#endif
- return buf;
-}
-
-int static tcpip_set_blocking(COMSTACK p, int blocking)
-{
- unsigned long flag;
-
- if (p->blocking == blocking)
- return 1;
-#ifdef WIN32
- flag = 1;
- if (ioctlsocket(p->iofile, FIONBIO, &flag) < 0)
- return 0;
-#else
- flag = fcntl(p->iofile, F_GETFL, 0);
- if(!(blocking&1))
- flag = flag & ~O_NONBLOCK;
- else
- flag = flag | O_NONBLOCK;
- if (fcntl(p->iofile, F_SETFL, flag) < 0)
- return 0;
-#endif
- p->blocking = blocking;
- return 1;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: unix.c,v 1.14 2003-10-08 21:47:15 adam Exp $
- * UNIX socket COMSTACK. By Morten Bøgeskov.
- */
-#ifndef WIN32
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-
-#include <yaz/comstack.h>
-#include <yaz/unix.h>
-#include <yaz/log.h>
-#include <yaz/nmem.h>
-
-#ifndef YAZ_SOCKLEN_T
-#define YAZ_SOCKLEN_T int
-#endif
-
-static int unix_close(COMSTACK h);
-static int unix_put(COMSTACK h, char *buf, int size);
-static int unix_get(COMSTACK h, char **buf, int *bufsize);
-static int unix_connect(COMSTACK h, void *address);
-static int unix_more(COMSTACK h);
-static int unix_rcvconnect(COMSTACK h);
-static int unix_bind(COMSTACK h, void *address, int mode);
-static int unix_listen(COMSTACK h, char *raddr, int *addrlen,
- int (*check_ip)(void *cd, const char *a, int len, int type),
- void *cd);
-static int unix_set_blocking(COMSTACK p, int blocking);
-
-static COMSTACK unix_accept(COMSTACK h);
-static char *unix_addrstr(COMSTACK h);
-static void *unix_straddr(COMSTACK h, const char *str);
-
-#ifndef SUN_LEN
-#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
- + strlen ((ptr)->sun_path))
-#endif
-#if 0
-#define TRC(x) x
-#else
-#define TRC(X)
-#endif
-
-/* this state is used for both SSL and straight TCP/IP */
-typedef struct unix_state
-{
- char *altbuf; /* alternate buffer for surplus data */
- int altsize; /* size as xmalloced */
- int altlen; /* length of data or 0 if none */
-
- int written; /* -1 if we aren't writing */
- int towrite; /* to verify against user input */
- int (*complete)(const unsigned char *buf, int len); /* length/comple. */
- struct sockaddr_un addr; /* returned by cs_straddr */
- char buf[128]; /* returned by cs_addrstr */
-} unix_state;
-
-static int unix_init (void)
-{
- return 1;
-}
-
-/*
- * This function is always called through the cs_create() macro.
- * s >= 0: socket has already been established for us.
- */
-COMSTACK unix_type(int s, int blocking, int protocol, void *vp)
-{
- COMSTACK p;
- unix_state *state;
- int new_socket;
-
- if (!unix_init ())
- return 0;
- if (s < 0)
- {
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
- return 0;
- new_socket = 1;
- }
- else
- new_socket = 0;
- if (!(p = (struct comstack *)xmalloc(sizeof(struct comstack))))
- return 0;
- if (!(state = (struct unix_state *)(p->cprivate =
- xmalloc(sizeof(unix_state)))))
- return 0;
-
- if (!((p->blocking = blocking)&1))
- {
- if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
- return 0;
-#ifndef MSG_NOSIGNAL
- signal (SIGPIPE, SIG_IGN);
-#endif
- }
-
- p->io_pending = 0;
- p->iofile = s;
- p->type = unix_type;
- p->protocol = (enum oid_proto) protocol;
-
- p->f_connect = unix_connect;
- p->f_rcvconnect = unix_rcvconnect;
- p->f_get = unix_get;
- p->f_put = unix_put;
- p->f_close = unix_close;
- p->f_more = unix_more;
- p->f_bind = unix_bind;
- p->f_listen = unix_listen;
- p->f_accept = unix_accept;
- p->f_addrstr = unix_addrstr;
- p->f_straddr = unix_straddr;
- p->f_set_blocking = unix_set_blocking;
-
- p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
- p->event = CS_NONE;
- p->cerrno = 0;
- p->stackerr = 0;
-
- state->altbuf = 0;
- state->altsize = state->altlen = 0;
- state->towrite = state->written = -1;
- if (protocol == PROTO_WAIS)
- state->complete = completeWAIS;
- else
- state->complete = cs_complete_auto;
-
- p->timeout = COMSTACK_DEFAULT_TIMEOUT;
- TRC(fprintf(stderr, "Created new UNIX comstack\n"));
-
- return p;
-}
-
-
-static int unix_strtoaddr_ex(const char *str, struct sockaddr_un *add)
-{
- char *cp;
- if (!unix_init ())
- return 0;
- TRC(fprintf(stderr, "unix_strtoaddress: %s\n", str ? str : "NULL"));
- add->sun_family = AF_UNIX;
- strncpy(add->sun_path, str, sizeof(add->sun_path));
- cp = strchr (add->sun_path, ':');
- if (cp)
- *cp = '\0';
- return 1;
-}
-
-static void *unix_straddr(COMSTACK h, const char *str)
-{
- unix_state *sp = (unix_state *)h->cprivate;
-
- TRC(fprintf(stderr, "unix_straddr: %s\n", str ? str : "NULL"));
-
- if (!unix_strtoaddr_ex (str, &sp->addr))
- return 0;
- return &sp->addr;
-}
-
-struct sockaddr_un *unix_strtoaddr(const char *str)
-{
- static struct sockaddr_un add;
-
- TRC(fprintf(stderr, "unix_strtoaddr: %s\n", str ? str : "NULL"));
-
- if (!unix_strtoaddr_ex (str, &add))
- return 0;
- return &add;
-}
-
-static int unix_more(COMSTACK h)
-{
- unix_state *sp = (unix_state *)h->cprivate;
-
- return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
- sp->altlen);
-}
-
-/*
- * connect(2) will block (sometimes) - nothing we can do short of doing
- * weird things like spawning subprocesses or threading or some weird junk
- * like that.
- */
-static int unix_connect(COMSTACK h, void *address)
-{
- struct sockaddr_un *add = (struct sockaddr_un *)address;
- int r;
-
- TRC(fprintf(stderr, "unix_connect\n"));
- h->io_pending = 0;
- if (h->state != CS_ST_UNBND)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
- r = connect(h->iofile, (struct sockaddr *) add, SUN_LEN(add));
- if (r < 0)
- {
- if (yaz_errno() == EINPROGRESS)
- {
- h->event = CS_CONNECT;
- h->state = CS_ST_CONNECTING;
- h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
- return 1;
- }
- h->cerrno = CSYSERR;
- return -1;
- }
- h->event = CS_CONNECT;
- h->state = CS_ST_CONNECTING;
-
- return unix_rcvconnect (h);
-}
-
-/*
- * nop
- */
-static int unix_rcvconnect(COMSTACK h)
-{
- TRC(fprintf(stderr, "unix_rcvconnect\n"));
-
- if (h->state == CS_ST_DATAXFER)
- return 0;
- if (h->state != CS_ST_CONNECTING)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
- h->event = CS_DATA;
- h->state = CS_ST_DATAXFER;
- return 0;
-}
-
-#define CERTF "ztest.pem"
-#define KEYF "ztest.pem"
-
-static int unix_bind(COMSTACK h, void *address, int mode)
-{
- struct sockaddr *addr = (struct sockaddr *)address;
- const char * path = ((struct sockaddr_un *)addr)->sun_path;
- struct stat stat_buf;
-
- TRC (fprintf (stderr, "unix_bind\n"));
-
- if(stat(path, &stat_buf) != -1) {
- struct sockaddr_un socket_unix;
- int socket_out = -1;
- if(! S_ISSOCK(stat_buf.st_mode)) {
- h->cerrno = CSYSERR;
- yaz_set_errno(EEXIST); /* Not a socket (File exists) */
- return -1;
- }
- if((socket_out = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
- h->cerrno = CSYSERR;
- return -1;
- }
- socket_unix.sun_family = AF_UNIX;
- strncpy(socket_unix.sun_path, path, sizeof(socket_unix.sun_path));
- if(connect(socket_out, (struct sockaddr *) &socket_unix, SUN_LEN(&socket_unix)) < 0) {
- if(yaz_errno() == ECONNREFUSED) {
- TRC (fprintf (stderr, "Socket exists but nobody is listening\n"));
- } else {
- h->cerrno = CSYSERR;
- return -1;
- }
- } else {
- close(socket_out);
- h->cerrno = CSYSERR;
- yaz_set_errno(EADDRINUSE);
- return -1;
- }
- unlink(path);
- }
-
- if (bind(h->iofile, (struct sockaddr *) addr, SUN_LEN((struct sockaddr_un *)addr)))
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- chmod(path, 0777);
- if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- h->state = CS_ST_IDLE;
- h->event = CS_LISTEN;
- return 0;
-}
-
-static int unix_listen(COMSTACK h, char *raddr, int *addrlen,
- int (*check_ip)(void *cd, const char *a, int len, int t),
- void *cd)
-{
- struct sockaddr_un addr;
- YAZ_SOCKLEN_T len = sizeof(addr);
-
- TRC(fprintf(stderr, "unix_listen pid=%d\n", getpid()));
- if (h->state != CS_ST_IDLE)
- {
- h->cerrno = CSOUTSTATE;
- return -1;
- }
- h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len);
- if (h->newfd < 0)
- {
- if (
- yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
- )
- h->cerrno = CSNODATA;
- else
- h->cerrno = CSYSERR;
- return -1;
- }
- if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_un))
- memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_un));
- else if (addrlen)
- *addrlen = 0;
- h->state = CS_ST_INCON;
- return 0;
-}
-
-static COMSTACK unix_accept(COMSTACK h)
-{
- COMSTACK cnew;
- unix_state *state, *st = (unix_state *)h->cprivate;
-
- TRC(fprintf(stderr, "unix_accept\n"));
- if (h->state == CS_ST_INCON)
- {
- if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew))))
- {
- h->cerrno = CSYSERR;
- close(h->newfd);
- h->newfd = -1;
- return 0;
- }
- memcpy(cnew, h, sizeof(*h));
- cnew->iofile = h->newfd;
- cnew->io_pending = 0;
- if (!(state = (unix_state *)
- (cnew->cprivate = xmalloc(sizeof(unix_state)))))
- {
- h->cerrno = CSYSERR;
- if (h->newfd != -1)
- {
- close(h->newfd);
- h->newfd = -1;
- }
- return 0;
- }
- if (!(cnew->blocking&1) &&
- (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
- )
- {
- h->cerrno = CSYSERR;
- if (h->newfd != -1)
- {
- close(h->newfd);
- h->newfd = -1;
- }
- xfree (cnew);
- xfree (state);
- return 0;
- }
- h->newfd = -1;
- state->altbuf = 0;
- state->altsize = state->altlen = 0;
- state->towrite = state->written = -1;
- state->complete = st->complete;
- memcpy(&state->addr, &st->addr, sizeof(state->addr));
- cnew->state = CS_ST_ACCEPT;
- cnew->event = CS_NONE;
- h->state = CS_ST_IDLE;
-
- h = cnew;
- }
- if (h->state == CS_ST_ACCEPT)
- {
- }
- else
- {
- h->cerrno = CSOUTSTATE;
- return 0;
- }
- h->io_pending = 0;
- h->state = CS_ST_DATAXFER;
- h->event = CS_DATA;
- return h;
-}
-
-#define CS_UNIX_BUFCHUNK 4096
-
-/*
- * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
- * 0=connection closed.
- */
-static int unix_get(COMSTACK h, char **buf, int *bufsize)
-{
- unix_state *sp = (unix_state *)h->cprivate;
- char *tmpc;
- int tmpi, berlen, rest, req, tomove;
- int hasread = 0, res;
-
- TRC(fprintf(stderr, "unix_get: bufsize=%d\n", *bufsize));
- if (sp->altlen) /* switch buffers */
- {
- TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
- (unsigned) sp->altbuf));
- tmpc = *buf;
- tmpi = *bufsize;
- *buf = sp->altbuf;
- *bufsize = sp->altsize;
- hasread = sp->altlen;
- sp->altlen = 0;
- sp->altbuf = tmpc;
- sp->altsize = tmpi;
- }
- h->io_pending = 0;
- while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
- {
- if (!*bufsize)
- {
- if (!(*buf = (char *)xmalloc(*bufsize = CS_UNIX_BUFCHUNK)))
- return -1;
- }
- else if (*bufsize - hasread < CS_UNIX_BUFCHUNK)
- if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
- return -1;
- res = recv(h->iofile, *buf + hasread, CS_UNIX_BUFCHUNK, 0);
- TRC(fprintf(stderr, " recv res=%d, hasread=%d\n", res, hasread));
- if (res < 0)
- {
- if (yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
- || yaz_errno() == EINPROGRESS
- )
- {
- h->io_pending = CS_WANT_READ;
- break;
- }
- else if (yaz_errno() == 0)
- continue;
- else
- return -1;
- }
- else if (!res)
- return 0;
- hasread += res;
- }
- TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
- hasread, berlen));
- /* move surplus buffer (or everything if we didn't get a BER rec.) */
- if (hasread > berlen)
- {
- tomove = req = hasread - berlen;
- rest = tomove % CS_UNIX_BUFCHUNK;
- if (rest)
- req += CS_UNIX_BUFCHUNK - rest;
- if (!sp->altbuf)
- {
- if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
- return -1;
- } else if (sp->altsize < req)
- if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
- return -1;
- TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
- (unsigned) sp->altbuf));
- memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
- }
- if (berlen < CS_UNIX_BUFCHUNK - 1)
- *(*buf + berlen) = '\0';
- return berlen ? berlen : 1;
-}
-
-
-
-/*
- * Returns 1, 0 or -1
- * In nonblocking mode, you must call again with same buffer while
- * return value is 1.
- */
-static int unix_put(COMSTACK h, char *buf, int size)
-{
- int res;
- struct unix_state *state = (struct unix_state *)h->cprivate;
-
- TRC(fprintf(stderr, "unix_put: size=%d\n", size));
- h->io_pending = 0;
- h->event = CS_DATA;
- if (state->towrite < 0)
- {
- state->towrite = size;
- state->written = 0;
- }
- else if (state->towrite != size)
- {
- h->cerrno = CSWRONGBUF;
- return -1;
- }
- while (state->towrite > state->written)
- {
- if ((res =
- send(h->iofile, buf + state->written, size -
- state->written,
-#ifdef MSG_NOSIGNAL
- MSG_NOSIGNAL
-#else
- 0
-#endif
- )) < 0)
- {
- if (
- yaz_errno() == EWOULDBLOCK
-#ifdef EAGAIN
-#if EAGAIN != EWOULDBLOCK
- || yaz_errno() == EAGAIN
-#endif
-#endif
- )
- {
- TRC(fprintf(stderr, " Flow control stop\n"));
- h->io_pending = CS_WANT_WRITE;
- return 1;
- }
- h->cerrno = CSYSERR;
- return -1;
- }
- state->written += res;
- TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
- res, state->written, size));
- }
- state->towrite = state->written = -1;
- TRC(fprintf(stderr, " Ok\n"));
- return 0;
-}
-
-static int unix_close(COMSTACK h)
-{
- unix_state *sp = (struct unix_state *)h->cprivate;
-
- TRC(fprintf(stderr, "unix_close\n"));
- if (h->iofile != -1)
- {
- close(h->iofile);
- }
- if (sp->altbuf)
- xfree(sp->altbuf);
- xfree(sp);
- xfree(h);
- return 0;
-}
-
-static char *unix_addrstr(COMSTACK h)
-{
- unix_state *sp = (struct unix_state *)h->cprivate;
- char *buf = sp->buf;
- sprintf(buf, "unix:%s", sp->addr.sun_path);
- return buf;
-}
-
-static int unix_set_blocking(COMSTACK p, int blocking)
-{
- unsigned long flag;
-
- if (p->blocking == blocking)
- return 1;
- flag = fcntl(p->iofile, F_GETFL, 0);
- if(!blocking)
- flag = flag & ~O_NONBLOCK;
- else
- flag = flag | O_NONBLOCK;
- if (fcntl(p->iofile, F_SETFL, flag) < 0)
- return 0;
- p->blocking = blocking;
- return 1;
-}
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-1999, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: waislen.c,v $
- * Revision 1.5 1999-11-30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.4 1999/01/08 11:23:15 adam
- * Added const modifier to some of the BER/ODR encoding routines.
- *
- * Revision 1.3 1996/02/29 14:23:13 adam
- * Bug fix.
- *
- * Revision 1.2 1996/02/26 18:34:44 adam
- * Bug fix.
- *
- * Revision 1.1 1996/02/20 13:02:58 quinn
- * Wais length.
- *
- *
- */
-
-#include <stdio.h>
-#include <yaz/comstack.h>
-#include <yaz/tcpip.h>
-/*
- * Return length of WAIS package or 0
- */
-int completeWAIS(const unsigned char *buf, int len)
-{
- int i, lval = 0;
-
- if (len < 25)
- return 0;
- if (*buf != '0')
- return 0;
- /* calculate length */
- for (i = 0; i < 10; i++)
- lval = lval * 10 + (buf[i] - '0');
- lval += 25;
- if (len >= lval)
- return lval;
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: xmosi.c,v $
- * Revision 1.17 1999-06-16 11:55:24 adam
- * Added APDU log to client.
- *
- * Revision 1.16 1997/09/17 12:10:30 adam
- * YAZ version 1.4.
- *
- * Revision 1.15 1997/05/14 06:53:34 adam
- * C++ support.
- *
- * Revision 1.14 1996/07/26 12:34:07 quinn
- * Porting.
- *
- * Revision 1.13 1996/07/06 19:58:30 quinn
- * System headerfiles gathered in yconfig
- *
- * Revision 1.12 1996/05/22 08:34:44 adam
- * Added ifdef USE_XTIMOSI; so that 'make depend' works.
- *
- * Revision 1.11 1996/02/23 10:00:41 quinn
- * WAIS Work
- *
- * Revision 1.10 1996/02/10 12:23:13 quinn
- * Enablie inetd operations fro TCP/IP stack
- *
- * Revision 1.9 1996/01/02 08:57:28 quinn
- * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
- *
- * Revision 1.8 1995/11/01 13:54:29 quinn
- * Minor adjustments
- *
- * Revision 1.7 1995/10/30 12:41:17 quinn
- * Added hostname lookup for server.
- *
- * Revision 1.6 1995/09/29 17:12:00 quinn
- * Smallish
- *
- * Revision 1.5 1995/09/28 10:24:32 quinn
- * Windows changes
- *
- * Revision 1.4 1995/09/27 15:02:45 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.3 1995/06/16 10:30:38 quinn
- * Added REUSEADDR.
- *
- * Revision 1.2 1995/06/15 12:30:07 quinn
- * Added @ as hostname alias for INADDR ANY.
- *
- * Revision 1.1 1995/06/14 09:58:20 quinn
- * Renamed yazlib to comstack.
- *
- * Revision 1.15 1995/05/29 08:12:33 quinn
- * Updates to aynch. operations.
- *
- * Revision 1.14 1995/05/16 09:37:31 quinn
- * Fixed bug
- *
- * Revision 1.13 1995/05/16 08:51:19 quinn
- * License, documentation, and memory fixes
- *
- * Revision 1.12 1995/05/02 08:53:24 quinn
- * Trying in vain to fix comm with ISODE
- *
- * Revision 1.11 1995/04/21 16:32:08 quinn
- * *** empty log message ***
- *
- * Revision 1.10 1995/03/27 08:36:14 quinn
- * Some work on nonblocking operation in xmosi.c and rfct.c.
- * Added protocol parameter to cs_create()
- *
- * Revision 1.9 1995/03/20 09:47:23 quinn
- * Added server-side support to xmosi.c
- * Fixed possible problems in rfct
- * Other little mods
- *
- * Revision 1.8 1995/03/16 13:29:30 quinn
- * Beginning to add server-side functions
- *
- * Revision 1.7 1995/03/14 10:28:47 quinn
- * Adding server-side support to tcpip.c and fixing bugs in nonblocking I/O
- *
- * Revision 1.6 1995/03/09 15:22:43 quinn
- * Fixed two bugs in get/rcv
- *
- * Revision 1.5 1995/03/07 16:29:47 quinn
- * Various fixes.
- *
- * Revision 1.4 1995/03/07 10:26:56 quinn
- * Initialized type field in the comstacks.
- *
- * Revision 1.3 1995/03/06 16:48:03 quinn
- * Smallish changes.
- *
- * Revision 1.2 1995/03/06 10:54:41 quinn
- * Server-side functions (t_bind/t_listen/t_accept) seem to work ok, now.
- * Nonblocking mode needs work (and testing!)
- * Added makensap to replace function in mosiutil.c.
- *
- * Revision 1.1 1995/03/01 08:40:33 quinn
- * First working version of rfct. Addressing needs work.
- *
- */
-
-#ifdef USE_XTIMOSI
-/*
- * Glue layer for Peter Furniss' xtimosi package.
- */
-
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#define YNETINCLUDE
-#include <yconfig.h>
-
-#include <comstack.h>
-#include <xmosi.h>
-
-#include <oid.h>
-
-int mosi_connect(COMSTACK h, void *address);
-int mosi_get(COMSTACK h, char **buf, int *bufsize);
-int mosi_put(COMSTACK h, char *buf, int size);
-int mosi_more(COMSTACK h) { return 0; } /* not correct */
-int mosi_close(COMSTACK h);
-int mosi_rcvconnect(COMSTACK h);
-int mosi_bind(COMSTACK h, void *address, int mode);
-int mosi_listen(COMSTACK h, char *addrp, int *addrlen);
-COMSTACK mosi_accept(COMSTACK h);
-char *mosi_addrstr(COMSTACK h);
-void *mosi_straddr(COMSTACK h, const char *str);
-
-typedef struct mosi_state
-{
- struct t_info info; /* data returned by t_open */
- struct t_call *call;
- int hasread; /* how many bytes read of current PDU */
- int haswrit; /* how many bytes have we written */
- struct netbuf netbuf;
-} mosi_state;
-
-static char *oidtostr(int *o)
-{
- static char buf[512];
-
- buf[0] = '\0';
- while (*o >= 0)
- {
- sprintf(buf + strlen(buf), "%d", *o);
- if (*(++o) >= 0)
- strcat(buf, " ");
- }
- return buf;
-}
-
-static int addopt(struct netbuf *optbuf, unsigned long level, unsigned long
- name, enum oid_proto proto, enum oid_class class, enum oid_value value)
-{
- int *oid;
- oident ent;
- char *str;
-
- ent.proto = proto;
- ent.oclass = class;
- ent.value = value;
- if (!(oid = oid_getoidbyent(&ent)))
- return -1;
- str = oidtostr(oid);
- if (addoidoption(optbuf, level, name, str) < 0)
- return -1;
- return 0;
-}
-
-COMSTACK mosi_type(int s, int blocking, int protocol)
-{
- COMSTACK r;
- mosi_state *state;
- int flags = O_RDWR;
-
- if (s >= 0)
- return 0;
-
- if (!(r = xmalloc(sizeof(*r))))
- return 0;
- if (!(state = r->cprivate = xmalloc(sizeof(*state))))
- return 0;
-
- state->call = 0;
- state->hasread = 0;
- state->haswrit = 0;
- r->protocol = protocol;
- r->state = CS_UNBND;
- r->type = mosi_type;
- r->blocking = blocking;
- r->f_connect = mosi_connect;
- r->f_put = mosi_put;
- r->f_get = mosi_get;
- r->f_close = mosi_close;
- r->f_more = mosi_more;
- r->f_rcvconnect = mosi_rcvconnect;
- r->f_bind = mosi_bind;
- r->f_listen = mosi_listen;
- r->f_accept = mosi_accept;
- r->f_addrstr = mosi_addrstr;
- r->r_straddr = mosi_straddr;
-
- if (!blocking)
- flags |= O_NONBLOCK;
- if ((r->iofile = u_open(CO_MOSI_NAME, flags, &state->info)) < 0)
- return 0;
-
- r->timeout = COMSTACK_DEFAULT_TIMEOUT;
-
- return r;
-}
-
-int hex2oct(char *hex, char *oct)
-{
- int len = 0;
- unsigned val;
-
- while (sscanf(hex, "%2x", &val) == 1)
- {
- if (strlen(hex) < 2)
- return -1;
- *((unsigned char*) oct++) = (unsigned char) val;
- len++;
- hex += 2;
- }
- return len;
-}
-
-/*
- * addressing specific to our hack of OSI transport. A sockaddr_in wrapped
- * up in a t_mosiaddr in a netbuf (on a stick).
- */
-
-int *mosi_strtoaddr_ex(const char *str, struct netbuf *ret)
-{
- struct sockaddr_in *add = xmalloc(sizeof(struct sockaddr_in));
- struct t_mosiaddr *mosiaddr = xmalloc(sizeof(struct t_mosiaddr));
- struct hostent *hp;
- char *p, *b, buf[512], *nsap;
- short int port = 102;
- unsigned long tmpadd;
- int ll = 0;
-
- assert(ret && add && mosiaddr);
-#if 0
- mosiaddr->osi_ap_inv_id = NO_INVOKEID;
- mosiaddr->osi_ae_inv_id = NO_INVOKEID;
-#endif
- mosiaddr->osi_apt_len = 0;
- mosiaddr->osi_aeq_len = 0;
- p = (char*)MOSI_PADDR(mosiaddr);
- *(p++) = 0; /* No presentation selector */
- ll++;
- *(p++) = 0; /* no session selector */
- ll++;
- /* do we have a transport selector? */
- strcpy(buf, str);
- if ((nsap = strchr(buf, '/')))
- {
- *(nsap++) = '\0';
- if ((*p = hex2oct(buf, p + 1)) < 0)
- return 0;
- ll += *p + 1;
- p += *p + 1;
- }
- else
- {
- nsap = buf;
- *(p++) = 0;
- ll++;
- }
- if (nsap && *nsap)
- {
- add->sin_family = AF_INET;
- strcpy(buf, nsap);
- if ((b = strchr(buf, ':')))
- {
- *b = 0;
- port = atoi(b + 1);
- }
- add->sin_port = htons(port);
- if (!strcmp("@", buf))
- add->sin_addr.s_addr = INADDR_ANY;
- else if ((hp = gethostbyname(buf)))
- memcpy(&add->sin_addr.s_addr, *hp->h_addr_list, sizeof(struct in_addr));
- else if ((tmpadd = inet_addr(buf)) != 0)
- memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
- else
- return 0;
- *(p++) = (char) sizeof(*add);
- ll++;
- memcpy(p, add, sizeof(*add));
- ll += sizeof(*add);
- }
- else
- {
- *(p++) = 0;
- ll++;
- }
- mosiaddr->osi_paddr_len = ll;
- ret->buf = (char*)mosiaddr;
- ret->len = ret->maxlen = 100 /* sizeof(*mosiaddr) */ ;
-
- return 1;
-}
-
-struct netbuf *mosi_strtoaddr(const char *str)
-{
- struct netbuf *ret = xmalloc(sizeof(struct netbuf));
-
- if (!mosi_strtoaddr_ex (str, ret))
- {
- xfree (ret);
- return 0;
- }
- return ret;
-}
-
-struct netbuf *mosi_straddr(COMSTACK h, const char *str)
-{
- mosi_state *st = h->cprivate;
- struct netbuf *ret = &st->netbuf;
-
- if (!mosi_strtoaddr_ex (str, ret))
- {
- xfree (ret);
- return 0;
- }
- return ret;
-}
-
-int mosi_connect(COMSTACK h, void *address)
-{
- struct netbuf *addr = address, *local;
- struct t_call *snd, *rcv;
- struct t_bind bnd;
-
- if (!(snd = (struct t_call *) u_alloc(h->iofile, T_CALL, T_ALL)))
- return -1;
- if (!(rcv = (struct t_call *) u_alloc(h->iofile, T_CALL, T_ALL)))
- return -1;
-
- snd->udata.len = 0;
- if (addopt(&snd->opt, ISO_APCO, AP_CNTX_NAME, h->protocol, CLASS_APPCTX,
- VAL_BASIC_CTX) < 0)
- return -1;
- if (addopt(&snd->opt, ISO_APCO, AP_ABS_SYN, h->protocol, CLASS_ABSYN,
- VAL_APDU) < 0)
- return -1;
- /*
- * We don't specify record formats yet.
- *
- * Xtimosi adds the oid for BER as transfer syntax automatically.
- */
-
- bnd.qlen = 0;
-
- if (h->state == CS_UNBND)
- {
- local = mosi_strtoaddr(""); /* not good in long run */
- memcpy(&bnd.addr, local, sizeof(*local));
- if (u_bind(h->iofile, &bnd, 0) < 0)
- return -1;
- }
-
- memcpy(&snd->addr, addr, sizeof(*addr));
- if (u_connect(h->iofile, snd, rcv) < 0)
- {
- if (t_errno == TNODATA)
- return 1;
- return -1;
- }
- return 0;
-}
-
-int mosi_rcvconnect(COMSTACK h)
-{
- if (u_rcvconnect(h->iofile, 0) < 0)
- {
- if (t_errno == TNODATA)
- return 1;
- return -1;
- }
- return 0;
-}
-
-int mosi_bind(COMSTACK h, void *address, int mode)
-{
- int res;
- struct t_bind bnd;
- int one = 1;
-
- if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0)
- {
- h->cerrno = CSYSERR;
- return -1;
- }
- if (mode == CS_SERVER)
- bnd.qlen = 3;
- else
- bnd.qlen = 0;
- memcpy(&bnd.addr, address, sizeof(struct netbuf));
- if ((res = u_bind(h->iofile, &bnd, 0)) < 0)
- return -1;
- h->state = CS_IDLE;
- return 0;
-}
-
-int mosi_listen(COMSTACK h, char *addp, int *addrlen)
-{
- int res;
- mosi_state *st = h->cprivate;
-
- if (!(st->call = (struct t_call*) t_alloc(h->iofile, T_CALL_STR,
- T_ALL)))
- return -1;
- if ((res = u_listen(h->iofile, st->call)) < 0)
- {
- if (t_errno == TNODATA)
- return 1;
- return -1;
- }
- h->state = CS_INCON;
- return 0;
-}
-
-COMSTACK mosi_accept(COMSTACK h)
-{
- COMSTACK new;
- void *local;
- struct mosi_state *st = h->cprivate, *ns;
- int flags = O_RDWR;
-
- if (h->state != CS_INCON)
- {
- h->cerrno = CSOUTSTATE;
- return 0;
- }
- if (!(new = xmalloc(sizeof(*new))))
- return 0;
- *new = *h;
- if (!(new->cprivate = ns = xmalloc(sizeof(*ns))))
- return 0;
- *ns = *st;
- if (!h->blocking)
- flags |= O_NONBLOCK;
- if ((new->iofile = u_open_r(CO_MOSI_NAME, flags, &st->info, st->call)) < 0)
- return 0;
- if (!(local = mosi_strtoaddr("")))
- return 0;
- if (mosi_bind(new, local, CS_CLIENT) < 0) /* CS_CLIENT: qlen == 0 */
- return 0;
- memcpy(&st->call->addr, local, sizeof(st->call->addr));
- if (u_accept(h->iofile, new->iofile, st->call) < 0)
- {
- mosi_close(new);
- return 0;
- }
- return new;
-}
-
-#define CS_MOSI_BUFCHUNK 4096
-
-int mosi_get(COMSTACK h, char **buf, int *bufsize)
-{
- int flags = 0, res;
- mosi_state *ct = h->cprivate;
- int got;
-
- do
- {
- if (!*bufsize)
- {
- if (!(*buf = xmalloc(*bufsize = CS_MOSI_BUFCHUNK)))
- return -1;
- }
- else if (*bufsize - ct->hasread < CS_MOSI_BUFCHUNK)
- if (!(*buf =xrealloc(*buf, *bufsize *= 2)))
- return -1;
-
- if ((res = u_rcv(h->iofile, *buf + ct->hasread, CS_MOSI_BUFCHUNK,
- &flags)) <= 0)
- {
- if (t_errno == TNODATA)
- return 1;
- return -1;
- }
- ct->hasread += res;
- }
- while (flags & T_MORE);
-
- /* all done. Reset hasread */
- got = ct->hasread;
- ct->hasread = 0;
- return got;
-}
-
-int mosi_put(COMSTACK h, char *buf, int size)
-{
- mosi_state *ct = h->cprivate;
- int res = u_snd(h->iofile, buf + ct->haswrit, size - ct->haswrit, 0);
-
- if (res == size - ct->haswrit)
- {
- ct->haswrit = 0;
- return 0;
- }
- else if (res < 0)
- {
- if (t_errno == TFLOW)
- return 1;
- return -1;
- }
- ct->haswrit += res;
- return 1;
-}
-
-int mosi_close(COMSTACK h)
-{
- xfree(h->cprivate);
- if (h->iofile >= 0)
- u_close(h->iofile);
- xfree(h);
- return 0;
-}
-
-char *mosi_addrstr(COMSTACK h)
-{
- return "osi:[UNIMPLEMENTED]";
-}
-
-#endif
dnl YAZ Toolkit, Index Data 1994-2003
dnl See the file LICENSE for details.
-dnl $Id: configure.in,v 1.116 2003-10-09 15:51:36 adam Exp $
+dnl $Id: configure.in,v 1.117 2003-10-27 12:21:21 adam Exp $
AC_INIT(include/yaz/yaz-version.h)
AM_INIT_AUTOMAKE(yaz, 2.0.5)
AM_MAINTAINER_MODE
AC_OUTPUT([
Makefile
yaz.spec
+src/Makefile
+test/Makefile
util/Makefile
-odr/Makefile
-z39.50/Makefile
-ill/Makefile
-zutil/Makefile
-comstack/Makefile
-ccl/Makefile
-cql/Makefile
-server/Makefile
include/Makefile
include/yaz/Makefile
-lib/Makefile
client/Makefile
ztest/Makefile
zoom/Makefile
doc/yazhtml.xsl
etc/Makefile
yaz-config
-],[sed s%yaz_echo_source=yes%yaz_echo_source=no%g < yaz-config > lib/yaz-config && chmod +x yaz-config lib/yaz-config])
+],[sed s%yaz_echo_source=yes%yaz_echo_source=no%g < yaz-config > util/yaz-config && chmod +x yaz-config util/yaz-config])
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-cql.c
-cql2pqf
-cql2xcql
+++ /dev/null
-# $Id: Makefile.am,v 1.4 2003-05-27 09:47:15 mike Exp $
-AM_YFLAGS=-p cql_
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-noinst_LTLIBRARIES = libcql.la
-noinst_PROGRAMS = cql2pqf cql2xcql
-
-EXTRA_DIST=lexer.c
-
-libcql_la_SOURCES=cql.y cqlstdio.c cqltransform.c \
- cqlutil.c xcqlutil.c cqlstring.c cqlstrer.c
-
-cql2pqf_SOURCES = cql2pqf.c
-cql2xcql_SOURCES = cql2xcql.c
-
-LDADD=libcql.la ../util/libutil.la
+++ /dev/null
-/* $Id: cql.y,v 1.6 2003-09-04 18:13:39 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-
- bison parser for CQL grammar.
-*/
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <yaz/nmem.h>
-#include <yaz/cql.h>
-
- typedef struct {
- struct cql_node *rel;
- struct cql_node *cql;
- char *buf;
- size_t len;
- size_t size;
- } token;
-
- struct cql_parser {
- int (*getbyte)(void *client_data);
- void (*ungetbyte)(int b, void *client_data);
- void *client_data;
- int last_error;
- int last_pos;
- struct cql_node *top;
- NMEM nmem;
- };
-
-#define YYSTYPE token
-
-#define YYPARSE_PARAM parm
-#define YYLEX_PARAM parm
-
- int yylex(YYSTYPE *lval, void *vp);
- int yyerror(char *s);
-%}
-
-%pure_parser
-%token TERM AND OR NOT PROX GE LE NE
-%expect 8
-
-%%
-
-top: {
- $$.rel = cql_node_mk_sc("srw.serverChoice", "scr", 0);
- ((CQL_parser) parm)->top = 0;
-} cqlQuery1 {
- cql_node_destroy($$.rel);
- ((CQL_parser) parm)->top = $2.cql;
-}
-;
-
-cqlQuery1: cqlQuery
-| cqlQuery error {
- cql_node_destroy($1.cql);
- $$.cql = 0;
-}
-;
-
-cqlQuery:
- searchClause
-|
- cqlQuery boolean {
- $$.rel = $0.rel;
- } searchClause {
- struct cql_node *cn = cql_node_mk_boolean($2.buf);
-
- cn->u.boolean.modifiers = $2.rel;
- cn->u.boolean.left = $1.cql;
- cn->u.boolean.right = $4.cql;
-
- $$.cql = cn;
- }
-;
-
-searchClause:
- '(' {
- $$.rel = $0.rel;
-
- } cqlQuery ')' {
- $$.cql = $3.cql;
- }
-|
- searchTerm {
- struct cql_node *st = cql_node_dup ($0.rel);
- st->u.st.term = strdup($1.buf);
- $$.cql = st;
- }
-|
- index relation {
- $$.rel = $2.rel;
- $$.rel->u.st.index = strdup($1.buf);
- } searchClause {
- $$.cql = $4.cql;
- cql_node_destroy($2.rel);
- }
-| '>' searchTerm '=' searchTerm {
- $$.rel = $0.rel;
- } cqlQuery {
- $$.cql = cql_node_prefix($6.cql, $2.buf, $4.buf);
- }
-| '>' searchTerm {
- $$.rel = $0.rel;
- } cqlQuery {
- $$.cql = cql_node_prefix($4.cql, 0, $2.buf);
- }
-;
-
-/* unary NOT search TERM here .. */
-
-boolean:
- AND | OR | NOT | PROX proxqualifiers {
- $$ = $1;
- $$.rel = $2.rel;
- }
- ;
-
-proxqualifiers:
- Prelation {
- $$.rel = cql_node_mk_proxargs ($1.buf, 0, 0, 0);
- }
-|
- PrelationO Pdistance {
- $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, 0, 0);
- }
-|
- PrelationO PdistanceO Punit {
- $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, 0);
- }
-|
- PrelationO PdistanceO PunitO Pordering {
- $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, $4.buf);
- }
-|
-{ $$.rel = 0; }
-;
-
-Punit: '/' searchTerm {
- $$ = $2;
- }
-;
-
-PunitO: '/' searchTerm {
- $$ = $2;
- }
-|
-'/' { $$.buf[0] = 0; }
-;
-Prelation: '/' baseRelation {
- $$ = $2;
-}
-;
-PrelationO: '/' baseRelation {
- $$ = $2;
-}
-| '/' { $$.buf[0] = 0; }
-;
-Pdistance: '/' searchTerm {
- $$ = $2;
-}
-;
-
-PdistanceO: '/' searchTerm {
- $$ = $2;
-}
-| '/' { $$.buf[0] = 0; }
-;
-Pordering: '/' searchTerm {
- $$ = $2;
-}
-;
-
-relation: baseRelation modifiers {
- struct cql_node *st = cql_node_mk_sc(/* index */ 0,
- /* relation */ $1.buf,
- /* term */ 0);
-
- st->u.st.modifiers = $2.cql;
- $$.rel = st;
-}
-;
-
-modifiers: '/' searchTerm modifiers
-{
- struct cql_node *mod = cql_node_mk_mod(0, $2.buf);
-
- mod->u.mod.next = $3.cql;
- $$.cql = mod;
-}
-|
-{
- $$.cql = 0;
-}
-;
-
-baseRelation:
- '='
-| '>'
-| '<'
-| GE
-| LE
-| NE
-| TERM
-;
-
-index:
- searchTerm;
-
-searchTerm:
- TERM
-| AND
-| OR
-| NOT
-| PROX
-;
-
-%%
-
-int yyerror(char *s)
-{
- return 0;
-}
-
-#include "lexer.c"
-
-
-int cql_parser_stream(CQL_parser cp,
- int (*getbyte)(void *client_data),
- void (*ungetbyte)(int b, void *client_data),
- void *client_data)
-{
- cp->getbyte = getbyte;
- cp->ungetbyte = ungetbyte;
- cp->client_data = client_data;
- if (cp->top)
- cql_node_destroy(cp->top);
- cql_parse(cp);
- if (cp->top)
- return 0;
- return -1;
-}
-
-CQL_parser cql_parser_create(void)
-{
- CQL_parser cp = (CQL_parser) malloc (sizeof(*cp));
-
- cp->top = 0;
- cp->getbyte = 0;
- cp->ungetbyte = 0;
- cp->client_data = 0;
- cp->last_error = 0;
- cp->last_pos = 0;
- cp->nmem = nmem_create();
- return cp;
-}
-
-void cql_parser_destroy(CQL_parser cp)
-{
- cql_node_destroy(cp->top);
- nmem_destroy(cp->nmem);
- free (cp);
-}
-
-struct cql_node *cql_parser_result(CQL_parser cp)
-{
- return cp->top;
-}
+++ /dev/null
-/* $Id: cql2pqf.c,v 1.2 2003-06-04 09:45:00 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <yaz/cql.h>
-
-int main(int argc, char **argv)
-{
- cql_transform_t ct;
- int r;
- int i, it = 1;
- CQL_parser cp = cql_parser_create();
-
- if (argc < 2)
- {
- fprintf (stderr, "usage\n cqltransform <properties> [<query>] [interations]\n");
- exit (1);
- }
- ct = cql_transform_open_fname(argv[1]);
- if (!ct)
- {
- fprintf (stderr, "failed to read properties %s\n", argv[1]);
- exit (1);
- }
- if (argc >= 4)
- it = atoi(argv[3]);
-
- for (i = 0; i<it; i++)
- {
- if (argc >= 3)
- r = cql_parser_string(cp, argv[2]);
- else
- r = cql_parser_stdio(cp, stdin);
-
- if (r)
- fprintf (stderr, "Syntax error\n");
- else
- {
- r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
- printf("\n");
- if (r)
- {
- const char *addinfo;
- cql_transform_error(ct, &addinfo);
- printf ("Transform error %d %s\n", r, addinfo ? addinfo : "");
- }
- }
- }
- cql_transform_close(ct);
- cql_parser_destroy(cp);
- return 0;
-}
+++ /dev/null
-/* $Id: cql2xcql.c,v 1.1 2003-01-06 08:20:27 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <stdio.h>
-
-#include <yaz/cql.h>
-
-int main(int argc, char **argv)
-{
- int r;
- CQL_parser cp = cql_parser_create();
- if (argc == 2)
- r = cql_parser_string(cp, argv[1]);
- else
- r = cql_parser_stdio(cp, stdin);
- if (r)
- fprintf (stderr, "Syntax error\n");
- else
- cql_to_xml_stdio(cql_parser_result(cp), stdout);
- cql_parser_destroy(cp);
- return 0;
-}
+++ /dev/null
-/* $Id: cqlstdio.c,v 1.1 2003-01-06 08:20:27 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <yaz/cql.h>
-
-int getbyte_stream(void *client_data)
-{
- FILE *f = (FILE*) client_data;
-
- int c = fgetc(f);
- if (c == EOF)
- return 0;
- return c;
-}
-
-void ungetbyte_stream (int c, void *client_data)
-{
- FILE *f = (FILE*) client_data;
-
- if (c == 0)
- c = EOF;
- ungetc(c, f);
-}
-
-int cql_parser_stdio(CQL_parser cp, FILE *f)
-{
- return cql_parser_stream(cp, getbyte_stream, ungetbyte_stream, f);
-}
-
-
+++ /dev/null
-/* $Id: cqlstrer.c,v 1.1 2003-05-27 09:47:15 mike Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <yaz/cql.h>
-
-/*
- * The error-messages associated with these codes are taken from
- * the SRW diagnostic specifications at
- * http://www.loc.gov/srw/diagnostic-list.html
- */
-const char *cql_strerror(int code) {
- static char buf[80];
- switch (code) {
- case 10: return "Illegal query";
- case 11: return "Unsupported query type (XCQL vs CQL)";
- case 12: return "Too many characters in query";
- case 13: return "Unbalanced or illegal use of parentheses";
- case 14: return "Unbalanced or illegal use of quotes";
- case 15: return "Illegal or unsupported index set";
- case 16: return "Illegal or unsupported index";
- case 17: return "Illegal or unsupported combination of index and index set";
- case 18: return "Illegal or unsupported combination of indexes";
- case 19: return "Illegal or unsupported relation";
- case 20: return "Illegal or unsupported relation modifier";
- case 21: return "Illegal or unsupported combination of relation modifers";
- case 22: return "Illegal or unsupported combination of relation and index";
- case 23: return "Too many characters in term";
- case 24: return "Illegal combination of relation and term";
- case 25: return "Special characters not quoted in term";
- case 26: return "Non special character escaped in term";
- case 27: return "Empty term unsupported";
- case 28: return "Masking character not supported";
- case 29: return "Masked words too short";
- case 30: return "Too many masking characters in term";
- case 31: return "Anchoring character not supported";
- case 32: return "Anchoring character in illegal or unsupported position";
- case 33: return "Combination of proximity/adjacency and masking characters not supported";
- case 34: return "Combination of proximity/adjacency and anchoring characters not supported";
- case 35: return "Terms only exclusion (stop) words";
- case 36: return "Term in invalid format for index or relation";
- case 37: return "Illegal or unsupported boolean operator";
- case 38: return "Too many boolean operators in query";
- case 39: return "Proximity not supported";
- case 40: return "Illegal or unsupported proximity relation";
- case 41: return "Illegal or unsupported proximity distance";
- case 42: return "Illegal or unsupported proximity unit";
- case 43: return "Illegal or unsupported proximity ordering";
- case 44: return "Illegal or unsupported combination of proximity modifiers";
- case 45: return "Index set name (prefix) assigned to multiple identifiers";
- default: break;
- }
-
- sprintf(buf, "Unknown CQL error #%d", code);
- return buf;
-}
+++ /dev/null
-/* $Id: cqlstring.c,v 1.2 2003-02-14 18:49:23 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE for details.
-*/
-#include <yaz/cql.h>
-
-struct cql_buf_info {
- const char *str;
- int off;
-};
-
-int getbuf(void *vp)
-{
- struct cql_buf_info *bi = (struct cql_buf_info *) vp;
- if (bi->str[bi->off] == 0)
- return 0;
- return bi->str[bi->off++];
-}
-
-void ungetbuf(int b, void *vp)
-{
- struct cql_buf_info *bi = (struct cql_buf_info *) vp;
- if (b)
- (bi->off--);
-}
-
-int cql_parser_string(CQL_parser cp, const char *str)
-{
- struct cql_buf_info b;
-
- b.str = str;
- b.off = 0;
-
- return cql_parser_stream(cp, getbuf, ungetbuf, &b);
-}
-
+++ /dev/null
-/* $Id: cqltransform.c,v 1.4 2003-02-25 18:08:46 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <stdlib.h>
-#include <string.h>
-#include <yaz/cql.h>
-
-struct cql_prop_entry {
- char *pattern;
- char *value;
- struct cql_prop_entry *next;
-};
-
-struct cql_transform_t_ {
- struct cql_prop_entry *entry;
- int error;
- char *addinfo;
-};
-
-cql_transform_t cql_transform_open_FILE(FILE *f)
-{
- char line[1024];
- cql_transform_t ct = (cql_transform_t) malloc (sizeof(*ct));
- struct cql_prop_entry **pp = &ct->entry;
-
- ct->error = 0;
- ct->addinfo = 0;
- while (fgets(line, sizeof(line)-1, f))
- {
- const char *cp_value_start;
- const char *cp_value_end;
- const char *cp_pattern_end;
- const char *cp = line;
- while (*cp && !strchr(" \t=\r\n#", *cp))
- cp++;
- cp_pattern_end = cp;
- if (cp == line)
- continue;
- while (*cp && strchr(" \t\r\n", *cp))
- cp++;
- if (*cp != '=')
- continue;
- cp++;
- while (*cp && strchr(" \t\r\n", *cp))
- cp++;
- cp_value_start = cp;
- if (!(cp_value_end = strchr(cp, '#')))
- cp_value_end = strlen(line) + line;
-
- if (cp_value_end != cp_value_start &&
- strchr(" \t\r\n", cp_value_end[-1]))
- cp_value_end--;
- *pp = (struct cql_prop_entry *) malloc (sizeof(**pp));
- (*pp)->pattern = (char *) malloc (cp_pattern_end - line + 1);
- memcpy ((*pp)->pattern, line, cp_pattern_end - line);
- (*pp)->pattern[cp_pattern_end-line] = 0;
-
- (*pp)->value = (char *) malloc (cp_value_end - cp_value_start + 1);
- if (cp_value_start != cp_value_end)
- memcpy ((*pp)->value, cp_value_start, cp_value_end-cp_value_start);
- (*pp)->value[cp_value_end - cp_value_start] = 0;
- pp = &(*pp)->next;
- }
- *pp = 0;
- return ct;
-}
-
-void cql_transform_close(cql_transform_t ct)
-{
- struct cql_prop_entry *pe;
- if (!ct)
- return;
- pe = ct->entry;
- while (pe)
- {
- struct cql_prop_entry *pe_next = pe->next;
- free (pe->pattern);
- free (pe->value);
- free (pe);
- pe = pe_next;
- }
- if (ct->addinfo)
- free (ct->addinfo);
- free (ct);
-}
-
-cql_transform_t cql_transform_open_fname(const char *fname)
-{
- cql_transform_t ct;
- FILE *f = fopen(fname, "r");
- if (!f)
- return 0;
- ct = cql_transform_open_FILE(f);
- fclose(f);
- return ct;
-}
-
-static const char *cql_lookup_property(cql_transform_t ct,
- const char *pat1, const char *pat2)
-{
- char pattern[80];
- struct cql_prop_entry *e;
-
- if (pat2)
- sprintf (pattern, "%.39s%.39s", pat1, pat2);
- else
- sprintf (pattern, "%.39s", pat1);
- for (e = ct->entry; e; e = e->next)
- {
- if (!strcmp(e->pattern, pattern))
- return e->value;
- }
- return 0;
-}
-
-static const char *cql_lookup_value(cql_transform_t ct,
- const char *prefix,
- const char *value)
-{
- struct cql_prop_entry *e;
- int len = strlen(prefix);
-
- for (e = ct->entry; e; e = e->next)
- {
- if (!memcmp(e->pattern, prefix, len) && !strcmp(e->value, value))
- return e->pattern + len;
- }
- return 0;
-}
-
-
-int cql_pr_attr(cql_transform_t ct, const char *category,
- const char *val,
- const char *default_val,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- int errcode)
-{
- const char *res;
- res = cql_lookup_property(ct, category, val ? val : default_val);
- if (!res)
- res = cql_lookup_property(ct, category, "*");
- if (res)
- {
- char buf[64];
-
- const char *cp0 = res, *cp1;
- while ((cp1 = strchr(cp0, '=')))
- {
- while (*cp1 && *cp1 != ' ')
- cp1++;
- if (cp1 - cp0 >= sizeof(buf))
- break;
- memcpy (buf, cp0, cp1 - cp0);
- buf[cp1-cp0] = 0;
- (*pr)("@attr ", client_data);
- (*pr)(buf, client_data);
- (*pr)(" ", client_data);
- cp0 = cp1;
- while (*cp0 == ' ')
- cp0++;
- }
- return 1;
- }
- /* error ... */
- if (errcode && !ct->error)
- {
- ct->error = errcode;
- ct->addinfo = strdup(val);
- }
- return 0;
-}
-
-void emit_term(cql_transform_t ct,
- const char *term, int length,
- void (*pr)(const char *buf, void *client_data),
- void *client_data)
-{
- int i;
- if (length > 0)
- {
- if (length > 1 && term[0] == '^' && term[length-1] == '^')
- {
- cql_pr_attr(ct, "position.", "firstAndLast", 0,
- pr, client_data, 32);
- term++;
- length -= 2;
- }
- else if (term[0] == '^')
- {
- cql_pr_attr(ct, "position.", "first", 0,
- pr, client_data, 32);
- term++;
- }
- else if (term[length-1] == '^')
- {
- cql_pr_attr(ct, "position.", "last", 0,
- pr, client_data, 32);
- length--;
- }
- else
- {
- cql_pr_attr(ct, "position.", "any", 0,
- pr, client_data, 32);
- }
- }
- (*pr)("\"", client_data);
- for (i = 0; i<length; i++)
- {
- char buf[2];
- buf[0] = term[i];
- buf[1] = 0;
- (*pr)(buf, client_data);
- }
- (*pr)("\" ", client_data);
-}
-
-void emit_wordlist(cql_transform_t ct,
- struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- const char *op)
-{
- const char *cp0 = cn->u.st.term;
- const char *cp1;
- const char *last_term = 0;
- int last_length = 0;
- while(cp0)
- {
- while (*cp0 == ' ')
- cp0++;
- cp1 = strchr(cp0, ' ');
- if (last_term)
- {
- (*pr)("@", client_data);
- (*pr)(op, client_data);
- (*pr)(" ", client_data);
- emit_term(ct, last_term, last_length, pr, client_data);
- }
- last_term = cp0;
- if (cp1)
- last_length = cp1 - cp0;
- else
- last_length = strlen(cp0);
- cp0 = cp1;
- }
- if (last_term)
- emit_term(ct, last_term, last_length, pr, client_data);
-}
-
-
-static const char *cql_get_ns(cql_transform_t ct,
- struct cql_node *cn,
- struct cql_node **prefix_ar, int prefix_level,
- const char **n_prefix,
- const char **n_suffix)
-{
- int i;
- const char *ns = 0;
- char prefix[32];
- const char *cp = cn->u.st.index;
- const char *cp_dot = strchr(cp, '.');
-
- /* strz current prefix (empty if not given) */
- if (cp_dot && cp_dot-cp < sizeof(prefix))
- {
- memcpy (prefix, cp, cp_dot - cp);
- prefix[cp_dot - cp] = 0;
- }
- else
- *prefix = 0;
-
- /* 2. lookup in prefix_ar. and return NS */
- for (i = prefix_level; !ns && --i >= 0; )
- {
- struct cql_node *cn_prefix = prefix_ar[i];
- for (; cn_prefix; cn_prefix = cn_prefix->u.mod.next)
- {
- if (*prefix && cn_prefix->u.mod.name &&
- !strcmp(prefix, cn_prefix->u.mod.name))
- {
- ns = cn_prefix->u.mod.value;
- break;
- }
- else if (!*prefix && !cn_prefix->u.mod.name)
- {
- ns = cn_prefix->u.mod.value;
- break;
- }
- }
- }
- if (!ns)
- {
- if (!ct->error)
- {
- ct->error = 15;
- ct->addinfo = strdup(prefix);
- }
- return 0;
- }
- /* 3. lookup in set.NS for new prefix */
- *n_prefix = cql_lookup_value(ct, "set.", ns);
- if (!*n_prefix)
- {
- if (!ct->error)
- {
- ct->error = 15;
- ct->addinfo = strdup(ns);
- }
- return 0;
- }
- /* 4. lookup qualifier.prefix. */
-
- cp = cn->u.st.index;
- cp_dot = strchr(cp, '.');
-
- *n_suffix = cp_dot ? cp_dot+1 : cp;
- return ns;
-}
-
-void cql_transform_r(cql_transform_t ct,
- struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- struct cql_node **prefix_ar, int prefix_level)
-{
- const char *ns, *n_prefix, *n_suffix;
-
- if (!cn)
- return;
- switch (cn->which)
- {
- case CQL_NODE_ST:
- if (cn->u.st.prefixes && prefix_level < 20)
- prefix_ar[prefix_level++] = cn->u.st.prefixes;
- ns = cql_get_ns(ct, cn, prefix_ar, prefix_level, &n_prefix, &n_suffix);
- if (ns)
- {
- char n_full[64];
- sprintf (n_full, "%.20s.%.40s", n_prefix, n_suffix);
-
- if (!strcmp(ns, "http://www.loc.gov/zing/cql/srw-indexes/v1.0/")
- && !strcmp(n_suffix, "resultSet"))
- {
- (*pr)("@set \"", client_data);
- (*pr)(cn->u.st.term, client_data);
- (*pr)("\" ", client_data);
- return ;
- }
- cql_pr_attr(ct, "qualifier.", n_full, "srw.serverChoice",
- pr, client_data, 16);
- }
-
- if (cn->u.st.relation && !strcmp(cn->u.st.relation, "="))
- cql_pr_attr(ct, "relation.", "eq", "scr",
- pr, client_data, 19);
- else if (cn->u.st.relation && !strcmp(cn->u.st.relation, "<="))
- cql_pr_attr(ct, "relation.", "le", "scr",
- pr, client_data, 19);
- else if (cn->u.st.relation && !strcmp(cn->u.st.relation, ">="))
- cql_pr_attr(ct, "relation.", "ge", "scr",
- pr, client_data, 19);
- else
- cql_pr_attr(ct, "relation.", cn->u.st.relation, "eq",
- pr, client_data, 19);
- if (cn->u.st.modifiers)
- {
- struct cql_node *mod = cn->u.st.modifiers;
- for (; mod; mod = mod->u.mod.next)
- {
- cql_pr_attr(ct, "relationModifier.", mod->u.mod.value, 0,
- pr, client_data, 20);
- }
- }
- cql_pr_attr(ct, "structure.", cn->u.st.relation, 0,
- pr, client_data, 24);
- if (cn->u.st.relation && !strcmp(cn->u.st.relation, "all"))
- {
- emit_wordlist(ct, cn, pr, client_data, "and");
- }
- else if (cn->u.st.relation && !strcmp(cn->u.st.relation, "any"))
- {
- emit_wordlist(ct, cn, pr, client_data, "or");
- }
- else
- {
- emit_term(ct, cn->u.st.term, strlen(cn->u.st.term),
- pr, client_data);
- }
- break;
- case CQL_NODE_BOOL:
- if (cn->u.boolean.prefixes && prefix_level < 20)
- prefix_ar[prefix_level++] = cn->u.boolean.prefixes;
- (*pr)("@", client_data);
- (*pr)(cn->u.boolean.value, client_data);
- (*pr)(" ", client_data);
-
- cql_transform_r(ct, cn->u.boolean.left, pr, client_data,
- prefix_ar, prefix_level);
- cql_transform_r(ct, cn->u.boolean.right, pr, client_data,
- prefix_ar, prefix_level);
- }
-}
-
-int cql_transform(cql_transform_t ct,
- struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data)
-{
- struct cql_node *prefix_ar[20], **pp;
- struct cql_prop_entry *e;
-
- ct->error = 0;
- if (ct->addinfo)
- free (ct->addinfo);
- ct->addinfo = 0;
-
- prefix_ar[0] = 0;
- pp = &prefix_ar[0];
- for (e = ct->entry; e ; e = e->next)
- {
- if (!memcmp(e->pattern, "set.", 4))
- {
- *pp = cql_node_mk_mod(e->pattern+4, e->value);
- pp = &(*pp)->u.mod.next;
- }
- else if (!strcmp(e->pattern, "set"))
- {
- *pp = cql_node_mk_mod(0, e->value);
- pp = &(*pp)->u.mod.next;
- }
- }
- cql_transform_r (ct, cn, pr, client_data, prefix_ar, 1);
- cql_node_destroy(prefix_ar[0]);
- return ct->error;
-}
-
-
-int cql_transform_FILE(cql_transform_t ct, struct cql_node *cn, FILE *f)
-{
- return cql_transform(ct, cn, cql_fputs, f);
-}
-
-int cql_transform_buf(cql_transform_t ct, struct cql_node *cn,
- char *out, int max)
-{
- struct cql_buf_write_info info;
- int r;
-
- info.off = 0;
- info.max = max;
- info.buf = out;
- r = cql_transform(ct, cn, cql_buf_write_handler, &info);
- if (info.off >= 0)
- info.buf[info.off] = '\0';
- return r;
-}
-
-int cql_transform_error(cql_transform_t ct, const char **addinfo)
-{
- *addinfo = ct->addinfo;
- return ct->error;
-}
+++ /dev/null
-/* $Id: cqlutil.c,v 1.3 2003-03-03 19:57:35 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <yaz/cql.h>
-
-void cql_fputs(const char *buf, void *client_data)
-{
- FILE *f = (FILE *) client_data;
- fputs(buf, f);
-}
-
-struct cql_node *cql_node_dup (struct cql_node *cp)
-{
- struct cql_node *cn = 0;
-
- if (!cp)
- return 0;
- switch (cp->which)
- {
- case CQL_NODE_ST:
- cn = cql_node_mk_sc(cp->u.st.index,
- cp->u.st.relation,
- cp->u.st.term);
- cn->u.st.modifiers = cql_node_dup(cp->u.st.modifiers);
- cn->u.st.prefixes = cql_node_dup(cp->u.st.prefixes);
- break;
- case CQL_NODE_MOD:
- cn = cql_node_mk_mod(cp->u.mod.name,
- cp->u.mod.value);
- cn->u.mod.next = cql_node_dup(cp->u.mod.next);
- break;
- case CQL_NODE_BOOL:
- cn = cql_node_mk_boolean(cp->u.boolean.value);
- cn->u.boolean.left = cql_node_dup(cp->u.boolean.left);
- cn->u.boolean.right = cql_node_dup(cp->u.boolean.right);
- cn->u.boolean.prefixes = cql_node_dup(cp->u.boolean.prefixes);
- }
- return cn;
-}
-
-struct cql_node *cql_node_mk_sc(const char *index,
- const char *relation,
- const char *term)
-{
- struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
- p->which = CQL_NODE_ST;
- p->u.st.index = 0;
- if (index)
- p->u.st.index = strdup(index);
- p->u.st.term = 0;
- if (term)
- p->u.st.term = strdup(term);
- p->u.st.relation = 0;
- if (relation)
- p->u.st.relation = strdup(relation);
- p->u.st.modifiers = 0;
- p->u.st.prefixes = 0;
- return p;
-}
-
-struct cql_node *cql_node_mk_mod(const char *name,
- const char *value)
-{
- struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
- p->which = CQL_NODE_MOD;
-
- p->u.mod.name = 0;
- if (name)
- p->u.mod.name = strdup(name);
- p->u.mod.value = 0;
- if (value)
- p->u.mod.value = strdup(value);
- p->u.mod.next = 0;
- return p;
-}
-
-struct cql_node *cql_node_mk_boolean(const char *op)
-{
- struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
- p->which = CQL_NODE_BOOL;
- p->u.boolean.value = 0;
- if (op)
- p->u.boolean.value = strdup(op);
- p->u.boolean.left = 0;
- p->u.boolean.right = 0;
- p->u.boolean.modifiers = 0;
- p->u.boolean.prefixes = 0;
- return p;
-}
-
-struct cql_node *cql_node_prefix(struct cql_node *n, const char *prefix,
- const char *uri)
-{
- struct cql_node **cpp = 0;
- if (n->which == CQL_NODE_ST)
- {
- cpp = &n->u.st.prefixes;
- }
- else if (n->which == CQL_NODE_BOOL)
- {
- cpp = &n->u.boolean.prefixes;
- }
- if (cpp)
- {
- struct cql_node *cp = cql_node_mk_mod(prefix, uri);
- cp->u.mod.next = *cpp;
- *cpp = cp;
- }
- return n;
-}
-
-struct cql_node *cql_node_mk_proxargs(const char *relation,
- const char *distance,
- const char *unit,
- const char *ordering)
-{
- struct cql_node *m = 0, *m1;
-
- if (ordering && *ordering)
- m = cql_node_mk_mod("ordering", ordering);
- if (unit && *unit)
- {
- m1 = cql_node_mk_mod("unit", unit);
- m1->u.mod.next = m;
- m = m1;
- }
- if (distance && *distance)
- {
- m1 = cql_node_mk_mod("distance", distance);
- m1->u.mod.next = m;
- m = m1;
- }
- if (relation && *relation)
- {
- m1 = cql_node_mk_mod("relation", relation);
- m1->u.mod.next = m;
- m = m1;
- }
- return m;
-}
-
-void cql_node_destroy(struct cql_node *cn)
-{
- if (!cn)
- return;
- switch (cn->which)
- {
- case CQL_NODE_ST:
- free (cn->u.st.index);
- free (cn->u.st.relation);
- free (cn->u.st.term);
- cql_node_destroy(cn->u.st.modifiers);
- cql_node_destroy(cn->u.st.prefixes);
- break;
- case CQL_NODE_MOD:
- free (cn->u.mod.name);
- free (cn->u.mod.value);
- cql_node_destroy(cn->u.mod.next);
- break;
- case CQL_NODE_BOOL:
- free (cn->u.boolean.value);
- cql_node_destroy(cn->u.boolean.left);
- cql_node_destroy(cn->u.boolean.right);
- cql_node_destroy(cn->u.boolean.prefixes);
- }
- free (cn);
-}
-
+++ /dev/null
-/* $Id: lexer.c,v 1.5 2003-09-04 18:13:39 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-
-static void putb(YYSTYPE *lval, CQL_parser cp, int c)
-{
- if (lval->len+1 >= lval->size)
- {
- char *nb = nmem_malloc(cp->nmem, (lval->size = lval->len * 2 + 20));
- memcpy (nb, lval->buf, lval->len);
- lval->buf = nb;
- }
- if (c)
- lval->buf[lval->len++] = c;
- lval->buf[lval->len] = '\0';
-}
-
-/*
- * bison lexer for CQL.
- */
-
-int yylex(YYSTYPE *lval, void *vp)
-{
- CQL_parser cp = (CQL_parser) vp;
- int c;
- lval->cql = 0;
- lval->rel = 0;
- lval->len = 0;
- lval->size = 10;
- lval->buf = nmem_malloc(cp->nmem, lval->size);
- lval->buf[0] = '\0';
- do
- {
- c = cp->getbyte(cp->client_data);
- if (c == 0)
- return 0;
- if (c == '\n')
- return 0;
- } while (isspace(c));
- if (strchr("()=></", c))
- {
- int c1;
- putb(lval, cp, c);
- if (c == '>')
- {
- c1 = cp->getbyte(cp->client_data);
- if (c1 == '=')
- {
- putb(lval, cp, c1);
- return GE;
- }
- else
- cp->ungetbyte(c1, cp->client_data);
- }
- else if (c == '<')
- {
- c1 = cp->getbyte(cp->client_data);
- if (c1 == '=')
- {
- putb(lval, cp, c1);
- return LE;
- }
- else if (c1 == '>')
- {
- putb(lval, cp, c1);
- return NE;
- }
- else
- cp->ungetbyte(c1, cp->client_data);
- }
- return c;
- }
- if (c == '"')
- {
- while ((c = cp->getbyte(cp->client_data)) != EOF && c != '"')
- {
- if (c == '\\')
- c = cp->getbyte(cp->client_data);
- putb(lval, cp, c);
- }
- putb(lval, cp, 0);
- }
- else
- {
- putb(lval, cp, c);
- while ((c = cp->getbyte(cp->client_data)) != 0 &&
- !strchr(" \n()=<>/", c))
- {
- if (c == '\\')
- c = cp->getbyte(cp->client_data);
- putb(lval, cp, c);
- }
-#if YYDEBUG
- printf ("got %s\n", lval->buf);
-#endif
- if (c != 0)
- cp->ungetbyte(c, cp->client_data);
- if (!strcmp(lval->buf, "and"))
- return AND;
- if (!strcmp(lval->buf, "or"))
- return OR;
- if (!strcmp(lval->buf, "not"))
- return NOT;
- if (!strncmp(lval->buf, "prox", 4))
- return PROX;
- }
- return TERM;
-}
+++ /dev/null
-/* $Id: xcqlutil.c,v 1.2 2003-02-14 18:49:23 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include <yaz/cql.h>
-
-static void pr_n(const char *buf,
- void (*pr)(const char *buf, void *client_data),
- void *client_data, int n)
-{
- int i;
- for (i = 0; i<n; i++)
- (*pr)(" ", client_data);
- (*pr)(buf, client_data);
-}
-
-static void pr_cdata(const char *buf,
- void (*pr)(const char *buf, void *client_data),
- void *client_data)
-{
- const char *src = buf;
- char bf[2];
- while (*src)
- {
- switch(*src)
- {
- case '&':
- (*pr)("&", client_data);
- break;
- case '<':
- (*pr)("<", client_data);
- break;
- case '>':
- (*pr)(">", client_data);
- break;
- default:
- bf[0] = *src;
- bf[1] = 0;
- (*pr)(bf, client_data);
- }
- src++;
- }
-}
-
-static void prefixes(struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data, int level)
-{
- if (cn)
- {
- pr_n("<prefixes>\n", pr, client_data, level);
- for (; cn; cn = cn->u.mod.next)
- {
- pr_n("<prefix>\n", pr, client_data, level+2);
- if (cn->u.mod.name)
- {
- pr_n("<name>", pr, client_data, level+4);
- pr_cdata(cn->u.mod.name, pr, client_data);
- pr_n("</name>\n", pr, client_data, 0);
- }
- if (cn->u.mod.value)
- {
- pr_n("<identifier>", pr, client_data, level+4);
- pr_cdata(cn->u.mod.value, pr, client_data);
- pr_n("</identifier>\n", pr, client_data, 0);
- }
- pr_n("</prefix>\n", pr, client_data, level+2);
- }
- pr_n("</prefixes>\n", pr, client_data, level);
- }
-}
-
-static void cql_to_xml_r(struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data, int level)
-{
- if (!cn)
- return;
- switch (cn->which)
- {
- case CQL_NODE_ST:
- pr_n("<searchClause>\n", pr, client_data, level);
- prefixes(cn->u.st.prefixes, pr, client_data, level+2);
- if (cn->u.st.index)
- {
- pr_n("<index>", pr, client_data, level+2);
- pr_cdata(cn->u.st.index, pr, client_data);
- pr_n("</index>\n", pr, client_data, 0);
- }
- if (cn->u.st.relation)
- {
- struct cql_node *m = cn->u.st.modifiers;
- pr_n("<relation>\n", pr, client_data, level+2);
- pr_n("<value>", pr, client_data, level+4);
- pr_cdata(cn->u.st.relation, pr, client_data);
- pr_n("</value>\n", pr, client_data, 0);
- if (m)
- {
- pr_n("<modifiers>\n", pr, client_data, level+4);
- for (; m; m = m->u.mod.next)
- {
- pr_n("<modifier><value>", pr, client_data, level+6);
- pr_cdata(m->u.mod.value, pr, client_data);
- pr_n("</value></modifier>\n", pr, client_data, 0);
- }
- pr_n("</modifiers>\n", pr, client_data, level+4);
- }
- pr_n("</relation>\n", pr, client_data, level+2);
- }
- if (cn->u.st.term)
- {
- pr_n("<term>", pr, client_data, level+2);
- pr_cdata(cn->u.st.term, pr, client_data);
- pr_n("</term>\n", pr, client_data, 0);
- }
- pr_n("</searchClause>\n", pr, client_data, level);
- break;
- case CQL_NODE_BOOL:
- pr_n("<triple>\n", pr, client_data, level);
- prefixes(cn->u.st.prefixes, pr, client_data, level+2);
- if (cn->u.boolean.value)
- {
- struct cql_node *m = cn->u.boolean.modifiers;
- pr_n("<boolean>\n", pr, client_data, level+2);
-
- pr_n("<value>", pr, client_data, level+4);
- pr_cdata(cn->u.boolean.value, pr, client_data);
- pr_n("</value>\n", pr, client_data, 0);
-
- if (m)
- {
- pr_n("<modifiers>\n", pr, client_data, level+4);
- for (; m; m = m->u.mod.next)
- {
- pr_n("<modifier><type>", pr, client_data, level+6);
- pr_cdata(m->u.mod.name, pr, client_data);
- pr_n("</type>", pr, client_data, 0);
- if (m->u.mod.value)
- {
- pr_n("<value>", pr, client_data, 0);
- pr_cdata(m->u.mod.value, pr, client_data);
- pr_n("</value>", pr, client_data, 0);
- }
- pr_n("</modifier>\n", pr, client_data, 0);
- }
- pr_n("</modifiers>\n", pr, client_data, level+4);
- }
- pr_n("</boolean>\n", pr, client_data, level+2);
- }
- if (cn->u.boolean.left)
- {
- printf ("%*s<leftOperand>\n", level+2, "");
- cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4);
- printf ("%*s</leftOperand>\n", level+2, "");
- }
- if (cn->u.boolean.right)
- {
- printf ("%*s<rightOperand>\n", level+2, "");
- cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4);
- printf ("%*s</rightOperand>\n", level+2, "");
- }
- pr_n("</triple>\n", pr, client_data, level);
- }
-}
-
-void cql_to_xml(struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data)
-{
- cql_to_xml_r(cn, pr, client_data, 0);
-}
-
-void cql_to_xml_stdio(struct cql_node *cn, FILE *f)
-{
- cql_to_xml(cn, cql_fputs, f);
-}
-
-void cql_buf_write_handler (const char *b, void *client_data)
-{
- struct cql_buf_write_info *info = (struct cql_buf_write_info *)client_data;
- int l = strlen(b);
- if (info->off < 0 || (info->off + l >= info->max))
- {
- info->off = -1;
- return;
- }
- memcpy (info->buf + info->off, b, l);
- info->off += l;
-}
-
-int cql_to_xml_buf(struct cql_node *cn, char *out, int max)
-{
- struct cql_buf_write_info info;
- info.off = 0;
- info.max = max;
- info.buf = out;
- cql_to_xml(cn, cql_buf_write_handler, &info);
- if (info.off >= 0)
- info.buf[info.off] = '\0';
- return info.off;
-}
-
-## $Id: Makefile.am,v 1.48 2003-10-02 19:47:41 adam Exp $
+## $Id: Makefile.am,v 1.49 2003-10-27 12:21:24 adam Exp $
docdir=$(datadir)/doc/@PACKAGE@
zoom.records.html zoom.resultsets.html zoom.scan.html
MANFILES=yaz-client.1 yaz-client-ssl.1 yaz-ztest.8 \
- yaz-ztest-ssl.8 yaz-config.8 yaz.7 zoomsh.1 yaz-asncomp.1
-REFFILES=yaz-client.sgml yaz-ztest.sgml yaz-config.sgml \
- yaz-man.sgml zoomsh.sgml yaz-asncomp.sgml
+ yaz-ztest-ssl.8 yaz-config.8 yaz.7 zoomsh.1 yaz-asncomp.1 \
+ yaz-marcdump.1
+REFFILES=yaz-client-man.xml yaz-ztest-man.xml yaz-config-man.xml \
+ yaz-man.xml zoomsh-man.xml yaz-asncomp-man.xml \
+ yaz-marcdump-man.xml
SUPPORTFILES=yazhtml.dsl yazphp.dsl yazprint.dsl tkl.xsl xml.dcl id.eps \
apilayer.obj
EXTRA_DIST = $(XMLFILES) $(SUPPORTFILES) $(man_MANS) $(REFFILES) \
$(doc_DATA) Doxyfile
-yaz-client.1: $(srcdir)/yaz-client.sgml $(srcdir)/yaz-client-commands.xml
- docbook2man $(srcdir)/yaz-client.sgml
+yaz-client.1: $(srcdir)/yaz-client-man.xml $(srcdir)/yaz-client-commands.xml
+ docbook2man $(srcdir)/yaz-client-man.xml
-yaz-ztest.8: yaz-ztest.sgml ztest-options.xml
- docbook2man $(srcdir)/yaz-ztest.sgml
+yaz-ztest.8: yaz-ztest-man.xml ztest-options.xml
+ docbook2man $(srcdir)/yaz-ztest-man.xml
-yaz-config.8: yaz-config.sgml
- docbook2man $(srcdir)/yaz-config.sgml
+yaz-config.8: yaz-config-man.xml
+ docbook2man $(srcdir)/yaz-config-man.xml
-yaz.7: yaz-man.sgml
- docbook2man $(srcdir)/yaz-man.sgml
+yaz.7: yaz-man.xml
+ docbook2man $(srcdir)/yaz-man.xml
-zoomsh.1: zoomsh.sgml
- docbook2man $(srcdir)/zoomsh.sgml
+zoomsh.1: zoomsh-man.xml
+ docbook2man $(srcdir)/zoomsh-man.xml
yaz-ztest-ssl.8:
ln -s yaz-ztest.8 yaz-ztest-ssl.8
yaz-client-ssl.1:
ln -s yaz-client.1 yaz-client-ssl.1
-yaz-asncomp.1: yaz-asncomp.sgml
- docbook2man $(srcdir)/yaz-asncomp.sgml
+yaz-asncomp.1: yaz-asncomp-man.xml
+ docbook2man $(srcdir)/yaz-asncomp-man.xml
+
+yaz-marcdump.1: yaz-marcdump-man.xml
+ docbook2man $(srcdir)/yaz-marcdump-man.xml
$(HTMLFILES): $(XMLFILES)
jade -E14 -D $(srcdir) -d yazhtml.dsl -t sgml $(srcdir)/xml.dcl yaz.xml
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+]>
+<refentry id="yaz-asncomp">
+
+ <refmeta>
+ <refentrytitle>yaz-asncomp</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>yaz-asncomp</refname>
+ <refpurpose>YAZ ASN.1 compiler</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>yaz-asncomp</command>
+ <arg choice="opt"><option>-v</option></arg>
+ <arg choice="opt"><option>-c <replaceable>cfile</replaceable></option></arg>
+ <arg choice="opt"><option>-h <replaceable>hfile</replaceable></option></arg>
+ <arg choice="opt"><option>-p <replaceable>pfile</replaceable></option></arg>
+ <arg choice="opt"><option>-d <replaceable>config</replaceable></option></arg>
+ <arg choice="opt"><option>-I <replaceable>includeout</replaceable></option></arg>
+ <arg choice="opt"><option>-i <replaceable>includedir</replaceable></option></arg>
+ <arg choice="opt"><option>-m <replaceable>module</replaceable></option></arg>
+ <arg choice="opt">filename</arg>
+ </cmdsynopsis>
+
+ </refsynopsisdiv>
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>yaz-asncomp</command> is an ASN.1 compiler that
+ reads an ASN.1 specification in <replaceable>filename</replaceable>
+ and produces C/C++ definitions and BER encoders/decoders for it.
+ </para>
+ <para>
+ The produced C/C++ code and header files uses the ODR module of YAZ
+ which is a library that encodes/decodes/prints BER packages.
+ <command>yaz-asncomp</command> allows you to specify name of
+ resulting source via options. Alternatively, you can specify
+ a DEFINISIONS file, which provides customized output to
+ many output files - if the ASN.1 specification file consists
+ of many modules.
+ </para>
+ <para>
+ This utility is written in Tcl. Any version of Tcl should work.
+ </para>
+ </refsect1>
+ <refsect1>
+ <title>OPTIONS</title>
+ <variablelist>
+ <varlistentry><term><literal>-v </literal>
+ </term>
+ <listitem>
+ <para>
+ Makes the ASN.1 compiler print more verbose about the
+ various stages of operations.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-c </literal>
+ <replaceable>cfile</replaceable></term>
+ <listitem><para>
+ Specifies the name of the C/C++ file with encoders/decoders.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-h </literal>
+ <replaceable>hfile</replaceable></term>
+ <listitem><para>
+ Specifies the name of header file with definitions.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-p </literal>
+ <replaceable>pfile</replaceable></term>
+ <listitem><para>
+ Specifies the name of the a private header file with
+ definitions. By default all definitions are put
+ in header file (option -h).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-d </literal>
+ <replaceable>dfile</replaceable></term>
+ <listitem><para>
+ Specifies the name of a definitions file.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-I </literal>
+ <replaceable>iout</replaceable></term>
+ <listitem><para>
+ Specifies first part of directory in which header files
+ are written.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-i </literal>
+ <replaceable>idir</replaceable></term>
+ <listitem><para>
+ Specifies second part of directory in which header files
+ are written.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>-m </literal>
+ <replaceable>module</replaceable></term>
+ <listitem><para>
+ Specifies that ASN.1 compiler should only process the
+ module given. If this option is not specified,
+ all modules in the ASN.1 file are processed.
+ </para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+ <refsect1><title>DEFINITIONS FILE</title>
+ <para>
+ The definitions file is really a Tcl script but follows
+ traditional rules for Shell like configuration files.
+ That is # denotes the beginning of a comment. Definitions
+ are line oriented. The definitions files usually consists of
+ a series of variable assignments of the form:
+ </para>
+ <para>
+ <literal>set</literal> <replaceable>name</replaceable> <replaceable>value</replaceable>
+ </para>
+ <para>
+ Available variables are:
+ <variablelist>
+
+ <varlistentry><term><literal>default-prefix</literal></term>
+ <listitem><para>
+ Sets prefix for names in the produced output.
+ The value consists of three tokens: C function prefix,
+ C typedef prefix and preprocessor prefix respectively.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>prefix(</literal><replaceable>module</replaceable><literal>)</literal></term>
+ <listitem><para>
+ This value sets prefix values for module
+ <replaceable>module</replaceable>.
+ The value has same form as <literal>default-prefix</literal>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>filename(</literal><replaceable>module</replaceable><literal>)</literal></term>
+ <listitem><para>
+ Specifies filename for C/header file for module
+ <replaceable>module</replaceable>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>init(</literal><replaceable>module</replaceable><literal>,h)</literal></term>
+ <listitem><para>
+ Code fragment to be put in first part of public header for module
+ <replaceable>module</replaceable>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>body(</literal><replaceable>module</replaceable><literal>,h)</literal></term>
+ <listitem><para>
+ Code fragment to be put in last part of public header for module
+ <replaceable>module</replaceable> (trailer).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>init(</literal><replaceable>module</replaceable><literal>,c)</literal></term>
+ <listitem><para>
+ Code fragment to be put in first part of C based encoder/decoder for
+ module <replaceable>module</replaceable>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>body(</literal><replaceable>module</replaceable><literal>,c)</literal></term>
+ <listitem><para>
+ Code fragment to be put in last part of C based encoder/decoder for
+ module <replaceable>module</replaceable> (trailer).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>map(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>)</literal></term>
+ <listitem><para>
+ Maps ASN.1 type in module <replaceable>module</replaceable>
+ of <replaceable>name</replaceable> to value.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>membermap(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>,</literal><replaceable>member</replaceable><literal>)</literal></term>
+ <listitem><para>
+ Maps member <replaceable>member</replaceable> in SEQUENCE/CHOICE of
+ <replaceable>name</replaceable> in module
+ <replaceable>module</replaceable> to value.
+ The value consists of one or two tokens.
+ First token is name of C preprocessor part. Second token
+ is resulting C member name. If second token is omitted
+ the value (one token) is both preprocessor part and
+ C <literal>struct</literal>,<literal>union</literal>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term><literal>unionmap(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>,</literal><replaceable>member</replaceable><literal>)</literal></term>
+ <listitem><para>
+ Maps member <replaceable>member</replaceable> in CHOICE of
+ <replaceable>name</replaceable> in module
+ <replaceable>module</replaceable> to value.
+ Value consists of to or three tokens. The first token
+ is name of the integer in the <literal>union</literal> that
+ is used as selector for the <literal>union</literal> itself.
+ The second token is name of the <literal>union</literal>.
+ The third token overrides the name of the CHOICE member;
+ if omitted the member name is used.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refsect1>
+ <refsect1><title>FILES</title>
+ <para>
+ <filename>/usr/share/yaz/z39.50/z.tcl</filename>
+ </para>
+ <para>
+ <filename>/usr/share/yaz/z39.50/*.asn</filename>
+ </para>
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>yaz</refentrytitle>
+ <manvolnum>7</manvolnum></citerefentry>
+ </para>
+ <para>
+ Section "The ODR Module" in the YAZ manual.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
-]>
-<refentry id="yaz-asncomp">
-
- <refmeta>
- <refentrytitle>yaz-asncomp</refentrytitle>
- <manvolnum>1</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>yaz-asncomp</refname>
- <refpurpose>YAZ ASN.1 compiler</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>yaz-asncomp</command>
- <arg choice="opt"><option>-v</option></arg>
- <arg choice="opt"><option>-c <replaceable>cfile</replaceable></option></arg>
- <arg choice="opt"><option>-h <replaceable>hfile</replaceable></option></arg>
- <arg choice="opt"><option>-p <replaceable>pfile</replaceable></option></arg>
- <arg choice="opt"><option>-d <replaceable>config</replaceable></option></arg>
- <arg choice="opt"><option>-I <replaceable>includeout</replaceable></option></arg>
- <arg choice="opt"><option>-i <replaceable>includedir</replaceable></option></arg>
- <arg choice="opt"><option>-m <replaceable>module</replaceable></option></arg>
- <arg choice="opt">filename</arg>
- </cmdsynopsis>
-
- </refsynopsisdiv>
- <refsect1><title>DESCRIPTION</title>
- <para>
- <command>yaz-asncomp</command> is an ASN.1 compiler that
- reads an ASN.1 specification in <replaceable>filename</replaceable>
- and produces C/C++ definitions and BER encoders/decoders for it.
- </para>
- <para>
- The produced C/C++ code and header files uses the ODR module of YAZ
- which is a library that encodes/decodes/prints BER packages.
- <command>yaz-asncomp</command> allows you to specify name of
- resulting source via options. Alternatively, you can specify
- a DEFINISIONS file, which provides customized output to
- many output files - if the ASN.1 specification file consists
- of many modules.
- </para>
- <para>
- This utility is written in Tcl. Any version of Tcl should work.
- </para>
- </refsect1>
- <refsect1>
- <title>OPTIONS</title>
- <variablelist>
- <varlistentry><term><literal>-v </literal>
- </term>
- <listitem>
- <para>
- Makes the ASN.1 compiler print more verbose about the
- various stages of operations.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-c </literal>
- <replaceable>cfile</replaceable></term>
- <listitem><para>
- Specifies the name of the C/C++ file with encoders/decoders.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-h </literal>
- <replaceable>hfile</replaceable></term>
- <listitem><para>
- Specifies the name of header file with definitions.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-p </literal>
- <replaceable>pfile</replaceable></term>
- <listitem><para>
- Specifies the name of the a private header file with
- definitions. By default all definitions are put
- in header file (option -h).
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-d </literal>
- <replaceable>dfile</replaceable></term>
- <listitem><para>
- Specifies the name of a definitions file.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-I </literal>
- <replaceable>iout</replaceable></term>
- <listitem><para>
- Specifies first part of directory in which header files
- are written.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-i </literal>
- <replaceable>idir</replaceable></term>
- <listitem><para>
- Specifies second part of directory in which header files
- are written.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>-m </literal>
- <replaceable>module</replaceable></term>
- <listitem><para>
- Specifies that ASN.1 compiler should only process the
- module given. If this option is not specified,
- all modules in the ASN.1 file are processed.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
- </refsect1>
- <refsect1><title>DEFINITIONS FILE</title>
- <para>
- The definitions file is really a Tcl script but follows
- traditional rules for Shell like configuration files.
- That is # denotes the beginning of a comment. Definitions
- are line oriented. The definitions files usually consists of
- a series of variable assignments of the form:
- </para>
- <para>
- <literal>set</literal> <replaceable>name</replaceable> <replaceable>value</replaceable>
- </para>
- <para>
- Available variables are:
- <variablelist>
-
- <varlistentry><term><literal>default-prefix</literal></term>
- <listitem><para>
- Sets prefix for names in the produced output.
- The value consists of three tokens: C function prefix,
- C typedef prefix and preprocessor prefix respectively.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>prefix(</literal><replaceable>module</replaceable><literal>)</literal></term>
- <listitem><para>
- This value sets prefix values for module
- <replaceable>module</replaceable>.
- The value has same form as <literal>default-prefix</literal>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>filename(</literal><replaceable>module</replaceable><literal>)</literal></term>
- <listitem><para>
- Specifies filename for C/header file for module
- <replaceable>module</replaceable>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>init(</literal><replaceable>module</replaceable><literal>,h)</literal></term>
- <listitem><para>
- Code fragment to be put in first part of public header for module
- <replaceable>module</replaceable>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>body(</literal><replaceable>module</replaceable><literal>,h)</literal></term>
- <listitem><para>
- Code fragment to be put in last part of public header for module
- <replaceable>module</replaceable> (trailer).
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>init(</literal><replaceable>module</replaceable><literal>,c)</literal></term>
- <listitem><para>
- Code fragment to be put in first part of C based encoder/decoder for
- module <replaceable>module</replaceable>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>body(</literal><replaceable>module</replaceable><literal>,c)</literal></term>
- <listitem><para>
- Code fragment to be put in last part of C based encoder/decoder for
- module <replaceable>module</replaceable> (trailer).
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>map(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>)</literal></term>
- <listitem><para>
- Maps ASN.1 type in module <replaceable>module</replaceable>
- of <replaceable>name</replaceable> to value.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>membermap(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>,</literal><replaceable>member</replaceable><literal>)</literal></term>
- <listitem><para>
- Maps member <replaceable>member</replaceable> in SEQUENCE/CHOICE of
- <replaceable>name</replaceable> in module
- <replaceable>module</replaceable> to value.
- The value consists of one or two tokens.
- First token is name of C preprocessor part. Second token
- is resulting C member name. If second token is omitted
- the value (one token) is both preprocessor part and
- C <literal>struct</literal>,<literal>union</literal>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry><term><literal>unionmap(</literal><replaceable>module</replaceable><literal>,</literal><replaceable>name</replaceable><literal>,</literal><replaceable>member</replaceable><literal>)</literal></term>
- <listitem><para>
- Maps member <replaceable>member</replaceable> in CHOICE of
- <replaceable>name</replaceable> in module
- <replaceable>module</replaceable> to value.
- Value consists of to or three tokens. The first token
- is name of the integer in the <literal>union</literal> that
- is used as selector for the <literal>union</literal> itself.
- The second token is name of the <literal>union</literal>.
- The third token overrides the name of the CHOICE member;
- if omitted the member name is used.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </refsect1>
- <refsect1><title>FILES</title>
- <para>
- <filename>/usr/share/yaz/z39.50/z.tcl</filename>
- </para>
- <para>
- <filename>/usr/share/yaz/z39.50/*.asn</filename>
- </para>
- </refsect1>
- <refsect1><title>SEE ALSO</title>
- <para>
- <citerefentry>
- <refentrytitle>yaz</refentrytitle>
- <manvolnum>7</manvolnum></citerefentry>
- </para>
- <para>
- Section "The ODR Module" in the YAZ manual.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+ <!ENTITY yaz-client-commands SYSTEM "yaz-client-commands.xml">
+]>
+<!-- $Id: yaz-client-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="yaz-client">
+
+ <refmeta>
+ <refentrytitle>yaz-client</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>yaz-client</refname>
+ <refpurpose>Z39.50/SRW client for implementors</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>yaz-client</command>
+ <arg choice="opt"><option>-m <replaceable>filename</replaceable></option></arg>
+ <arg choice="opt"><option>-a <replaceable>filename</replaceable></option></arg>
+ <arg choice="opt"><option>-c <replaceable>filename</replaceable></option></arg>
+ <arg choice="opt"><option>-q <replaceable>filename</replaceable></option></arg>
+ <arg choice="opt"><option>-p <replaceable>addr</replaceable></option></arg>
+ <arg choice="opt"><option>-u <replaceable>auth</replaceable></option></arg>
+ <arg choice="opt"><option>-k <replaceable>size</replaceable></option></arg>
+ <arg choice="opt"><option>-x</option></arg>
+ <arg choice="opt">addr</arg>
+ </cmdsynopsis>
+
+ <cmdsynopsis>
+ <command>yaz-client-ssl</command>
+ <arg rep="repeat" choice="opt"><option>option</option></arg>
+ <arg choice="opt">addr</arg>
+ </cmdsynopsis>
+
+ </refsynopsisdiv>
+
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>yaz-client</command> is a Z39.50/SRW client (origin) with a
+ simple command line interface that allows you to test behavior and
+ performance of Z39.50 targets and SRW servers.
+ </para>
+ <para>
+ <command>yaz-client-ssl</command> is identical to
+ <command>yaz-client</command> except that it supports SSL transport.
+ </para>
+ <para>
+ If the <replaceable>addr</replaceable> is specified, the client creates
+ a connection to the Z39.50/SRW target at the address.
+ </para>
+ </refsect1>
+ <refsect1>
+ <title>OPTIONS</title>
+ <variablelist>
+ <varlistentry>
+ <term>-m <replaceable>filename</replaceable></term>
+ <listitem><para>
+ If specified, retrieved MARC (ISO2709) records will
+ be appended to the file given.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-a <replaceable>filename</replaceable></term>
+ <listitem><para>
+ If specified, logging of protocol packages will be appended
+ file given. The special filename <literal>-</literal>
+ (dash) denotes standard output.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-u <replaceable>auth</replaceable></term>
+ <listitem><para>
+ If specified, the <replaceable>auth</replaceable> string
+ will be used for authentication.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-c <replaceable>filename</replaceable></term>
+ <listitem><para>
+ If specified, CCL configuration will be read from
+ the file given.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-q <replaceable>filename</replaceable></term>
+ <listitem><para>
+ If specified, CQL configuration will be read from
+ the file given.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-p <replaceable>addr</replaceable></term>
+ <listitem><para>
+ If specified, the client will use the proxy at the address
+ given.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-k <replaceable>size</replaceable></term>
+ <listitem><para>
+ Sets preferred messages and maximum record size for Initialize
+ Request in kilobytes. Default value is 1024 (1 MB).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-x</term>
+ <listitem><para>
+ Makes the YAZ client print hex dumps of packages sent and received
+ on standard output.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1>
+ <title>COMMANDS</title>
+ <para>
+ The YAZ client accepts the following commands.
+ </para>
+ &yaz-client-commands;
+ </refsect1>
+ <refsect1><title>FILES</title>
+ <para>
+ <filename>yaz-<version>/client/client.c</filename>
+ </para>
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>yaz</refentrytitle>
+ <manvolnum>7</manvolnum>
+ </citerefentry>
+ </para>
+ <para>
+ Section "The YAZ Client" in the YAZ manual.
+ </para>
+ <para id="PQF">
+ Section "Prefix Query Format" in the YAZ manual.
+ </para>
+ <para id="CCL">
+ Section "Common Command Language" in the YAZ manual.
+ </para>
+ <para id="CQL">
+ Section "Common QUery Language" in the YAZ manual.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
- <!ENTITY yaz-client-commands SYSTEM "yaz-client-commands.xml">
-]>
-<!-- $Id: yaz-client.sgml,v 1.7 2003-10-17 14:14:10 adam Exp $ -->
-<refentry id="yaz-client">
-
- <refmeta>
- <refentrytitle>yaz-client</refentrytitle>
- <manvolnum>1</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>yaz-client</refname>
- <refpurpose>Z39.50/SRW client for implementors</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>yaz-client</command>
- <arg choice="opt"><option>-m <replaceable>filename</replaceable></option></arg>
- <arg choice="opt"><option>-a <replaceable>filename</replaceable></option></arg>
- <arg choice="opt"><option>-c <replaceable>filename</replaceable></option></arg>
- <arg choice="opt"><option>-q <replaceable>filename</replaceable></option></arg>
- <arg choice="opt"><option>-p <replaceable>addr</replaceable></option></arg>
- <arg choice="opt"><option>-u <replaceable>auth</replaceable></option></arg>
- <arg choice="opt"><option>-k <replaceable>size</replaceable></option></arg>
- <arg choice="opt"><option>-x</option></arg>
- <arg choice="opt">addr</arg>
- </cmdsynopsis>
-
- <cmdsynopsis>
- <command>yaz-client-ssl</command>
- <arg rep="repeat" choice="opt"><option>option</option></arg>
- <arg choice="opt">addr</arg>
- </cmdsynopsis>
-
- </refsynopsisdiv>
-
- <refsect1><title>DESCRIPTION</title>
- <para>
- <command>yaz-client</command> is a Z39.50/SRW client (origin) with a
- simple command line interface that allows you to test behavior and
- performance of Z39.50 targets and SRW servers.
- </para>
- <para>
- <command>yaz-client-ssl</command> is identical to
- <command>yaz-client</command> except that it supports SSL transport.
- </para>
- <para>
- If the <replaceable>addr</replaceable> is specified, the client creates
- a connection to the Z39.50/SRW target at the address.
- </para>
- </refsect1>
- <refsect1>
- <title>OPTIONS</title>
- <variablelist>
- <varlistentry>
- <term>-m <replaceable>filename</replaceable></term>
- <listitem><para>
- If specified, retrieved MARC (ISO2709) records will
- be appended to the file given.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>-a <replaceable>filename</replaceable></term>
- <listitem><para>
- If specified, logging of protocol packages will be appended
- file given. The special filename <literal>-</literal>
- (dash) denotes standard output.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>-u <replaceable>auth</replaceable></term>
- <listitem><para>
- If specified, the <replaceable>auth</replaceable> string
- will be used for authentication.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>-c <replaceable>filename</replaceable></term>
- <listitem><para>
- If specified, CCL configuration will be read from
- the file given.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>-q <replaceable>filename</replaceable></term>
- <listitem><para>
- If specified, CQL configuration will be read from
- the file given.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-p <replaceable>addr</replaceable></term>
- <listitem><para>
- If specified, the client will use the proxy at the address
- given.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-k <replaceable>size</replaceable></term>
- <listitem><para>
- Sets preferred messages and maximum record size for Initialize
- Request in kilobytes. Default value is 1024 (1 MB).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-x</term>
- <listitem><para>
- Makes the YAZ client print hex dumps of packages sent and received
- on standard output.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1>
- <title>COMMANDS</title>
- <para>
- The YAZ client accepts the following commands.
- </para>
- &yaz-client-commands;
- </refsect1>
- <refsect1><title>FILES</title>
- <para>
- <filename>yaz-<version>/client/client.c</filename>
- </para>
- </refsect1>
- <refsect1><title>SEE ALSO</title>
- <para>
- <citerefentry>
- <refentrytitle>yaz</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- </para>
- <para>
- Section "The YAZ Client" in the YAZ manual.
- </para>
- <para id="PQF">
- Section "Prefix Query Format" in the YAZ manual.
- </para>
- <para id="CCL">
- Section "Common Command Language" in the YAZ manual.
- </para>
- <para id="CQL">
- Section "Common QUery Language" in the YAZ manual.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
+<!-- $Id: yaz-config-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="yaz-config">
+ <refmeta>
+ <refentrytitle>yaz-config</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>yaz-config</refname>
+ <refpurpose>Script to get information about YAZ.</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>yaz-config</command>
+ <arg choice="opt"><option>--prefix[=<replaceable>DIR</replaceable>]</option></arg>
+ <arg choice="opt"><option>--version</option></arg>
+ <arg choice="opt"><option>--libs</option></arg>
+ <arg choice="opt"><option>--lalibs</option></arg>
+ <arg choice="opt"><option>--cflags</option></arg>
+ <arg choice="opt"><option>--tabs</option></arg>
+ <arg choice="opt" rep="repeat">libraries</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>yaz-config</command> is a script that returns information
+ that your own software should use to build software that uses YAZ.
+ </para>
+
+ <para>
+ The following libraries are supported:
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>threads</term>
+ <listitem><para>
+ Use the threaded version of YAZ.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ssl</term>
+ <listitem><para>
+ Use YAZ with SSL support.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1>
+
+ <refsect1><title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>--prefix[=<replaceable>DIR</replaceable>]</term>
+ <listitem><para>
+ Returns prefix of YAZ or assume a different one if DIR is
+ specified.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--version</term>
+ <listitem><para>
+ Returns version of YAZ.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--libs</term>
+ <listitem><para>
+ Library specification be used when using YAZ.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--lalibs</term>
+ <listitem><para>
+ Return library specification.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--cflags</term>
+ <listitem><para>
+ Return C Compiler flags.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--tabs</term>
+ <listitem><para>
+ Return directory of YAZ tables.
+ </para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1><title>FILES</title>
+ <para>
+ <filename><replaceable>prefix</replaceable>/bin/yaz-config</filename>
+ </para>
+ <para>
+ <filename><replaceable>prefix</replaceable>/lib/libyaz*.a</filename>
+ </para>
+ <para>
+ <filename><replaceable>prefix</replaceable>/include/yaz/*.h</filename>
+ </para>
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ yaz(7)
+ </para>
+ <para>
+ Section "How to make apps using YAZ on UNIX" in the YAZ manual.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-<!-- $Id: yaz-config.sgml,v 1.3 2003-04-28 21:02:16 adam Exp $ -->
-<refentry id="yaz-config">
- <refmeta>
- <refentrytitle>yaz-config</refentrytitle>
- <manvolnum>8</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>yaz-config</refname>
- <refpurpose>Script to get information about YAZ.</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>yaz-config</command>
- <arg choice="opt"><option>--prefix[=<replaceable>DIR</replaceable>]</option></arg>
- <arg choice="opt"><option>--version</option></arg>
- <arg choice="opt"><option>--libs</option></arg>
- <arg choice="opt"><option>--lalibs</option></arg>
- <arg choice="opt"><option>--cflags</option></arg>
- <arg choice="opt"><option>--tabs</option></arg>
- <arg choice="opt" rep="repeat">libraries</arg>
- </cmdsynopsis>
- </refsynopsisdiv>
-
- <refsect1><title>DESCRIPTION</title>
- <para>
- <command>yaz-config</command> is a script that returns information
- that your own software should use to build software that uses YAZ.
- </para>
-
- <para>
- The following libraries are supported:
- </para>
-
- <variablelist>
- <varlistentry>
- <term>threads</term>
- <listitem><para>
- Use the threaded version of YAZ.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>ssl</term>
- <listitem><para>
- Use YAZ with SSL support.
- </para></listitem>
- </varlistentry>
- </variablelist>
-
- </refsect1>
-
- <refsect1><title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>--prefix[=<replaceable>DIR</replaceable>]</term>
- <listitem><para>
- Returns prefix of YAZ or assume a different one if DIR is
- specified.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--version</term>
- <listitem><para>
- Returns version of YAZ.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--libs</term>
- <listitem><para>
- Library specification be used when using YAZ.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--lalibs</term>
- <listitem><para>
- Return library specification.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--cflags</term>
- <listitem><para>
- Return C Compiler flags.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--tabs</term>
- <listitem><para>
- Return directory of YAZ tables.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
- </refsect1>
-
- <refsect1><title>FILES</title>
- <para>
- <filename><replaceable>prefix</replaceable>/bin/yaz-config</filename>
- </para>
- <para>
- <filename><replaceable>prefix</replaceable>/lib/libyaz*.a</filename>
- </para>
- <para>
- <filename><replaceable>prefix</replaceable>/include/yaz/*.h</filename>
- </para>
- </refsect1>
- <refsect1><title>SEE ALSO</title>
- <para>
- yaz(7)
- </para>
- <para>
- Section "How to make apps using YAZ on UNIX" in the YAZ manual.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-<!-- $Id: yaz-man.sgml,v 1.6 2003-05-14 21:12:41 adam Exp $ -->
-<refentry id="yaz">
- <refmeta>
- <refentrytitle>yaz</refentrytitle>
- <manvolnum>7</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>YAZ</refname>
- <refpurpose>Z39.50 toolkit.</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>YAZ</command>
- </cmdsynopsis>
- </refsynopsisdiv>
-
- <refsect1><title>DESCRIPTION</title>
- <para>
- YAZ is a C/C++ programmer's toolkit supporting the development
- of Z39.50v3 clients and servers. The YAZ toolkit offers
- several different levels of access to the ISO23950/Z39.50, SRW/SRU
- and ILL protocols. The level that you need to use depends
- on your requirements, and the role (server of client) that you want
- to implement.
- </para>
- </refsect1>
-
- <refsect1><title>COPYRIGHT</title>
- <para>
- Copyright (c) 1995-2003, Index Data.
- </para>
- <para>
- Permission to use, copy, modify, distribute, and sell this software and
- its documentation, in whole or in part, for any purpose, is hereby granted,
- provided that:
- </para>
- <para>
- 1. This copyright and permission notice appear in all copies of the
- software and its documentation. Notices of copyright or attribution
- which appear at the beginning of any file must remain unchanged.
- </para>
- <para>
- 2. The names of Index Data or the individual authors may not be used to
- endorse or promote products derived from this software without specific
- prior written permission.
- </para>
-
- <para>
- THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- OF THIS SOFTWARE.
- </para>
- </refsect1>
-
- <refsect1><title>SEE ALSO</title>
- <para>
- <citerefentry>
- <refentrytitle>yaz-client</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>yaz-ztest</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>yaz-config</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>zoomsh</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry>
- </para>
- <para>YAZ manual (
- <filename><replaceable>prefix</replaceable>/share/doc/yaz</filename>)
- </para>
- <para>
- <ulink url="http://www.indexdata.dk/yaz/">YAZ home page</ulink>.
- </para>
- <para>
- <ulink url="http://www.loc.gov/z3950/agency/">Z39.50 Maintenance
- Agency Page</ulink>.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
+<!-- $Id: yaz-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="yaz">
+ <refmeta>
+ <refentrytitle>yaz</refentrytitle>
+ <manvolnum>7</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>YAZ</refname>
+ <refpurpose>Z39.50 toolkit.</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>YAZ</command>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ YAZ is a C/C++ programmer's toolkit supporting the development
+ of Z39.50v3 clients and servers. The YAZ toolkit offers
+ several different levels of access to the ISO23950/Z39.50, SRW/SRU
+ and ILL protocols. The level that you need to use depends
+ on your requirements, and the role (server of client) that you want
+ to implement.
+ </para>
+ </refsect1>
+
+ <refsect1><title>COPYRIGHT</title>
+ <para>
+ Copyright (c) 1995-2003, Index Data.
+ </para>
+ <para>
+ Permission to use, copy, modify, distribute, and sell this software and
+ its documentation, in whole or in part, for any purpose, is hereby granted,
+ provided that:
+ </para>
+ <para>
+ 1. This copyright and permission notice appear in all copies of the
+ software and its documentation. Notices of copyright or attribution
+ which appear at the beginning of any file must remain unchanged.
+ </para>
+ <para>
+ 2. The names of Index Data or the individual authors may not be used to
+ endorse or promote products derived from this software without specific
+ prior written permission.
+ </para>
+
+ <para>
+ THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ OF THIS SOFTWARE.
+ </para>
+ </refsect1>
+
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>yaz-client</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>yaz-ztest</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>yaz-config</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>zoomsh</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>
+ </para>
+ <para>YAZ manual (
+ <filename><replaceable>prefix</replaceable>/share/doc/yaz</filename>)
+ </para>
+ <para>
+ <ulink url="http://www.indexdata.dk/yaz/">YAZ home page</ulink>.
+ </para>
+ <para>
+ <ulink url="http://www.loc.gov/z3950/agency/">Z39.50 Maintenance
+ Agency Page</ulink>.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
+<!-- $Id: yaz-marcdump-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="yaz-marcdump">
+ <refmeta>
+ <refentrytitle>yaz-marcdump</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>yaz-marcdump</refname>
+ <refpurpose>MARC record dump utility</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>yaz-marcdump</command>
+ <arg choice="opt"><option>-x</option></arg>
+ <arg choice="opt"><option>-X</option></arg>
+ <arg choice="opt"><option>-O</option></arg>
+ <arg choice="opt"><option>-f <replaceable>from</replaceable></option></arg>
+ <arg choice="opt"><option>-t <replaceable>to</replaceable></option></arg>
+ <arg choice="opt"><option>-v</option></arg>
+ <arg choice="opt"><option>-c <replaceable>cfile</replaceable></option></arg>
+ <arg choice="opt" rep="repeat">file</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>yaz-marcdump</command> reads ISO2709/MARC records from one or
+ more files.
+ It validates each record and supports output in line-format,
+ MARCXML, OAIMARC as well as Hex output.
+ </para>
+ <para>
+ By default, each record is printed to standard output in a line
+ format with newline for each field, $x for each subfield x.
+ </para>
+ <para>
+ <command>yaz-marcdump</command> can also be requested to perform
+ character set conversion of each record.
+ </para>
+ </refsect1>
+
+ <refsect1><title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-x</term>
+ <listitem><para>
+ Print MARC records in a simple XML format.
+ This format is equivalent to YAZ_MARC_SIMPLEXML in
+ <filename>yaz/marcdisp.h</filename>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-X</term>
+ <listitem><para>
+ Print MARC records in MARCXML.
+ This format is equivalent to YAZ_MARC_MARCXML in
+ <filename>yaz/marcdisp.h</filename>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-O</term>
+ <listitem><para>
+ Print MARC records in OAIMARC. Another XML variant.
+ This format is equivalent to YAZ_MARC_OAIMARC in
+ <filename>yaz/marcdisp.h</filename>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-f<replaceable>from</replaceable>]</term>
+ <listitem><para>
+ Specify the character set <replaceable>from</replaceable>
+ of the input MARC record.
+ Should be used in conjunction with option <literal>-t</literal>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-t<replaceable>to</replaceable>]</term>
+ <listitem><para>
+ Specify the character set <replaceable>of</replaceable>
+ of the output.
+ Should be used in conjunction with option <literal>-f</literal>.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-v</term>
+ <listitem><para>
+ Print more information about the parsing process.
+ Useful if you have ill-formatted ISO2709 records as input.
+ </para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1><title>EXAMPLES</title>
+ <para>
+ The following command converts MARC21/USMARC using MARC-8 encoding to
+ MARCXML in UTF-8 encoding.
+ <screen>
+ yaz-marcdump -f MARC-8 -t UTF-8 -X marc21.raw >marcxml.xml
+ </screen>
+ </para>
+ </refsect1>
+
+ <refsect1><title>FILES</title>
+ <para>
+ <filename><replaceable>prefix</replaceable>/bin/yaz-marcdump</filename>
+ <filename><replaceable>prefix</replaceable>/include/yaz/marcdisp.h</filename>
+ </para>
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ yaz(7)
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+ <!ENTITY ztest-options SYSTEM "ztest-options.xml">
+]>
+<!-- $Id: yaz-ztest-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="yaz-ztest">
+
+ <refmeta>
+ <refentrytitle>yaz-ztest</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>yaz-ztest</refname>
+ <refpurpose>Z39.50 Test Server</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>yaz-ztest</command>
+ <arg choice="opt"><option>-a <replaceable>file</replaceable></option></arg>
+ <arg choice="opt"><option>-v <replaceable>level</replaceable></option></arg>
+ <arg choice="opt"><option>-l <replaceable>file</replaceable></option></arg>
+ <arg choice="opt"><option>-u <replaceable>uid</replaceable></option></arg>
+ <arg choice="opt"><option>-c <replaceable>config</replaceable></option></arg>
+ <arg choice="opt"><option>-t <replaceable>minutes</replaceable></option></arg>
+ <arg choice="opt"><option>-k <replaceable>kilobytes</replaceable></option></arg>
+ <arg choice="opt"><option>-d <replaceable>daemon</replaceable></option></arg>
+ <arg choice="opt"><option>-w <replaceable>dir</replaceable></option></arg>
+ <arg choice="opt"><option>-ziST1</option></arg>
+ <arg choice="opt" rep="repeat">listener-spec</arg>
+ </cmdsynopsis>
+
+ <cmdsynopsis>
+ <command>yaz-ztest-ssl</command>
+ <arg rep="repeat" choice="opt"><option>option</option></arg>
+ <arg choice="opt" rep="repeat">addr</arg>
+ </cmdsynopsis>
+
+ </refsynopsisdiv>
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>yaz-ztest</command> is a Z39.50 test server.
+ The server acts as a real Z39.50 server but does not use a database.
+ It returns a random hit count and returns a subset of a few built-in
+ records.
+ </para>
+ <para>
+ <command>yaz-ztest-ssl</command> is identical to
+ <command>yaz-ztest</command> except that it supports SSL transport.
+ </para>
+ <para>
+ The <replaceable>listener-spec</replaceable> consists of a transport
+ mode followed by a colon, followed by a listener address. The
+ transport mode is either <literal>tcp</literal>, <literal>unix</literal>,
+ or <literal>ssl</literal> (<command>yaz-ztest-ssl</command> only).
+ </para>
+ <para>
+ For TCP and SSL, an address has the form:
+ <screen>
+ hostname | IP-number [ : portnumber ]
+ </screen>
+ </para>
+ <para>
+ For UNIX local socket the address is the filename of the local socket.
+ </para>
+ </refsect1>
+ <refsect1>
+ <title>OPTIONS</title>
+ &ztest-options;
+ </refsect1>
+ <refsect1><title>FILES</title>
+ <para>
+ <filename>yaz-<version>/ztest/yaz-ztest.c</filename>
+ </para>
+ <para>
+ <filename>yaz-<version>/include/yaz/backend.h</filename>
+ </para>
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>yaz</refentrytitle>
+ <manvolnum>7</manvolnum></citerefentry>
+ </para>
+ <para>
+ Section "Generic server" in the YAZ manual.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
- <!ENTITY ztest-options SYSTEM "ztest-options.xml">
-]>
-<!-- $Id: yaz-ztest.sgml,v 1.4 2002-10-23 10:11:44 adam Exp $ -->
-<refentry id="yaz-ztest">
-
- <refmeta>
- <refentrytitle>yaz-ztest</refentrytitle>
- <manvolnum>8</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>yaz-ztest</refname>
- <refpurpose>Z39.50 Test Server</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>yaz-ztest</command>
- <arg choice="opt"><option>-a <replaceable>file</replaceable></option></arg>
- <arg choice="opt"><option>-v <replaceable>level</replaceable></option></arg>
- <arg choice="opt"><option>-l <replaceable>file</replaceable></option></arg>
- <arg choice="opt"><option>-u <replaceable>uid</replaceable></option></arg>
- <arg choice="opt"><option>-c <replaceable>config</replaceable></option></arg>
- <arg choice="opt"><option>-t <replaceable>minutes</replaceable></option></arg>
- <arg choice="opt"><option>-k <replaceable>kilobytes</replaceable></option></arg>
- <arg choice="opt"><option>-d <replaceable>daemon</replaceable></option></arg>
- <arg choice="opt"><option>-w <replaceable>dir</replaceable></option></arg>
- <arg choice="opt"><option>-ziST1</option></arg>
- <arg choice="opt" rep="repeat">listener-spec</arg>
- </cmdsynopsis>
-
- <cmdsynopsis>
- <command>yaz-ztest-ssl</command>
- <arg rep="repeat" choice="opt"><option>option</option></arg>
- <arg choice="opt" rep="repeat">addr</arg>
- </cmdsynopsis>
-
- </refsynopsisdiv>
- <refsect1><title>DESCRIPTION</title>
- <para>
- <command>yaz-ztest</command> is a Z39.50 test server.
- The server acts as a real Z39.50 server but does not use a database.
- It returns a random hit count and returns a subset of a few built-in
- records.
- </para>
- <para>
- <command>yaz-ztest-ssl</command> is identical to
- <command>yaz-ztest</command> except that it supports SSL transport.
- </para>
- <para>
- The <replaceable>listener-spec</replaceable> consists of a transport
- mode followed by a colon, followed by a listener address. The
- transport mode is either <literal>tcp</literal>, <literal>unix</literal>,
- or <literal>ssl</literal> (<command>yaz-ztest-ssl</command> only).
- </para>
- <para>
- For TCP and SSL, an address has the form:
- <screen>
- hostname | IP-number [ : portnumber ]
- </screen>
- </para>
- <para>
- For UNIX local socket the address is the filename of the local socket.
- </para>
- </refsect1>
- <refsect1>
- <title>OPTIONS</title>
- &ztest-options;
- </refsect1>
- <refsect1><title>FILES</title>
- <para>
- <filename>yaz-<version>/ztest/yaz-ztest.c</filename>
- </para>
- <para>
- <filename>yaz-<version>/include/yaz/backend.h</filename>
- </para>
- </refsect1>
- <refsect1><title>SEE ALSO</title>
- <para>
- <citerefentry>
- <refentrytitle>yaz</refentrytitle>
- <manvolnum>7</manvolnum></citerefentry>
- </para>
- <para>
- Section "Generic server" in the YAZ manual.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
--- /dev/null
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+ <!ENTITY zoomsh-commands SYSTEM "zoomsh-commands.xml">
+]>
+<!-- $Id: zoomsh-man.xml,v 1.1 2003-10-27 12:21:24 adam Exp $ -->
+<refentry id="zoomsh">
+
+ <refmeta>
+ <refentrytitle>zoomsh</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>zoomsh</refname>
+ <refpurpose>ZOOM shell</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>zoomsh</command>
+ <arg choice="opt" rep="repeat">commands</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1><title>DESCRIPTION</title>
+ <para>
+ <command>zoomsh</command> is a ZOOM client with a simple
+ command line interface. The client demonstrates the ZOOM
+ API and is useful for testing targets.
+ </para>
+ <para>
+ You may pass one or more commands to <command>zoomsh</command>.
+ These commands are invoked first.
+ </para>
+ </refsect1>
+ <refsect1><title>EXAMPLES</title>
+ <para>
+ If you start the <command>yaz-ztest</command> in one console you
+ can use the ZOOM shell as follows:
+ <screen><![CDATA[
+$ zoomsh
+ZOOM>connect localhost:9999
+ZOOM>search computer
+localhost:9999: 7 hits
+ZOOM>show 0 1
+1 Default USmarc
+001 11224466
+003 DLC
+005 00000000000000.0
+008 910710c19910701nju 00010 eng
+010 $a 11224466
+040 $a DLC $c DLC
+050 00 $a 123-xyz
+100 10 $a Jack Collins
+245 10 $a How to program a computer
+260 1 $a Penguin
+263 $a 8710
+300 $a p. cm.
+ZOOM>quit
+]]>
+ </screen>
+ </para>
+ <para>
+ You can also achieve the same result by passing the commands
+ as arguments on a single command line:
+ </para>
+ <para>
+ <literal>$ zoomsh "connect localhost:9999" "search computer"</literal>
+ <literal>"show 0 1" quit</literal>
+ </para>
+ </refsect1>
+ <refsect1><title>COMMANDS</title>
+ <variablelist>
+
+ <varlistentry><term><literal>connect</literal>
+ <replaceable>zurl</replaceable></term>
+ <listitem><para>
+ Connects to the target given by <replaceable>zurl</replaceable>.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>close</literal>
+ [<replaceable>zurl</replaceable>]</term>
+ <listitem><para>
+ Closes connection to target given by
+ <replaceable>zurl</replaceable> or all targets if
+ <replaceable>zurl</replaceable> was omitted.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>show</literal>
+ [<replaceable>start</replaceable>
+ [<replaceable>count</replaceable>]]
+ </term>
+ <listitem><para>
+ Displays <literal>count</literal> records starting at offset given
+ by <replaceable>start</replaceable>. First records has offset 0
+ (unlike the Z39.50 protocol).
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>quit</literal>
+ </term>
+ <listitem><para>
+ Quits <command>zoomsh</command>.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>set</literal>
+ <replaceable>name</replaceable>
+ [<replaceable>value</replaceable>]
+ </term>
+ <listitem><para>
+ Sets option <replaceable>name</replaceable> to
+ <replaceable>value</replaceable>.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>get</literal>
+ <replaceable>name</replaceable>
+ </term>
+ <listitem><para>
+ Prints value of option <replaceable>name</replaceable>.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term><literal>help</literal>
+ </term>
+ <listitem><para>
+ Prints list of available commands.
+ </para></listitem></varlistentry>
+
+ </variablelist>
+
+ </refsect1>
+ <refsect1><title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>yaz</refentrytitle>
+ <manvolnum>7</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>yaz-ztest</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </citerefentry>,
+ </para>
+ <para>
+ Section "Building clients with ZOOM" in the YAZ manual.
+ </para>
+ <para>
+ <ulink url="http://zoom.z3950.org/">ZOOM home page</ulink>.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-local-catalogs: nil
+sgml-namecase-general:t
+End:
+-->
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
- <!ENTITY zoomsh-commands SYSTEM "zoomsh-commands.xml">
-]>
-<!-- $Id: zoomsh.sgml,v 1.4 2002-10-09 23:07:12 mike Exp $ -->
-<refentry id="zoomsh">
-
- <refmeta>
- <refentrytitle>zoomsh</refentrytitle>
- <manvolnum>1</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>zoomsh</refname>
- <refpurpose>ZOOM shell</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>zoomsh</command>
- <arg choice="opt" rep="repeat">commands</arg>
- </cmdsynopsis>
- </refsynopsisdiv>
-
- <refsect1><title>DESCRIPTION</title>
- <para>
- <command>zoomsh</command> is a ZOOM client with a simple
- command line interface. The client demonstrates the ZOOM
- API and is useful for testing targets.
- </para>
- <para>
- You may pass one or more commands to <command>zoomsh</command>.
- These commands are invoked first.
- </para>
- </refsect1>
- <refsect1><title>EXAMPLES</title>
- <para>
- If you start the <command>yaz-ztest</command> in one console you
- can use the ZOOM shell as follows:
- <screen><![CDATA[
-$ zoomsh
-ZOOM>connect localhost:9999
-ZOOM>search computer
-localhost:9999: 7 hits
-ZOOM>show 0 1
-1 Default USmarc
-001 11224466
-003 DLC
-005 00000000000000.0
-008 910710c19910701nju 00010 eng
-010 $a 11224466
-040 $a DLC $c DLC
-050 00 $a 123-xyz
-100 10 $a Jack Collins
-245 10 $a How to program a computer
-260 1 $a Penguin
-263 $a 8710
-300 $a p. cm.
-ZOOM>quit
-]]>
- </screen>
- </para>
- <para>
- You can also achieve the same result by passing the commands
- as arguments on a single command line:
- </para>
- <para>
- <literal>$ zoomsh "connect localhost:9999" "search computer"</literal>
- <literal>"show 0 1" quit</literal>
- </para>
- </refsect1>
- <refsect1><title>COMMANDS</title>
- <variablelist>
-
- <varlistentry><term><literal>connect</literal>
- <replaceable>zurl</replaceable></term>
- <listitem><para>
- Connects to the target given by <replaceable>zurl</replaceable>.
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>close</literal>
- [<replaceable>zurl</replaceable>]</term>
- <listitem><para>
- Closes connection to target given by
- <replaceable>zurl</replaceable> or all targets if
- <replaceable>zurl</replaceable> was omitted.
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>show</literal>
- [<replaceable>start</replaceable>
- [<replaceable>count</replaceable>]]
- </term>
- <listitem><para>
- Displays <literal>count</literal> records starting at offset given
- by <replaceable>start</replaceable>. First records has offset 0
- (unlike the Z39.50 protocol).
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>quit</literal>
- </term>
- <listitem><para>
- Quits <command>zoomsh</command>.
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>set</literal>
- <replaceable>name</replaceable>
- [<replaceable>value</replaceable>]
- </term>
- <listitem><para>
- Sets option <replaceable>name</replaceable> to
- <replaceable>value</replaceable>.
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>get</literal>
- <replaceable>name</replaceable>
- </term>
- <listitem><para>
- Prints value of option <replaceable>name</replaceable>.
- </para></listitem></varlistentry>
-
- <varlistentry><term><literal>help</literal>
- </term>
- <listitem><para>
- Prints list of available commands.
- </para></listitem></varlistentry>
-
- </variablelist>
-
- </refsect1>
- <refsect1><title>SEE ALSO</title>
- <para>
- <citerefentry>
- <refentrytitle>yaz</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>yaz-ztest</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>,
- </para>
- <para>
- Section "Building clients with ZOOM" in the YAZ manual.
- </para>
- <para>
- <ulink url="http://zoom.z3950.org/">ZOOM home page</ulink>.
- </para>
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-local-catalogs: nil
-sgml-namecase-general:t
-End:
--->
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-ill-core.c
-item-req.c
-libill.la
-*.lo
+++ /dev/null
-## $Id: Makefile.am,v 1.10 2003-05-27 21:12:22 adam Exp $
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-tabdatadir=$(pkgdatadir)/ill
-tabdata_DATA=ill9702.asn item-req.asn ill.tcl
-EXTRA_DIST=$(tabdata_DATA)
-
-noinst_LTLIBRARIES=libill.la
-
-libill_la_SOURCES=ill-core.c item-req.c ill-get.c
-
-$(srcdir)/ill-core.c \
-$(top_srcdir)/include/yaz/ill-core.h: \
-$(srcdir)/ill.tcl $(srcdir)/ill9702.asn $(top_srcdir)/util/yaz-asncomp
- cd $(srcdir); ../util/yaz-asncomp -d ill.tcl -i yaz -I ../include $(YCFLAGS) ill9702.asn
-
-$(srcdir)/item-req.c \
-$(top_srcdir)/include/yaz/item-req.h: \
-$(srcdir)/ill.tcl $(srcdir)/item-req.asn $(top_srcdir)/util/yaz-asncomp
- cd $(srcdir); ../util/yaz-asncomp -d ill.tcl -i yaz -I ../include $(YCFLAGS) item-req.asn
+++ /dev/null
-/*
- * Copyright (c) 1999-2001, Index Data.
- * See the file LICENSE for details.
- *
- * $Log: ill-get.c,v $
- * Revision 1.9 2001-03-25 21:55:12 adam
- * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
- *
- * Revision 1.8 2001/02/21 13:46:53 adam
- * C++ fixes.
- *
- * Revision 1.7 2001/02/20 11:25:32 adam
- * Added ill_get_APDU and ill_get_Cancel.
- *
- * Revision 1.6 2000/08/10 08:41:26 adam
- * Fixes for ILL.
- *
- * Revision 1.5 2000/02/24 08:52:01 adam
- * Bug fix.
- *
- * Revision 1.4 2000/02/04 11:01:15 adam
- * Added more elements.
- *
- * Revision 1.3 2000/01/31 13:15:21 adam
- * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
- * that some characters are not surrounded by spaces in resulting term.
- * ILL-code updates.
- *
- * Revision 1.2 2000/01/15 09:38:51 adam
- * Implemented ill_get_ILLRequest. Added some type mappings for ILL protocol.
- *
- * Revision 1.1 1999/12/16 23:36:19 adam
- * Implemented ILL protocol. Minor updates ASN.1 compiler.
- *
- */
-
-#include <yaz/ill.h>
-
-bool_t *ill_get_bool (struct ill_get_ctl *gc, const char *name,
- const char *sub, int val)
-{
- ODR o = gc->odr;
- char element[128];
- const char *v;
- bool_t *r = (bool_t *) odr_malloc (o, sizeof(*r));
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
-
- v = (gc->f)(gc->clientData, element);
- if (v)
- val = atoi(v);
- else if (val < 0)
- return 0;
- *r = val;
- return r;
-}
-
-int *ill_get_int (struct ill_get_ctl *gc, const char *name,
- const char *sub, int val)
-{
- ODR o = gc->odr;
- char element[128];
- const char *v;
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- v = (gc->f)(gc->clientData, element);
- if (v)
- val = atoi(v);
- return odr_intdup(o, val);
-}
-
-int *ill_get_enumerated (struct ill_get_ctl *gc, const char *name,
- const char *sub, int val)
-{
- return ill_get_int(gc, name, sub, val);
-}
-
-ILL_String *ill_get_ILL_String_x (struct ill_get_ctl *gc, const char *name,
- const char *sub, const char *vdefault)
-{
- ILL_String *r = (ILL_String *) odr_malloc (gc->odr, sizeof(*r));
- char element[128];
- const char *v;
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- v = (gc->f)(gc->clientData, element);
- if (!v)
- v = vdefault;
- if (!v)
- return 0;
- r->which = ILL_String_GeneralString;
- r->u.GeneralString = odr_strdup (gc->odr, v);
- return r;
-}
-
-ILL_String *ill_get_ILL_String(struct ill_get_ctl *gc, const char *name,
- const char *sub)
-{
- return ill_get_ILL_String_x (gc, name, sub, 0);
-}
-
-ILL_ISO_Date *ill_get_ILL_ISO_Date (struct ill_get_ctl *gc, const char *name,
- const char *sub, const char *val)
-{
- char element[128];
- const char *v;
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- v = (gc->f)(gc->clientData, element);
- if (!v)
- v = val;
- if (!v)
- return 0;
- return odr_strdup (gc->odr, v);
-}
-
-ILL_ISO_Time *ill_get_ILL_ISO_Time (struct ill_get_ctl *gc, const char *name,
- const char *sub, const char *val)
-{
- char element[128];
- const char *v;
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- v = (gc->f)(gc->clientData, element);
- if (!v)
- v = val;
- if (!v)
- return 0;
- return odr_strdup (gc->odr, v);
-}
-
-ILL_Person_Or_Institution_Symbol *ill_get_Person_Or_Insitution_Symbol (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- char element[128];
- ODR o = gc->odr;
- ILL_Person_Or_Institution_Symbol *p =
- (ILL_Person_Or_Institution_Symbol *) odr_malloc (o, sizeof(*p));
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- p->which = ILL_Person_Or_Institution_Symbol_person_symbol;
- if ((p->u.person_symbol = ill_get_ILL_String (gc, element, "person")))
- return p;
-
- p->which = ILL_Person_Or_Institution_Symbol_institution_symbol;
- if ((p->u.institution_symbol =
- ill_get_ILL_String (gc, element, "institution")))
- return p;
- return 0;
-}
-
-static ILL_Name_Of_Person_Or_Institution *ill_get_Name_Of_Person_Or_Institution(
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- char element[128];
- ODR o = gc->odr;
- ILL_Name_Of_Person_Or_Institution *p =
- (ILL_Name_Of_Person_Or_Institution *) odr_malloc (o, sizeof(*p));
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- p->which = ILL_Name_Of_Person_Or_Institution_name_of_person;
- if ((p->u.name_of_person =
- ill_get_ILL_String (gc, element, "name-of-person")))
- return p;
-
- p->which = ILL_Name_Of_Person_Or_Institution_name_of_institution;
- if ((p->u.name_of_institution =
- ill_get_ILL_String (gc, element, "name-of-institution")))
- return p;
- return 0;
-}
-
-ILL_System_Id *ill_get_System_Id(struct ill_get_ctl *gc,
- const char *name, const char *sub)
-{
- ODR o = gc->odr;
- char element[128];
- ILL_System_Id *p;
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- p = (ILL_System_Id *) odr_malloc (o, sizeof(*p));
- p->person_or_institution_symbol = ill_get_Person_Or_Insitution_Symbol (
- gc, element, "person-or-institution-symbol");
- p->name_of_person_or_institution = ill_get_Name_Of_Person_Or_Institution (
- gc, element, "name-of-person-or-institution");
- return p;
-}
-
-ILL_Transaction_Id *ill_get_Transaction_Id (struct ill_get_ctl *gc,
- const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Transaction_Id *r = (ILL_Transaction_Id *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->initial_requester_id =
- ill_get_System_Id (gc, element, "initial-requester-id");
- r->transaction_group_qualifier =
- ill_get_ILL_String_x (gc, element, "transaction-group-qualifier", "");
- r->transaction_qualifier =
- ill_get_ILL_String_x (gc, element, "transaction-qualifier", "");
- r->sub_transaction_qualifier =
- ill_get_ILL_String (gc, element, "sub-transaction-qualifier");
- return r;
-}
-
-
-ILL_Service_Date_this *ill_get_Service_Date_this (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Service_Date_this *r =
- (ILL_Service_Date_this *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->date = ill_get_ILL_ISO_Date (gc, element, "date", "20000101");
- r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
- return r;
-}
-
-ILL_Service_Date_original *ill_get_Service_Date_original (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Service_Date_original *r =
- (ILL_Service_Date_original *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->date = ill_get_ILL_ISO_Date (gc, element, "date", 0);
- r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
- if (!r->date && !r->time)
- return 0;
- return r;
-}
-
-ILL_Service_Date_Time *ill_get_Service_Date_Time (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Service_Date_Time *r =
- (ILL_Service_Date_Time *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->date_time_of_this_service = ill_get_Service_Date_this (
- gc, element, "this");
- r->date_time_of_original_service = ill_get_Service_Date_original (
- gc, element, "original");
- return r;
-}
-
-ILL_Requester_Optional_Messages_Type *ill_get_Requester_Optional_Messages_Type (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Requester_Optional_Messages_Type *r =
- (ILL_Requester_Optional_Messages_Type *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->can_send_RECEIVED = ill_get_bool (gc, element, "can-send-RECEIVED", 0);
- r->can_send_RETURNED = ill_get_bool (gc, element, "can-send-RETURNED", 0);
- r->requester_SHIPPED =
- ill_get_enumerated (gc, element, "requester-SHIPPED", 1);
- r->requester_CHECKED_IN =
- ill_get_enumerated (gc, element, "requester-CHECKED-IN", 1);
- return r;
-}
-
-ILL_Item_Id *ill_get_Item_Id (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Item_Id *r = (ILL_Item_Id *) odr_malloc (o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->item_type = ill_get_enumerated (gc, element, "item-type",
- ILL_Item_Id_monograph);
- r->held_medium_type = 0;
- r->call_number = ill_get_ILL_String(gc, element, "call-number");
- r->author = ill_get_ILL_String(gc, element, "author");
- r->title = ill_get_ILL_String(gc, element, "title");
- r->sub_title = ill_get_ILL_String(gc, element, "sub-title");
- r->sponsoring_body = ill_get_ILL_String(gc, element, "sponsoring-body");
- r->place_of_publication =
- ill_get_ILL_String(gc, element, "place-of-publication");
- r->publisher = ill_get_ILL_String(gc, element, "publisher");
- r->series_title_number =
- ill_get_ILL_String(gc, element, "series-title-number");
- r->volume_issue = ill_get_ILL_String(gc, element, "volume-issue");
- r->edition = ill_get_ILL_String(gc, element, "edition");
- r->publication_date = ill_get_ILL_String(gc, element, "publication-date");
- r->publication_date_of_component =
- ill_get_ILL_String(gc, element, "publication-date-of-component");
- r->author_of_article = ill_get_ILL_String(gc, element,
- "author-of-article");
- r->title_of_article = ill_get_ILL_String(gc, element, "title-of-article");
- r->pagination = ill_get_ILL_String(gc, element, "pagination");
- r->national_bibliography_no = 0;
- r->iSBN = ill_get_ILL_String(gc, element, "ISBN");
- r->iSSN = ill_get_ILL_String(gc, element, "ISSN");
- r->system_no = 0;
- r->additional_no_letters =
- ill_get_ILL_String(gc, element, "additional-no-letters");
- r->verification_reference_source =
- ill_get_ILL_String(gc, element, "verification-reference-source");
- return r;
-}
-
-
-ILL_Client_Id *ill_get_Client_Id (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- char element[128];
- ODR o = gc->odr;
- ILL_Client_Id *r = (ILL_Client_Id *) odr_malloc(o, sizeof(*r));
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->client_name = ill_get_ILL_String (gc, element, "client-name");
- r->client_status = ill_get_ILL_String (gc, element, "client-status");
- r->client_identifier = ill_get_ILL_String (gc, element,
- "client-identifier");
- return r;
-}
-
-ILL_Postal_Address *ill_get_Postal_Address (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Postal_Address *r =
- (ILL_Postal_Address *) odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->name_of_person_or_institution =
- ill_get_Name_Of_Person_Or_Institution (
- gc, element, "name-of-person-or-institution");
- r->extended_postal_delivery_address =
- ill_get_ILL_String (
- gc, element, "extended-postal-delivery-address");
- r->street_and_number =
- ill_get_ILL_String (gc, element, "street-and-number");
- r->post_office_box =
- ill_get_ILL_String (gc, element, "post-office-box");
- r->city = ill_get_ILL_String (gc, element, "city");
- r->region = ill_get_ILL_String (gc, element, "region");
- r->country = ill_get_ILL_String (gc, element, "country");
- r->postal_code = ill_get_ILL_String (gc, element, "postal-code");
- return r;
-}
-
-ILL_System_Address *ill_get_System_Address (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_System_Address *r =
- (ILL_System_Address *) odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->telecom_service_identifier =
- ill_get_ILL_String (gc, element, "telecom-service-identifier");
- r->telecom_service_address =
- ill_get_ILL_String (gc, element, "telecom-service-addreess");
- return r;
-}
-
-ILL_Delivery_Address *ill_get_Delivery_Address (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Delivery_Address *r =
- (ILL_Delivery_Address *) odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->postal_address =
- ill_get_Postal_Address (gc, element, "postal-address");
- r->electronic_address =
- ill_get_System_Address (gc, element, "electronic-address");
- return r;
-}
-
-ILL_Search_Type *ill_get_Search_Type (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Search_Type *r = (ILL_Search_Type *) odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->level_of_service = ill_get_ILL_String (gc, element, "level-of-service");
- r->need_before_date = ill_get_ILL_ISO_Date (gc, element,
- "need-before-date", 0);
- r->expiry_date = ill_get_ILL_ISO_Date (gc, element, "expiry-date", 0);
- r->expiry_flag = ill_get_enumerated (gc, element, "expiry-flag", 3);
-
- return r;
-}
-
-ILL_Request *ill_get_ILLRequest (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Request *r = (ILL_Request *) odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->protocol_version_num =
- ill_get_enumerated (gc, element, "protocol-version-num",
- ILL_Request_version_2);
-
- r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
- r->service_date_time =
- ill_get_Service_Date_Time (gc, element, "service-date-time");
- r->requester_id = ill_get_System_Id (gc, element, "requester-id");
- r->responder_id = ill_get_System_Id (gc, element, "responder-id");
- r->transaction_type =
- ill_get_enumerated(gc, element, "transaction-type", 1);
-
- r->delivery_address =
- ill_get_Delivery_Address (gc, element, "delivery-address");
- r->delivery_service = 0; /* TODO */
- /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
- r->billing_address =
- ill_get_Delivery_Address (gc, element, "billing-address");
-
- r->num_iLL_service_type = 1;
- r->iLL_service_type = (ILL_Service_Type **)
- odr_malloc (o, sizeof(*r->iLL_service_type));
- *r->iLL_service_type =
- ill_get_enumerated (gc, element, "ill-service-type",
- ILL_Service_Type_copy_non_returnable);
-
- r->responder_specific_service = 0;
- r->requester_optional_messages =
- ill_get_Requester_Optional_Messages_Type (
- gc, element,"requester-optional-messages");
- r->search_type = ill_get_Search_Type(gc, element, "search-type");
- r->num_supply_medium_info_type = 0;
- r->supply_medium_info_type = 0;
-
- r->place_on_hold = ill_get_enumerated (
- gc, element, "place-on-hold",
- ILL_Place_On_Hold_Type_according_to_responder_policy);
- r->client_id = ill_get_Client_Id (gc, element, "client-id");
-
- r->item_id = ill_get_Item_Id (gc, element, "item-id");
- r->supplemental_item_description = 0;
- r->cost_info_type = 0;
- r->copyright_compliance =
- ill_get_ILL_String(gc, element, "copyright-complicance");
- r->third_party_info_type = 0;
- r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
- r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
- r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
- r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
- r->num_iLL_request_extensions = 0;
- r->iLL_request_extensions = 0;
- return r;
-}
-
-ILL_ItemRequest *ill_get_ItemRequest (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_ItemRequest *r = (ILL_ItemRequest *)odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->protocol_version_num =
- ill_get_enumerated (gc, element, "protocol-version-num",
- ILL_Request_version_2);
-
- r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
- r->service_date_time =
- ill_get_Service_Date_Time (gc, element, "service-date-time");
- r->requester_id = ill_get_System_Id (gc, element, "requester-id");
- r->responder_id = ill_get_System_Id (gc, element, "responder-id");
- r->transaction_type =
- ill_get_enumerated(gc, element, "transaction-type", 1);
-
- r->delivery_address =
- ill_get_Delivery_Address (gc, element, "delivery-address");
- r->delivery_service = 0; /* TODO */
- /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
- r->billing_address =
- ill_get_Delivery_Address (gc, element, "billing-address");
-
- r->num_iLL_service_type = 1;
- r->iLL_service_type = (ILL_Service_Type **)
- odr_malloc (o, sizeof(*r->iLL_service_type));
- *r->iLL_service_type =
- ill_get_enumerated (gc, element, "ill-service-type",
- ILL_Service_Type_copy_non_returnable);
-
- r->responder_specific_service = 0;
- r->requester_optional_messages =
- ill_get_Requester_Optional_Messages_Type (
- gc, element,"requester-optional-messages");
- r->search_type = ill_get_Search_Type(gc, element, "search-type");
- r->num_supply_medium_info_type = 0;
- r->supply_medium_info_type = 0;
-
- r->place_on_hold = ill_get_enumerated (
- gc, element, "place-on-hold",
- ILL_Place_On_Hold_Type_according_to_responder_policy);
- r->client_id = ill_get_Client_Id (gc, element, "client-id");
-
- r->item_id = ill_get_Item_Id (gc, element, "item-id");
- r->supplemental_item_description = 0;
- r->cost_info_type = 0;
- r->copyright_compliance =
- ill_get_ILL_String(gc, element, "copyright-complicance");
- r->third_party_info_type = 0;
- r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
- r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
- r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
- r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
- r->num_iLL_request_extensions = 0;
- r->iLL_request_extensions = 0;
- return r;
-}
-
-ILL_Cancel *ill_get_Cancel (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_Cancel *r = (ILL_Cancel *)odr_malloc(o, sizeof(*r));
- char element[128];
-
- strcpy(element, name);
- if (sub)
- {
- strcat (element, ",");
- strcat (element, sub);
- }
- r->protocol_version_num =
- ill_get_enumerated (gc, element, "protocol-version-num",
- ILL_Request_version_2);
-
- r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
- r->service_date_time =
- ill_get_Service_Date_Time (gc, element, "service-date-time");
- r->requester_id = ill_get_System_Id (gc, element, "requester-id");
- r->responder_id = ill_get_System_Id (gc, element, "responder-id");
- r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
-
- r->num_cancel_extensions = 0;
- r->cancel_extensions = 0;
- return r;
-}
-
-ILL_APDU *ill_get_APDU (
- struct ill_get_ctl *gc, const char *name, const char *sub)
-{
- ODR o = gc->odr;
- ILL_APDU *r = (ILL_APDU *)odr_malloc(o, sizeof(*r));
- char element[128];
- const char *v;
-
- strcpy (element, name);
- strcat (element, ",which");
-
- v = (gc->f)(gc->clientData, element);
- if (!v)
- v = "request";
- if (!strcmp (v, "request"))
- {
- r->which = ILL_APDU_ILL_Request;
- r->u.illRequest = ill_get_ILLRequest(gc, name, sub);
- }
- else if (!strcmp (v, "cancel"))
- {
- r->which = ILL_APDU_Cancel;
- r->u.Cancel = ill_get_Cancel(gc, name, sub);
- }
- else
- return 0;
- return r;
-}
+++ /dev/null
-# Config File for ILL
-# $Id: ill.tcl,v 1.3 2001-02-21 13:46:53 adam Exp $
-# ----------------------------------------------------------
-# Prefix Specifications
-#
-# 1: C function prefix
-# 2: C type prefix
-# 3: C preprocessor prefix
-
-# Default prefix
-set default-prefix {ill_ ILL_ ILL_}
-
-# ----------------------------------------------------------
-set m ISO-10161-ILL-1
-
-# Filename
-set filename($m) ill-core
-
-# Header initialization code
-set init($m,h) "
-"
-
-# Header body code
-set body($m,h) "
-#ifdef __cplusplus
-extern \"C\" \{
-#endif
-
-#ifdef __cplusplus
-\}
-#endif
-"
-
-# C body code
-set body($m,c) "
-"
-
-# Some mappings - that map ill_ILL_<name> to ill_<name>
-set map($m,ILL-APDU) APDU
-set map($m,ILL-Request) Request
-set map($m,ILL-Answer) Answer
-set map($m,ILL-String) String
-set map($m,ILL-APDU-Type) APDU_Type
-set map($m,ILL-Service-Type) Service_Type
-set map($m,Service_Date_Time_0) Service_Date_this
-set map($m,Service_Date_Time_1) Service_Date_original
-set map($m,Overdue_0) Overdue_ExtensionS
-set membermap($m,APDU,ILL-Request) {APDU_ILL_Request illRequest}
-set membermap($m,APDU,ILL-Answer) {APDU_ILL_Answer illAnswer}
-
-# ----------------------------------------------------------
-set m Z39.50-extendedService-ItemOrder-ItemRequest-1
-# Filename
-set filename($m) item-req
-
-# Mappings of a few basic types
-proc asnBasicPrintableString {} {
- return {odr_visiblestring char}
-}
-
-proc asnBasicANY {} {
- return {odr_any Odr_any}
-}
+++ /dev/null
--- use of parameters and types is to be consistent with their definitions in clause 3
-
-ISO-10161-ILL-1 DEFINITIONS EXPLICIT TAGS ::=
-
-BEGIN
--- ISO-10161-ILL-1 refers to the ILL ISO standard 10161 version 1
--- and version 2 as specified in ISO standard 10161 Amendment 1
-
-ILL-APDU ::= CHOICE {
- ILL-Request,
- Forward-Notification,
- Shipped,
- ILL-Answer,
- Conditional-Reply,
- Cancel,
- Cancel-Reply,
- Received,
- Recall,
- Returned,
- Checked-In,
- Overdue,
- Renew,
- Renew-Answer,
- Lost,
- Damaged,
- Message,
- Status-Query,
- Status-Or-Error-Report,
- Expired
- }
-
--- The tagging scheme used in the APDU definitions is as follows:
--- each named type that is a component type of an APDU definition is assigned a different tag
--- that is unique within the set of APDU definitions. Where these component types themselves
--- have structure, the tagging within such type definitions has only local scope.
-
-ILL-Request ::= [APPLICATION 1] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
- delivery-address [6] IMPLICIT Delivery-Address OPTIONAL,
- delivery-service Delivery-Service OPTIONAL,
- billing-address [8] IMPLICIT Delivery-Address OPTIONAL,
- iLL-service-type [9] IMPLICIT SEQUENCE SIZE (1..5) OF
- ILL-Service-Type,
- -- this sequence is a list, in order of preference
- responder-specific-service [10] EXTERNAL OPTIONAL,
- -- use direct reference style
- requester-optional-messages [11] IMPLICIT Requester-Optional-Messages-Type,
- search-type [12] IMPLICIT Search-Type OPTIONAL,
- supply-medium-info-type [13] IMPLICIT SEQUENCE SIZE (1..7) OF
- Supply-Medium-Info-Type OPTIONAL,
- -- this sequence is a list, in order of preference,
- -- with a maximum number of 7 entries
- place-on-hold [14] IMPLICIT Place-On-Hold-Type DEFAULT 3,
- client-id [15] IMPLICIT Client-Id OPTIONAL,
- item-id [16] IMPLICIT Item-Id,
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- cost-info-type [18] IMPLICIT Cost-Info-Type OPTIONAL,
- copyright-compliance [19] ILL-String OPTIONAL,
- third-party-info-type [20] IMPLICIT Third-Party-Info-Type OPTIONAL,
- -- mandatory when initiating a FORWARD service or an
- -- ILL-REQUEST service for a partitioned ILL sub-
- -- transaction or when initiating an ILL-REQUEST service for
- -- an ILL sub-transaction if the received ILL-REQUEST
- -- included an "already-tried-list";optional otherwise
- retry-flag [21] IMPLICIT BOOLEAN DEFAULT FALSE,
- forward-flag [22] IMPLICIT BOOLEAN DEFAULT FALSE,
- requester-note [46] ILL-String OPTIONAL,
- forward-note [47] ILL-String OPTIONAL,
- iLL-request-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Forward-Notification ::= [APPLICATION 2] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id,
- -- mandatory in this APDU
- responder-address [24] IMPLICIT System-Address OPTIONAL,
- intermediary-id [25] IMPLICIT System-Id,
- notification-note [48] ILL-String OPTIONAL,
- forward-notification-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Shipped ::= [APPLICATION 3] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-address [24] IMPLICIT System-Address OPTIONAL,
- intermediary-id [25] IMPLICIT System-Id OPTIONAL,
- supplier-id [26] IMPLICIT System-Id OPTIONAL,
- client-id [15] IMPLICIT Client-Id OPTIONAL,
- transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- shipped-service-type [27] IMPLICIT Shipped-Service-Type,
- responder-optional-messages [28] IMPLICIT Responder-Optional-Messages-Type
- OPTIONAL,
- supply-details [29] IMPLICIT Supply-Details,
- return-to-address [30] IMPLICIT Postal-Address OPTIONAL,
- responder-note [46] ILL-String OPTIONAL,
- shipped-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-ILL-Answer ::= [APPLICATION 4] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- transaction-results [31] IMPLICIT Transaction-Results,
- results-explanation [32] CHOICE {
- conditional-results [1] Conditional-Results,
- -- chosen if transaction-results=CONDITIONAL
- retry-results [2] Retry-Results,
- -- chosen if transaction-results=RETRY
- unfilled-results [3] Unfilled-Results,
- --chosen if transaction-results=UNFILLED
- locations-results [4] Locations-Results,
- -- chosen if transaction-results=LOCATIONS-PROVIDED
- will-supply-results [5] Will-Supply-Results,
- -- chosen if transaction-results=WILL-SUPPLY
- hold-placed-results [6] Hold-Placed-Results,
- -- chosen if transaction-results=HOLD-PLACED
- estimate-results [7] Estimate-Results
- -- chosen if transaction-results=ESTIMATE
- } OPTIONAL,
- -- optional if transaction-results equals RETRY, UNFILLED,
- -- WILL-SUPPLY or HOLD-PLACED;
- -- required if transaction-results equals CONDITIONAL,
- -- LOCATIONS-PROVIDED or ESTIMATE
- responder-specific-results [33] EXTERNAL OPTIONAL,
- -- this type is mandatory if results-explanation
- -- chosen for any result
- -- has the value "responder-specific".
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- send-to-list [23] IMPLICIT Send-To-List-Type OPTIONAL,
- already-tried-list [34] IMPLICIT Already-Tried-List-Type OPTIONAL,
- responder-optional-messages [28] IMPLICIT Responder-Optional-Messages-Type
- OPTIONAL,
- responder-note [46] ILL-String OPTIONAL,
- ill-answer-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Conditional-Reply ::= [APPLICATION 5] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- answer [35] IMPLICIT BOOLEAN,
- requester-note [46] ILL-String OPTIONAL,
- conditional-reply-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Cancel ::= [APPLICATION 6] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- requester-note [46] ILL-String OPTIONAL,
- cancel-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Cancel-Reply ::= [APPLICATION 7] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- answer [35] IMPLICIT BOOLEAN,
- responder-note [46] ILL-String OPTIONAL,
- cancel-reply-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Received ::= [APPLICATION 8] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- supplier-id [26] IMPLICIT System-Id OPTIONAL,
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- date-received [36] IMPLICIT ISO-Date,
- shipped-service-type [27] IMPLICIT Shipped-Service-Type,
- requester-note [46] ILL-String OPTIONAL,
- received-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Recall ::= [APPLICATION 9] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-note [46] ILL-String OPTIONAL,
- recall-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Returned ::= [APPLICATION 10] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- date-returned [37] IMPLICIT ISO-Date,
- returned-via [38] Transportation-Mode OPTIONAL,
- insured-for [39] IMPLICIT Amount OPTIONAL,
- requester-note [46] ILL-String OPTIONAL,
- returned-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Checked-In ::= [APPLICATION 11] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- date-checked-in [40] IMPLICIT ISO-Date,
- responder-note [46] ILL-String OPTIONAL,
- checked-in-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Overdue ::= [APPLICATION 12] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- date-due [41] IMPLICIT Date-Due,
- responder-note [46] ILL-String OPTIONAL,
- overdue-extensions [49] SEQUENCE OF Extension OPTIONAL
- }
-
-Renew ::= [APPLICATION 13] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- desired-due-date [42] IMPLICIT ISO-Date OPTIONAL,
- requester-note [46] ILL-String OPTIONAL,
- renew-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Renew-Answer ::= [APPLICATION 14] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- answer [35] IMPLICIT BOOLEAN,
- date-due [41] IMPLICIT Date-Due OPTIONAL,
- responder-note [46] ILL-String OPTIONAL,
- renew-answer-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Lost ::= [APPLICATION 15] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- note [46] ILL-String OPTIONAL,
- lost-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Damaged ::= [APPLICATION 16] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- damaged-details [5] IMPLICIT Damaged-Details OPTIONAL,
- -- this parameter may only be present in APDU's with a
- -- protocol-version-num value of 2 or greater
- note [46] ILL-String OPTIONAL,
- damaged-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Message ::= [APPLICATION 17] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- note [46] ILL-String,
- message-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Status-Query ::= [APPLICATION 18] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- note [46] ILL-String OPTIONAL,
- status-query-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Status-Or-Error-Report ::= [APPLICATION 19] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- reason-no-report [43] IMPLICIT Reason-No-Report OPTIONAL,
- -- mandatory if no report is present;
- -- not present otherwise
- status-report [44] IMPLICIT Status-Report OPTIONAL,
- error-report [45] IMPLICIT Error-Report OPTIONAL,
- note [46] ILL-String OPTIONAL,
- status-or-error-report-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Expired ::= [APPLICATION 20] SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id,
- service-date-time [2] IMPLICIT Service-Date-Time,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- -- mandatory when using store-and-forward communications
- -- optional when using connection-oriented communications
- expired-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-
-Account-Number ::= ILL-String
-
-Already-Forwarded ::= SEQUENCE {
- responder-id [0] IMPLICIT System-Id,
- responder-address [1] IMPLICIT System-Address OPTIONAL
- }
-
-Already-Tried-List-Type ::= SEQUENCE OF System-Id
-
-Amount ::= SEQUENCE {
- currency-code [0] IMPLICIT PrintableString (SIZE (3)) OPTIONAL,
- -- values defined in ISO 4217-1981
- monetary-value [1] IMPLICIT AmountString (SIZE (1..10))
- }
-
-AmountString ::= PrintableString (FROM ("1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"|"0"|" "|"."|","))
-
-Client-Id ::= SEQUENCE {
- client-name [0] ILL-String OPTIONAL,
- client-status [1] ILL-String OPTIONAL,
- client-identifier [2] ILL-String OPTIONAL
- }
-
-Conditional-Results ::= SEQUENCE {
- conditions [0] IMPLICIT ENUMERATED {
- cost-exceeds-limit (13),
- charges (14),
- prepayment-required (15),
- lacks-copyright-compliance (16),
- library-use-only (22),
- no-reproduction (23),
- client-signature-required (24),
- special-collections-supervision-required (25),
- other (27),
- responder-specific (28),
- proposed-delivery-service (30)
- },
- date-for-reply [1] IMPLICIT ISO-Date OPTIONAL,
- locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL,
- proposed-delivery-service Delivery-Service OPTIONAL
- -- this parameter specifies a proposed delivery service the
- -- acceptance of which is a condition of supply. It may be a
- -- physical service or an electronic service. This parameter
- -- may only be present in APDUs with a
- -- protocol-version-num value of 2 or greater
- }
-
-Cost-Info-Type ::= SEQUENCE {
- account-number [0] Account-Number OPTIONAL,
- maximum-cost [1] IMPLICIT Amount OPTIONAL,
- reciprocal-agreement [2] IMPLICIT BOOLEAN DEFAULT FALSE,
- will-pay-fee [3] IMPLICIT BOOLEAN DEFAULT FALSE,
- payment-provided [4] IMPLICIT BOOLEAN DEFAULT FALSE
- }
-
-Current-State ::= ENUMERATED {
- nOT-SUPPLIED (1),
- pENDING (2),
- iN-PROCESS (3),
- fORWARD (4),
- cONDITIONAL (5),
- cANCEL-PENDING (6),
- cANCELLED (7),
- sHIPPED (8),
- rECEIVED (9),
- rENEW-PENDING (10),
- nOT-RECEIVED-OVERDUE (11),
- rENEW-OVERDUE (12),
- oVERDUE (13),
- rETURNED (14),
- cHECKED-IN (15),
- rECALL (16),
- lOST (17),
- uNKNOWN (18)
- }
-
-Damaged-Details ::= SEQUENCE {
- document-type-id [0] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- -- identifies an OSI document type registered in accordance
- -- with ISO 9834-2, for use in an automated environment
- damaged-portion CHOICE {
- complete-document [1] IMPLICIT NULL,
- specific-units [2] IMPLICIT SEQUENCE
- OF INTEGER
- -- the nature and extent of a "unit" is implicit in the
- -- value of document-type-id if one is supplied
- }
- }
-
-Date-Due ::= SEQUENCE {
- date-due-field [0] IMPLICIT ISO-Date,
- renewable [1] IMPLICIT BOOLEAN DEFAULT TRUE
- }
-
-Delivery-Address ::= SEQUENCE {
- postal-address [0] IMPLICIT Postal-Address OPTIONAL,
- electronic-address [1] IMPLICIT System-Address OPTIONAL
- }
-
-Delivery-Service ::= CHOICE {
- physical-delivery [7] Transportation-Mode,
- electronic-delivery [50] IMPLICIT SEQUENCE OF Electronic-Delivery-Service
- -- electronic-delivery may only be present in APDUs
- -- with a protocol-version-num value of 2 or greater
- }
-
-Electronic-Delivery-Service ::= SEQUENCE {
- -- the first four parameters are intended to be used in an automated
- -- environment
- e-delivery-service [0] IMPLICIT SEQUENCE {
- -- identifies the kind of electronic delivery service, e.g.
- -- MOTIS IPM,FTAM, etc., using the assigned object
- -- identifier for the standard e.g. {joint-iso-ccitt mhs-motis
- -- ipms}
- e-delivery-mode [0] IMPLICIT OBJECT IDENTIFIER,
- e-delivery-parameters [1] ANY DEFINED BY e-delivery-mode
- } OPTIONAL,
- document-type [1] IMPLICIT SEQUENCE {
- document-type-id [2] IMPLICIT OBJECT IDENTIFIER,
- -- identifies an OSI document type registered in accordance
- -- with ISO 9834-2
- document-type-parameters [3] ANY DEFINED BY document-type-id
- -- any parameters relating to the registered document type
- } OPTIONAL,
- e-delivery-description [4] ILL-String OPTIONAL,
- -- holds a human readable name or description of the
- -- required electronic delivery service and document type;
- -- this may also be used to identify an electronic delivery
- -- service for which there is no object identifier.
- -- This parameter may be present instead of, or in addition
- -- to, the previous 4 parameters
- e-delivery-details [5] CHOICE {
- e-delivery-address [0] IMPLICIT System-Address,
- e-delivery-id [1] IMPLICIT System-Id
- },
- name-or-code [6] ILL-String OPTIONAL,
- -- holds a human-readable identifier or correlation
- -- information for the document as shipped, e.g. a directory
- -- and/or file name or message-id
- delivery-time [7] IMPLICIT ISO-Time OPTIONAL
- -- holds the requester's preferred delivery time or
- -- the responder's proposed or actual delivery time
- }
-
-Error-Report ::= SEQUENCE {
- correlation-information [0] ILL-String,
- report-source [1] IMPLICIT Report-Source,
- user-error-report [2] User-Error-Report OPTIONAL,
- -- mandatory if report-source is "user"; not present otherwise
- provider-error-report [3] Provider-Error-Report OPTIONAL
- -- mandatory if report-source is "provider"; not
- -- present otherwise
- }
-
-Estimate-Results ::= SEQUENCE {
- cost-estimate [0] ILL-String,
- locations [1] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
- }
-
-Extension ::= SEQUENCE {
- identifier [0] IMPLICIT INTEGER,
- critical [1] IMPLICIT BOOLEAN DEFAULT FALSE,
- item [2] ANY DEFINED BY identifier
- }
-
-General-Problem ::= ENUMERATED {
- unrecognized-APDU (1),
- mistyped-APDU (2),
- badly-structured-APDU (3),
- protocol-version-not-supported (4),
- other (5)
- }
-
-History-Report ::= SEQUENCE {
- date-requested [0] IMPLICIT ISO-Date OPTIONAL,
- author [1] ILL-String OPTIONAL,
- title [2] ILL-String OPTIONAL,
- author-of-article [3] ILL-String OPTIONAL,
- title-of-article [4] ILL-String OPTIONAL,
- date-of-last-transition [5] IMPLICIT ISO-Date,
- most-recent-service [6] IMPLICIT ENUMERATED {
- iLL-REQUEST (1),
- fORWARD (21),
- fORWARD-NOTIFICATION (2),
- sHIPPED (3),
- iLL-ANSWER (4),
- cONDITIONAL-REPLY (5),
- cANCEL (6),
- cANCEL-REPLY (7),
- rECEIVED (8),
- rECALL (9),
- rETURNED (10),
- cHECKED-IN (11),
- rENEW-ANSWER (14),
- lOST (15),
- dAMAGED (16),
- mESSAGE (17),
- sTATUS-QUERY (18),
- sTATUS-OR-ERROR-REPORT (19),
- eXPIRED (20)
- },
- date-of-most-recent-service [7] IMPLICIT ISO-Date,
- initiator-of-most-recent-service [8] IMPLICIT System-Id,
- shipped-service-type [9] IMPLICIT Shipped-Service-Type OPTIONAL,
- -- If the information is available, i.e. if a SHIPPED or
- -- RECEIVED APDU has been sent or received, then the
- -- value in this parameter shall be supplied.
- -- Value must contain the most current information, e.g. if a
- -- requester has received a SHIPPED APDU and then
- -- invokes a RECEIVED.request, then the value from the
- -- RECEIVED.request is used
- transaction-results [10] IMPLICIT Transaction-Results OPTIONAL,
- -- If the information is available, i.e. if an ILL-ANWSER
- -- APDU has been sent or received, then the value in this
- -- parameter shall be supplied.
- most-recent-service-note [11] ILL-String OPTIONAL
- -- If the information is available, i.e. if a note has been
- -- supplied in the most recent service primitive, then the
- -- value in this parameter shall be supplied.
- }
-
-Hold-Placed-Results ::= SEQUENCE {
- estimated-date-available [0] IMPLICIT ISO-Date,
- hold-placed-medium-type [1] IMPLICIT Medium-Type OPTIONAL,
- locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
- }
-
-ILL-APDU-Type ::= ENUMERATED {
- iLL-REQUEST (1),
- fORWARD-NOTIFICATION (2),
- sHIPPED (3),
- iLL-ANSWER (4),
- cONDITIONAL-REPLY (5),
- cANCEL (6),
- cANCEL-REPLY (7),
- rECEIVED (8),
- rECALL (9),
- rETURNED (10),
- cHECKED-IN (11),
- oVERDUE (12),
- rENEW (13),
- rENEW-ANSWER (14),
- lOST (15),
- dAMAGED (16),
- mESSAGE (17),
- sTATUS-QUERY (18),
- sTATUS-OR-ERROR-REPORT (19),
- eXPIRED (20)
- }
-
-ILL-Service-Type ::= ENUMERATED {
- loan (1),
- copy-non-returnable (2),
- locations (3),
- estimate (4),
- responder-specific (5)
- }
-
-ILL-String ::= CHOICE {
- GeneralString,
- -- may contain any ISO registered G (graphic) and C
- -- (control) character set
- EDIFACTString
- }
- -- may not include leading or trailing spaces
- -- may not consist only of space (" ") or non-printing
- -- characters
-
-Intermediary-Problem ::= ENUMERATED {
- cannot-send-onward (1)
- }
-
-ISO-Date ::= VisibleString
- -- conforms to ISO 8601
- -- length = 8
- -- fixed
- -- YYYYMMDD
-
-ISO-Time ::= VisibleString
- -- conforms to ISO 8601
- -- length = 6,
- -- fixed
- -- HHMMSS
- -- local time of person or institution invoking service
-
-Item-Id ::= SEQUENCE {
- item-type [0] IMPLICIT ENUMERATED {
- monograph (1),
- serial (2),
- other (3)
- } OPTIONAL,
- held-medium-type [1] IMPLICIT Medium-Type OPTIONAL,
- call-number [2] ILL-String OPTIONAL,
- author [3] ILL-String OPTIONAL,
- title [4] ILL-String OPTIONAL,
- sub-title [5] ILL-String OPTIONAL,
- sponsoring-body [6] ILL-String OPTIONAL,
- place-of-publication [7] ILL-String OPTIONAL,
- publisher [8] ILL-String OPTIONAL,
- series-title-number [9] ILL-String OPTIONAL,
- volume-issue [10] ILL-String OPTIONAL,
- edition [11] ILL-String OPTIONAL,
- publication-date [12] ILL-String OPTIONAL,
- publication-date-of-component [13] ILL-String OPTIONAL,
- author-of-article [14] ILL-String OPTIONAL,
- title-of-article [15] ILL-String OPTIONAL,
- pagination [16] ILL-String OPTIONAL,
- national-bibliography-no [17] EXTERNAL OPTIONAL,
- iSBN [18] ILL-String (SIZE (10)) OPTIONAL,
- -- must conform to ISO 2108-1978
- iSSN [19] ILL-String (SIZE (8)) OPTIONAL,
- -- must conform to ISO 3297-1986
- system-no [20] EXTERNAL OPTIONAL,
- additional-no-letters [21] ILL-String OPTIONAL,
- verification-reference-source [22] ILL-String OPTIONAL
- }
-
-Location-Info ::= SEQUENCE {
- location-id [0] IMPLICIT System-Id,
- location-address [1] IMPLICIT System-Address OPTIONAL,
- location-note [2] ILL-String OPTIONAL
- }
-
-Locations-Results ::= SEQUENCE {
- reason-locs-provided [0] IMPLICIT Reason-Locs-Provided OPTIONAL,
- locations [1] IMPLICIT SEQUENCE OF Location-Info
- }
-
-Medium-Type ::= ENUMERATED {
- printed (1),
- microform (3),
- film-or-video-recording (4),
- audio-recording (5),
- machine-readable (6),
- other (7)
- }
-
-Name-Of-Person-Or-Institution ::= CHOICE {
- name-of-person [0] ILL-String,
- name-of-institution [1] ILL-String
- }
-
-Person-Or-Institution-Symbol ::= CHOICE {
- person-symbol [0] ILL-String,
- institution-symbol [1] ILL-String
- }
-
-Place-On-Hold-Type ::= ENUMERATED {
- yes (1),
- no (2),
- according-to-responder-policy (3)
- }
-
-Postal-Address ::= SEQUENCE {
- name-of-person-or-institution [0] Name-Of-Person-Or-Institution OPTIONAL,
- extended-postal-delivery-address [1] ILL-String OPTIONAL,
- street-and-number [2] ILL-String OPTIONAL,
- post-office-box [3] ILL-String OPTIONAL,
- city [4] ILL-String OPTIONAL,
- region [5] ILL-String OPTIONAL,
- country [6] ILL-String OPTIONAL,
- postal-code [7] ILL-String OPTIONAL
- }
-
-Provider-Error-Report ::= CHOICE {
- general-problem [0] IMPLICIT General-Problem,
- transaction-id-problem [1] IMPLICIT Transaction-Id-Problem,
- state-transition-prohibited [2] IMPLICIT State-Transition-Prohibited
- }
-
-Reason-Locs-Provided ::= ENUMERATED {
- in-use-on-loan (1),
- in-process (2),
- lost (3),
- non-circulating (4),
- not-owned (5),
- on-order (6),
- volume-issue-not-yet-available (7),
- at-bindery (8),
- lacking (9),
- not-on-shelf (10),
- on-reserve (11),
- poor-condition (12),
- cost-exceeds-limit (13),
- on-hold (19),
- other (27),
- responder-specific (28)
- }
-
-Reason-No-Report ::= ENUMERATED {
- temporary (1),
- permanent (2)
- }
-
-Reason-Unfilled ::= ENUMERATED {
- in-use-on-loan (1),
- in-process (2),
- lost (3),
- non-circulating (4),
- not-owned (5),
- on-order (6),
- volume-issue-not-yet-available (7),
- at-bindery (8),
- lacking (9),
- not-on-shelf (10),
- on-reserve (11),
- poor-condition (12),
- cost-exceeds-limit (13),
- charges (14),
- prepayment-required (15),
- lacks-copyright-compliance (16),
- not-found-as-cited (17),
- locations-not-found (18),
- on-hold (19),
- policy-problem (20),
- mandatory-messaging-not-supported (21),
- expiry-not-supported (22) ,
- requested-delivery-services-not-supported (23),
- preferred-delivery-time-not-possible (24),
- other (27),
- responder-specific (28)
- }
-
-Report-Source ::= ENUMERATED {
- user (1),
- provider (2)
- }
-
-Requester-Optional-Messages-Type ::= SEQUENCE {
- can-send-RECEIVED [0] IMPLICIT BOOLEAN,
- can-send-RETURNED [1] IMPLICIT BOOLEAN,
- requester-SHIPPED [2] IMPLICIT ENUMERATED {
- requires (1),
- desires (2),
- neither (3)
- },
- requester-CHECKED-IN [3] IMPLICIT ENUMERATED {
- requires (1),
- desires (2),
- neither (3)
- }
- }
-
-Responder-Optional-Messages-Type ::= SEQUENCE {
- can-send-SHIPPED [0] IMPLICIT BOOLEAN,
- can-send-CHECKED-IN [1] IMPLICIT BOOLEAN,
- responder-RECEIVED [2] IMPLICIT ENUMERATED {
- requires (1),
- desires (2),
- neither (3)
- },
- responder-RETURNED [3] IMPLICIT ENUMERATED {
- requires (1),
- desires (2),
- neither (3)
- }
- }
-
-Retry-Results ::= SEQUENCE {
- reason-not-available [0] IMPLICIT ENUMERATED {
- in-use-on-loan (1),
- in-process (2),
- on-order (6),
- volume-issue-not-yet-available (7),
- at-bindery (8),
- cost-exceeds-limit (13),
- charges (14),
- prepayment-required (15),
- lacks-copyright-compliance (16),
- not-found-as-cited (17),
- on-hold (19),
- other (27),
- responder-specific (28)
- } OPTIONAL,
- retry-date [1] IMPLICIT ISO-Date OPTIONAL,
- locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
- }
-
-Search-Type ::= SEQUENCE {
- level-of-service [0] ILL-String (SIZE (1)) OPTIONAL,
- need-before-date [1] IMPLICIT ISO-Date OPTIONAL,
- expiry-flag [2] IMPLICIT ENUMERATED {
- need-Before-Date (1),
- other-Date (2),
- no-Expiry (3)
- } DEFAULT 3,
- -- value of "need-Before-Date" indicates that
- -- need-before-date also specifies transaction expiry
- -- date
- expiry-date [3] IMPLICIT ISO-Date OPTIONAL
- -- alternative expiry date can be used only when expiry-flag
- -- is set to "Other-Date"
- }
-
-Security-Problem ::= ILL-String
-
-Send-To-List-Type ::= SEQUENCE OF SEQUENCE {
- system-id [0] IMPLICIT System-Id,
- account-number [1] Account-Number OPTIONAL,
- system-address [2] IMPLICIT System-Address OPTIONAL
- }
-
-Service-Date-Time ::= SEQUENCE {
- date-time-of-this-service [0] IMPLICIT SEQUENCE {
- date [0] IMPLICIT ISO-Date,
- time [1] IMPLICIT ISO-Time OPTIONAL
- -- mandatory for 2nd and subsequent services
- -- invoked for a given
- -- ILL-transaction on the same day
- },
- date-time-of-original-service [1] IMPLICIT SEQUENCE {
- date [0] IMPLICIT ISO-Date,
- time [1] IMPLICIT ISO-Time OPTIONAL
- } OPTIONAL
- }
-
-Shipped-Service-Type ::= ILL-Service-Type (loan | copy-non-returnable)
- -- subtype of ILL-Service-Type
-
-State-Transition-Prohibited ::= SEQUENCE {
- aPDU-type [0] IMPLICIT ILL-APDU-Type,
- current-state [1] IMPLICIT Current-State
- }
-
-Status-Report ::= SEQUENCE {
- user-status-report [0] IMPLICIT History-Report,
- provider-status-report [1] IMPLICIT Current-State
- }
-
-Supplemental-Item-Description ::= SEQUENCE OF EXTERNAL
- -- the syntax of supplementary item description information is defined outside this standard
-
-Supply-Details ::= SEQUENCE {
- date-shipped [0] IMPLICIT ISO-Date OPTIONAL,
- date-due [1] IMPLICIT Date-Due OPTIONAL,
- chargeable-units [2] IMPLICIT INTEGER (1..9999) OPTIONAL,
- cost [3] IMPLICIT Amount OPTIONAL,
- shipped-conditions [4] IMPLICIT ENUMERATED {
- library-use-only (22),
- no-reproduction (23),
- client-signature-required (24),
- special-collections-supervision-required (25),
- other (27)
- } OPTIONAL,
- shipped-via CHOICE {
- physical-delivery [5] Transportation-Mode,
- electronic-delivery [50] IMPLICIT
- Electronic-Delivery-Service
- } OPTIONAL,
- -- electronic-delivery may only be present in APDUs with a
- -- protocol-version-num value of 2 or greater
- insured-for [6] IMPLICIT Amount OPTIONAL,
- return-insurance-require [7] IMPLICIT Amount OPTIONAL,
- no-of-units-per-medium [8] IMPLICIT SEQUENCE OF Units-Per-Medium-Type
- OPTIONAL
- }
-
-Supply-Medium-Info-Type ::= SEQUENCE {
- supply-medium-type [0] IMPLICIT Supply-Medium-Type,
- medium-characteristics [1] ILL-String OPTIONAL
- }
-
-Supply-Medium-Type ::= ENUMERATED {
- printed (1),
- photocopy (2),
- microform (3),
- film-or-video-recording (4),
- audio-recording (5),
- machine-readable (6),
- other (7)
- }
-
-System-Address ::= SEQUENCE {
- telecom-service-identifier [0] ILL-String OPTIONAL,
- telecom-service-address [1] ILL-String OPTIONAL
- }
-
-System-Id ::= SEQUENCE {
- --at least one of the following must be present
- person-or-institution-symbol [0] Person-Or-Institution-Symbol OPTIONAL,
- name-of-person-or-institution [1] Name-Of-Person-Or-Institution OPTIONAL
- }
-
-Third-Party-Info-Type ::= SEQUENCE {
- permission-to-forward [0] IMPLICIT BOOLEAN DEFAULT FALSE,
- permission-to-chain [1] IMPLICIT BOOLEAN DEFAULT FALSE,
- permission-to-partition [2] IMPLICIT BOOLEAN DEFAULT FALSE,
- permission-to-change-send-to-list [3] IMPLICIT BOOLEAN DEFAULT FALSE,
- initial-requester-address [4] IMPLICIT System-Address OPTIONAL,
- -- mandatory when initiating a FORWARD service or an
- -- ILL-REQUEST service for a partitioned ILL
- -- sub-transaction; optional otherwise
- preference [5] IMPLICIT ENUMERATED {
- ordered (1),
- unordered (2)
- } DEFAULT 2,
- send-to-list [6] IMPLICIT Send-To-List-Type OPTIONAL,
- already-tried-list [7] IMPLICIT Already-Tried-List-Type OPTIONAL
- -- mandatory when initiating a FORWARD service, or when
- -- initiating an ILL-REQUEST service for an ILL
- -- sub-transaction if the received ILL-REQUEST included an
- -- "already-tried-list"; optional otherwise
- }
-
-Transaction-Id ::= SEQUENCE {
- initial-requester-id [0] IMPLICIT System-Id OPTIONAL,
- -- mandatory for sub-transactions; not called
- -- "requester-id" to distinguish id of initial-requester
- --from id of requester of sub-transaction if there is one
- transaction-group-qualifier [1] ILL-String,
- transaction-qualifier [2] ILL-String,
- sub-transaction-qualifier [3] ILL-String OPTIONAL
- -- mandatory for sub-transactions
- }
-
-Transaction-Id-Problem ::= ENUMERATED {
- duplicate-transaction-id (1),
- invalid-transaction-id (2),
- unknown-transaction-id (3)
- }
-
-Transaction-Results ::= ENUMERATED {
- conditional (1),
- retry (2),
- unfilled (3),
- locations-provided (4),
- will-supply (5),
- hold-placed (6),
- estimate (7)
- }
-
-Transaction-Type ::= ENUMERATED {
- simple (1),
- chained (2),
- partitioned (3)
- }
-
-Transportation-Mode ::= ILL-String
-
-Unable-To-Perform ::= ENUMERATED {
- not-available (1),
- resource-limitation (2),
- other (3)
- }
-
-Unfilled-Results ::= SEQUENCE {
- reason-unfilled [0] IMPLICIT Reason-Unfilled,
- locations [1] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
- }
-
-Units-Per-Medium-Type ::= SEQUENCE {
- medium [0] Supply-Medium-Type,
- no-of-units [1] INTEGER (1..9999)
- }
-
-User-Error-Report ::= CHOICE {
- already-forwarded [0] IMPLICIT Already-Forwarded,
- intermediary-problem [1] IMPLICIT Intermediary-Problem,
- security-problem [2] Security-Problem,
- unable-to-perform [3] IMPLICIT Unable-To-Perform
- }
-
-
-Will-Supply-Results ::= SEQUENCE {
- reason-will-supply [0] ENUMERATED {
- in-use-on-loan (1),
- in-process (2),
- on-order (6),
- at-bindery (8),
- on-hold (19),
- being-processed-for-supply (26),
- other (27),
- responder-specific (28),
- electronic-delivery (30)
- },
- supply-date [1] ISO-Date OPTIONAL,
- return-to-address [2] Postal-Address OPTIONAL,
- locations [3] IMPLICIT SEQUENCE OF Location-Info OPTIONAL,
- electronic-delivery-service [4] Electronic-Delivery-Service OPTIONAL
- -- if present, this must be one of the services proposed by
- -- the requester
- }
-
-EDIFACTString ::= VisibleString
- (FROM ("A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|
- "I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|
- "V"|"W"|"X"|"Y"|"Z"|"a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|
- "i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|
- "v"|"w"|"x"|"y"|"z"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|
- "9"|"0"|" "|"."|","|"-"|"("|")"|"/"|"="|"!"|"""|"%"|"&"|
- "*"|";"|"<"|">"|"'"|"+"|":"|"?"))
-
-END
-
-
+++ /dev/null
-Z39.50-extendedService-ItemOrder-ItemRequest-1 DEFINITIONS ::=
-BEGIN
-IMPORTS
- Transaction-Id,
- Service-Date-Time,
- System-Id,
- Transaction-Type,
- Delivery-Address,
- ILL-Service-Type,
- Requester-Optional-Messages-Type,
- Search-Type,
- Supply-Medium-Info-Type,
- Place-On-Hold-Type,
- Client-Id,
- Item-Id,
- Supplemental-Item-Description,
- Cost-Info-Type,
- ILL-String,
- Third-Party-Info-Type,
- Extension
-FROM ISO-10161-ILL-1;
-
-ItemRequest ::=SEQUENCE {
- protocol-version-num [0] IMPLICIT INTEGER {
- version-1 (1),
- version-2 (2)
- },
- transaction-id [1] IMPLICIT Transaction-Id OPTIONAL,
- service-date-time [2] IMPLICIT Service-Date-Time OPTIONAL,
- requester-id [3] IMPLICIT System-Id OPTIONAL,
- responder-id [4] IMPLICIT System-Id OPTIONAL,
- transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
- delivery-address [6] IMPLICIT Delivery-Address OPTIONAL,
- delivery-service Delivery-Service OPTIONAL,
- billing-address [8] IMPLICIT Delivery-Address OPTIONAL,
- iLL-service-type [9] IMPLICIT SEQUENCE SIZE (1..5) OF
- ILL-Service-Type OPTIONAL,
- responder-specific-service [10] EXTERNAL OPTIONAL,
- -- use direct reference style
- requester-optional-messages [11] IMPLICIT Requester-Optional-Messages-Type OPTIONAL,
- search-type [12] IMPLICIT Search-Type OPTIONAL,
- supply-medium-info-type [13] IMPLICIT SEQUENCE SIZE (1..7) OF
- Supply-Medium-Info-Type OPTIONAL,
- place-on-hold [14] IMPLICIT Place-On-Hold-Type DEFAULT 3,
- client-id [15] IMPLICIT Client-Id OPTIONAL,
- item-id [16] IMPLICIT Item-Id OPTIONAL,
- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
- cost-info-type [18] IMPLICIT Cost-Info-Type OPTIONAL,
- copyright-compliance [19] ILL-String OPTIONAL,
- third-party-info-type [20] IMPLICIT Third-Party-Info-Type OPTIONAL,
- retry-flag [21] IMPLICIT BOOLEAN DEFAULT FALSE,
- forward-flag [22] IMPLICIT BOOLEAN DEFAULT FALSE,
- requester-note [46] ILL-String OPTIONAL,
- forward-note [47] ILL-String OPTIONAL,
- iLL-request-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
- }
-END
-
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-yaz-config
-yaz-config.in
-*.lo
-*.la
+++ /dev/null
-## $Id: Makefile.am,v 1.29 2003-04-17 23:24:00 adam Exp $
-
-if ISTHR
-extra=libyazthread.la
-endif
-
-if ISSSL
-ssllib=libyazssl.la
-endif
-
-bin_SCRIPTS = yaz-config
-
-lib_LTLIBRARIES = libyaz.la $(extra) $(ssllib) libyazmalloc.la
-
-# If the line below is omitted the LINK variable is
-# not set in Makefile.in and it will NOT work ..
-EXTRA_libyaz_la_SOURCES=x.c
-
-YAZ_VERSION_INFO=2:0:0
-
-# No real sources
-libyaz_la_SOURCES=
-libyaz_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
-
-libyazthread_la_LIBADD=nmem.lo statserv.lo eventl.lo
-libyazthread_la_SOURCES=
-libyazthread_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
-
-libyazmalloc_la_LIBADD=xmalloc.lo
-libyazmalloc_la_SOURCES=
-libyazmalloc_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
-
-libyazssl_la_LIBADD=tcpip.lo comstack.lo
-libyazssl_la_SOURCES=
-libyazssl_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
-
-AM_CPPFLAGS= -I$(top_srcdir)/include -I$(top_srcdir)/server
-THREADED_FLAGS = @CFLAGSTHREADS@
-XMALLOC_FLAGS = -DTRACE_XMALLOC=2
-
-SSL_FLAGS= -I$(top_srcdir)/include $(SSL_DEFS) $(SSL_CFLAGS)
-
-nmem.lo: $(top_srcdir)/util/nmem.c
- $(LTCOMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/util/nmem.c
-
-nmem.o: $(top_srcdir)/util/nmem.c
- $(COMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/util/nmem.c
-
-statserv.lo: $(top_srcdir)/server/statserv.c
- $(LTCOMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/server/statserv.c
-
-statserv.o: $(top_srcdir)/server/statserv.c
- $(COMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/server/statserv.c
-
-eventl.lo: $(top_srcdir)/server/eventl.c
- $(LTCOMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/server/eventl.c
-
-eventl.o: $(top_srcdir)/server/eventl.c
- $(COMPILE) $(THREADED_FLAGS) -c $(top_srcdir)/server/eventl.c
-
-xmalloc.lo: $(top_srcdir)/util/xmalloc.c
- $(LTCOMPILE) $(XMALLOC_FLAGS) -c $(top_srcdir)/util/xmalloc.c
-
-xmalloc.o: $(top_srcdir)/util/xmalloc.c
- $(COMPILE) $(XMALLOC_FLAGS) -c $(top_srcdir)/util/xmalloc.c
-
-comstack.lo: $(top_srcdir)/comstack/comstack.c
- $(LTCOMPILE) $(SSL_FLAGS) -c $(top_srcdir)/comstack/comstack.c
-
-comstack.o: $(top_srcdir)/comstack/comstack.c
- $(COMPILE) $(SSL_FLAGS) -c $(top_srcdir)/comstack/comstack.c
-
-tcpip.lo: $(top_srcdir)/comstack/tcpip.c
- $(LTCOMPILE) $(SSL_FLAGS) -c $(top_srcdir)/comstack/tcpip.c
-
-tcpip.o: $(top_srcdir)/comstack/tcpip.c
- $(COMPILE) $(SSL_FLAGS) -c $(top_srcdir)/comstack/tcpip.c
-
-libyaz_la_LIBADD=../odr/libodr.la \
- ../comstack/libcomstack.la ../server/libserver.la \
- ../util/libutil.la ../ccl/libccl.la ../cql/libcql.la ../zutil/libzutil.la \
- ../ill/libill.la ../z39.50/libz39.50.la
-
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libodr.la
-*.lo
-tstodrcodec.c
-tstodrcodec.h
+++ /dev/null
-## $Id: Makefile.am,v 1.11 2003-05-27 21:42:45 adam Exp $
-
-noinst_LTLIBRARIES = libodr.la
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-TESTS = tstodr
-
-EXTRA_PROGRAMS = tstodr
-
-EXTRA_DIST = tstodrcodec.c tstodrcodec.h tstodr.asn
-
-tstodr_LDADD = libodr.la ../util/libutil.la
-tstodr_SOURCES = tstodrcodec.c tstodrcodec.h tstodr.c
-
-# Rule for generating codecs for our small ASN.1 spec
-tstodrcodec.c tstodrcodec.h: $(srcdir)/tstodr.asn $(top_srcdir)/util/yaz-asncomp
- cd $(srcdir); $(top_srcdir)/util/yaz-asncomp tstodr.asn
-
-libodr_la_SOURCES = odr_bool.c ber_bool.c ber_len.c ber_tag.c odr_util.c \
- odr_null.c ber_null.c odr_int.c ber_int.c odr_tag.c odr_cons.c \
- odr_seq.c odr_oct.c ber_oct.c odr_bit.c ber_bit.c odr_oid.c \
- ber_oid.c odr_use.c odr_choice.c odr_any.c ber_any.c odr.c odr_mem.c \
- dumpber.c odr_enum.c odr-priv.h
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: ber_any.c,v 1.27 2003-10-21 09:30:32 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <assert.h>
-#include "odr-priv.h"
-
-int ber_any(ODR o, Odr_any **p)
-{
- int res;
-
- switch (o->direction)
- {
- case ODR_DECODE:
- if ((res = completeBER(o->bp, odr_max(o))) <= 0) /* FIX THIS */
- {
- odr_seterror(o, OPROTO, 2);
- return 0;
- }
- (*p)->buf = (unsigned char *)odr_malloc(o, res);
- memcpy((*p)->buf, o->bp, res);
- (*p)->len = (*p)->size = res;
- o->bp += res;
- return 1;
- case ODR_ENCODE:
- if (odr_write(o, (*p)->buf, (*p)->len) < 0)
- return 0;
- return 1;
- default: odr_seterror(o, OOTHER, 3); return 0;
- }
-}
-
-#define BER_ANY_DEBUG 0
-
-/*
- * Return length of BER-package or 0.
- */
-int completeBER_n(const unsigned char *buf, int len, int level)
-{
- int res, ll, zclass, tag, cons;
- const unsigned char *b = buf;
- int bad = 0;
-
- if (len > 5000000 || level > 1000)
- {
- bad = 1;
-#if BER_ANY_DEBUG
- yaz_log(LOG_LOG, "completeBER lev=%d len=%d", level, len);
-#endif
- if (level > 1000)
- return -2;
- }
- if (len < 2)
- return 0;
- if (!buf[0] && !buf[1])
- return -2;
- if ((res = ber_dectag(b, &zclass, &tag, &cons, len)) <= 0)
- return 0;
-#if 0
-/* removed, since ber_dectag never reads that far .. */
- if (res > len)
- return 0;
-#endif
- b += res;
- len -= res;
- assert (len >= 0);
- res = ber_declen(b, &ll, len);
- if (res == -2)
- {
-#if BER_ANY_DEBUG
- if (bad)
- yaz_log(LOG_LOG, "<<<<<<<<< return1 lev=%d res=%d", level, res);
-#endif
- return -1; /* error */
- }
- if (res == -1)
- {
-#if BER_ANY_DEBUG
- if (bad)
- yaz_log(LOG_LOG, "<<<<<<<<< return3 lev=%d res=-1", level);
-#endif
- return 0; /* incomplete length */
- }
- if (ll > 5000000)
- {
-#if BER_ANY_DEBUG
- if (bad)
- yaz_log(LOG_LOG, "<<<<<<<<< return2 lev=%d len=%d res=%d ll=%d",
- level, len, res, ll);
-#endif
- return -1; /* error */
- }
-#if 0
-/* no longer necessary, since ber_declen never reads that far (returns -1) */
- if (res > len)
- {
- if (bad)
- yaz_log(LOG_LOG, "<<<<<<<<< return4 lev=%d res=%d len=%d",
- level, res, len);
- return 0;
- }
-#endif
- b += res;
- len -= res;
- if (ll >= 0)
- { /* definite length */
-#if BER_ANY_DEBUG
- if (bad && len < ll)
- yaz_log(LOG_LOG, "<<<<<<<<< return5 lev=%d len=%d ll=%d",
- level, len, ll);
-#endif
- return (len >= ll ? ll + (b-buf) : 0);
- }
- /* indefinite length */
- if (!cons)
- { /* if primitive, it's an error */
-#if BER_ANY_DEBUG
- yaz_log(LOG_LOG, "<<<<<<<<< return6 lev=%d ll=%d len=%d res=%d",
- level, ll, len, res);
-#endif
- return -1; /* error */
- }
- /* constructed - cycle through children */
- while (len >= 2)
- {
- if (b[0] == 0 && b[1] == 0)
- break;
- if (!(res = completeBER_n(b, len, level+1)))
- return 0;
- if (res == -1)
- return -1;
- b += res;
- len -= res;
- }
- if (len < 2)
- return 0;
- return (b - buf) + 2;
-}
-
-int completeBER(const unsigned char *buf, int len)
-{
- int res = completeBER_n(buf, len, 0);
- if (res < 0)
- return len;
- return res;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_bit.c,v 1.16 2003-05-20 19:50:12 adam Exp $
- *
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int ber_bitstring(ODR o, Odr_bitmask *p, int cons)
-{
- int res, len;
- const unsigned char *base;
-
- switch (o->direction)
- {
- case ODR_DECODE:
- if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
- {
- odr_seterror(o, OPROTO, 4);
- return 0;
- }
- o->bp += res;
- if (cons) /* fetch component strings */
- {
- base = o->bp;
- while (odp_more_chunks(o, base, len))
- if (!odr_bitstring(o, &p, 0, 0))
- return 0;
- return 1;
- }
- /* primitive bitstring */
- if (len < 0)
- {
- odr_seterror(o, OOTHER, 5);
- return 0;
- }
- if (len == 0)
- return 1;
- if (len - 1 > ODR_BITMASK_SIZE)
- {
- odr_seterror(o, OOTHER, 6);
- return 0;
- }
- if (len > odr_max(o))
- {
- odr_seterror(o, OOTHER, 7);
- return 0;
- }
- o->bp++; /* silently ignore the unused-bits field */
- len--;
- memcpy(p->bits + p->top + 1, o->bp, len);
- p->top += len;
- o->bp += len;
- return 1;
- case ODR_ENCODE:
- if ((res = ber_enclen(o, p->top + 2, 5, 0)) < 0)
- return 0;
- if (odr_putc(o, 0) < 0) /* no unused bits here */
- return 0;
- if (p->top < 0)
- return 1;
- if (odr_write(o, p->bits, p->top + 1) < 0)
- return 0;
- return 1;
- case ODR_PRINT:
- return 1;
- default:
- odr_seterror(o, OOTHER, 8);
- return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_bool.c,v 1.14 2003-03-11 11:03:31 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include "odr-priv.h"
-
-int ber_boolean(ODR o, int *val)
-{
- int res, len;
-
- switch (o->direction)
- {
- case ODR_ENCODE:
- if (ber_enclen(o, 1, 1, 1) != 1)
- return 0;
- if (odr_putc(o, *val) < 0)
- return 0;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[val=%d]\n", *val);
-#endif
- return 1;
- case ODR_DECODE:
- if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
- {
- odr_seterror(o, OPROTO, 9);
- return 0;
- }
- o->bp+= res;
- if (len != 1 || odr_max(o) < len)
- {
- odr_seterror(o, OPROTO, 10);
- return 0;
- }
- *val = *o->bp;
- o->bp++;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[val=%d]\n", *val);
-#endif
- return 1;
- case ODR_PRINT:
- return 1;
- default: odr_seterror(o, OOTHER, 11); return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_int.c,v 1.22 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#ifdef WIN32
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <netinet/in.h>
-#endif
-
-#include "odr-priv.h"
-
-static int ber_encinteger(ODR o, int val);
-static int ber_decinteger(const unsigned char *buf, int *val, int max);
-
-int ber_integer(ODR o, int *val)
-{
- int res;
-
- switch (o->direction)
- {
- case ODR_DECODE:
- if ((res = ber_decinteger(o->bp, val, odr_max(o))) <= 0)
- {
- odr_seterror(o, OPROTO, 50);
- return 0;
- }
- o->bp += res;
- return 1;
- case ODR_ENCODE:
- if ((res = ber_encinteger(o, *val)) < 0)
- return 0;
- return 1;
- case ODR_PRINT: return 1;
- default: odr_seterror(o, OOTHER, 51); return 0;
- }
-}
-
-/*
- * Returns: number of bytes written or -1 for error (out of bounds).
- */
-int ber_encinteger(ODR o, int val)
-{
- int a, len;
- union { int i; unsigned char c[sizeof(int)]; } tmp;
-
- tmp.i = htonl(val); /* ensure that that we're big-endian */
- for (a = 0; a < (int) sizeof(int) - 1; a++) /* skip superfluous octets */
- if (!((tmp.c[a] == 0 && !(tmp.c[a+1] & 0X80)) ||
- (tmp.c[a] == 0XFF && (tmp.c[a+1] & 0X80))))
- break;
- len = sizeof(int) - a;
- if (ber_enclen(o, len, 1, 1) != 1)
- return -1;
- if (odr_write(o, (unsigned char*) tmp.c + a, len) < 0)
- return -1;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[val=%d]", val);
-#endif
- return 0;
-}
-
-/*
- * Returns: Number of bytes read or 0 if no match, -1 if error.
- */
-int ber_decinteger(const unsigned char *buf, int *val, int max)
-{
- const unsigned char *b = buf;
- unsigned char fill;
- int res, len, remains;
- union { int i; unsigned char c[sizeof(int)]; } tmp;
-
- if ((res = ber_declen(b, &len, max)) < 0)
- return -1;
- if (len+res > max || len < 0) /* out of bounds or indefinite encoding */
- return -1;
- if (len > (int) sizeof(int)) /* let's be reasonable, here */
- return -1;
- b+= res;
-
- remains = sizeof(int) - len;
- memcpy(tmp.c + remains, b, len);
- if (*b & 0X80)
- fill = 0XFF;
- else
- fill = 0X00;
- memset(tmp.c, fill, remains);
- *val = ntohl(tmp.i);
-
- b += len;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[val=%d]", *val);
-#endif
- return b - buf;
-}
+++ /dev/null
-/*
- * Copyright (C) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_len.c,v 1.13 2003-10-20 13:44:05 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include "odr-priv.h"
-
-/*
- * Encode BER length octets. If exact, lenlen is the exact desired
- * encoding size, else, lenlen is the max available space. Len < 0 =
- * Indefinite encoding.
- * Returns: >0 success, number of bytes encoded.
- * Returns: =0 success, indefinite start-marker set. 1 byte encoded.
- * Returns: -1 failure, out of bounds.
- */
-int ber_enclen(ODR o, int len, int lenlen, int exact)
-{
- unsigned char octs[sizeof(int)];
- int n = 0;
- int lenpos, end;
-
-#ifdef ODR_DEBUG
- fprintf(stderr, "[len=%d]", len);
-#endif
- if (len < 0) /* Indefinite */
- {
- if (odr_putc(o, 0x80) < 0)
- return 0;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[indefinite]");
-#endif
- return 0;
- }
- if (len <= 127 && (lenlen == 1 || !exact)) /* definite short form */
- {
- if (odr_putc(o, (unsigned char) len) < 0)
- return 0;
- return 1;
- }
- if (lenlen == 1)
- {
- if (odr_putc(o, 0x80) < 0)
- return 0;
- return 0;
- }
- /* definite long form */
- do
- {
- octs[n++] = len;
- len >>= 8;
- }
- while (len);
- if (n >= lenlen)
- return -1;
- lenpos = odr_tell(o); /* remember length-of-length position */
- if (odr_putc(o, 0) < 0) /* dummy */
- return 0;
- if (exact)
- while (n < --lenlen) /* pad length octets */
- if (odr_putc(o, 0) < 0)
- return 0;
- while (n--)
- if (odr_putc(o, octs[n]) < 0)
- return 0;
- /* set length of length */
- end = odr_tell(o);
- odr_seek(o, ODR_S_SET, lenpos);
- if (odr_putc(o, (end - lenpos - 1) | 0X80) < 0)
- return 0;
- odr_seek(o, ODR_S_END, 0);
- return odr_tell(o) - lenpos;
-}
-
-/*
- * Decode BER length octets. Returns
- * > 0 : number of bytes read
- * -1 : not enough room to read bytes within max bytes
- * -2 : other error
- *
- * After return:
- * len = -1 indefinite length.
- * len >= 0 definite length
- */
-int ber_declen(const unsigned char *buf, int *len, int max)
-{
- const unsigned char *b = buf;
- int n;
-
- if (max < 1)
- return -1;
- if (*b == 0X80) /* Indefinite */
- {
- *len = -1;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[len=%d]", *len);
-#endif
- return 1;
- }
- if (!(*b & 0X80)) /* Definite short form */
- {
- *len = (int) *b;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[len=%d]", *len);
-#endif
- return 1;
- }
- if (*b == 0XFF) /* reserved value */
- return -2;
- /* indefinite long form */
- n = *b & 0X7F;
- if (n >= max)
- return -1;
- *len = 0;
- b++;
- while (--n >= 0)
- {
- *len <<= 8;
- *len |= *(b++);
- }
- if (*len < 0)
- return -2;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[len=%d]", *len);
-#endif
- return (b - buf);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_null.c,v 1.14 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-/*
- * BER-en/decoder for NULL type.
- */
-int ber_null(ODR o)
-{
- switch (o->direction)
- {
- case ODR_ENCODE:
- if (odr_putc(o, 0X00) < 0)
- return 0;
-#ifdef ODR_DEBUG
- fprintf(stderr, "[NULL]\n");
-#endif
- return 1;
- case ODR_DECODE:
- if (odr_max(o) < 1)
- {
- odr_seterror(o, OPROTO, 39);
- return 0;
- }
- if (*(o->bp++) != 0X00)
- {
- odr_seterror(o, OPROTO, 12);
- return 0;
- }
-#ifdef ODR_DEBUG
- fprintf(stderr, "[NULL]\n");
-#endif
- return 1;
- case ODR_PRINT: return 1;
- default: odr_seterror(o, OOTHER, 13); return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_oct.c,v 1.21 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int ber_octetstring(ODR o, Odr_oct *p, int cons)
-{
- int res, len;
- const unsigned char *base;
- unsigned char *c;
-
- switch (o->direction)
- {
- case ODR_DECODE:
- if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
- {
- odr_seterror(o, OPROTO, 14);
- return 0;
- }
- o->bp += res;
- if (cons) /* fetch component strings */
- {
- base = o->bp;
- while (odp_more_chunks(o, base, len))
- if (!odr_octetstring(o, &p, 0, 0))
- return 0;
- return 1;
- }
- /* primitive octetstring */
- if (len < 0)
- {
- odr_seterror(o, OOTHER, 15);
- return 0;
- }
- if (len > odr_max(o))
- {
- odr_seterror(o, OOTHER, 16);
- return 0;
- }
- if (len + 1 > p->size - p->len)
- {
- c = (unsigned char *)odr_malloc(o, p->size += len + 1);
- if (p->len)
- memcpy(c, p->buf, p->len);
- p->buf = c;
- }
- if (len)
- memcpy(p->buf + p->len, o->bp, len);
- p->len += len;
- o->bp += len;
- /* the final null is really not part of the buffer, but */
- /* it helps somes applications that assumes C strings */
- if (len)
- p->buf[p->len] = '\0';
- return 1;
- case ODR_ENCODE:
- if ((res = ber_enclen(o, p->len, 5, 0)) < 0)
- return 0;
- if (p->len == 0)
- return 1;
- if (odr_write(o, p->buf, p->len) < 0)
- return 0;
- return 1;
- case ODR_PRINT: return 1;
- default: odr_seterror(o, OOTHER, 17); return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_oid.c,v 1.15 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int ber_oidc(ODR o, Odr_oid *p)
-{
- int len, lenp, end;
- int pos, n, res, id;
- unsigned char octs[8];
-
- switch (o->direction)
- {
- case ODR_DECODE:
- if ((res = ber_declen(o->bp, &len, odr_max(o))) < 1)
- {
- odr_seterror(o, OPROTO, 18);
- return 0;
- }
- if (len < 0)
- {
- odr_seterror(o, OPROTO, 19);
- return 0;
- }
- o->bp += res;
- if (len == 0)
- {
- *p = -1;
- return 1;
- }
- if (len > odr_max(o))
- {
- odr_seterror(o, OPROTO, 20);
- return 0;
- }
- p[0] = *o->bp / 40;
- if (p[0] > 2)
- p[0] = 2;
- p[1] = *o->bp - p[0] * 40;
- o->bp++;
- pos = 2;
- len--;
- while (len)
- {
- p[pos] = 0;
- do
- {
- if (!len)
- {
- odr_seterror(o, OPROTO, 21);
- return 0;
- }
- p[pos] <<= 7;
- p[pos] |= *o->bp & 0X7F;
- len--;
- }
- while (*(o->bp++) & 0X80);
- pos++;
- }
- p[pos] = -1;
- return 1;
- case ODR_ENCODE:
- /* we'll allow ourselves the quiet luxury of only doing encodings
- shorter than 127 */
- lenp = odr_tell(o);
- if (odr_putc(o, 0) < 0) /* dummy */
- return 0;
- if (p[0] < 0 && p[1] <= 0)
- {
- odr_seterror(o, ODATA, 23);
- return 0;
- }
- for (pos = 1; p[pos] >= 0; pos++)
- {
- id = pos > 1 ? p[pos] : p[0] * 40 + p[1];
- n = 0;
- do
- {
- octs[n++] = id & 0X7F;
- id >>= 7;
- }
- while (id);
- while (n--)
- {
- unsigned char p;
-
- p = octs[n] | ((n > 0) << 7);
- if (odr_putc(o, p) < 0)
- return 0;
- }
- }
- end = odr_tell(o);
- odr_seek(o, ODR_S_SET, lenp);
- if (ber_enclen(o, (end - lenp) - 1, 1, 1) != 1)
- {
- odr_seterror(o, OOTHER, 52);
- return 0;
- }
- odr_seek(o, ODR_S_END, 0);
- return 1;
- default:
- odr_seterror(o, OOTHER, 22);
- return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: ber_tag.c,v 1.27 2003-05-24 19:20:14 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include "odr-priv.h"
-
-/* ber_tag
- * On encoding:
- * if p: write tag. return 1 (success) or -1 (error).
- * if !p: return 0.
- * On decoding:
- * if tag && zclass match up, advance pointer and return 1. set cons.
- * else leave pointer unchanged. Return 0.
- *
- * Should perhaps be odr_tag?
- */
-int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt,
- const char *name)
-{
- struct Odr_ber_tag *odr_ber_tag = &o->op->odr_ber_tag;
- int rd;
- char **pp = (char **)p;
-
- if (o->direction == ODR_DECODE)
- *pp = 0;
- o->t_class = -1;
- if (o->op->stackp < 0)
- {
- odr_seek(o, ODR_S_SET, 0);
- o->top = 0;
- o->bp = o->buf;
- odr_ber_tag->lclass = -1;
- }
- switch (o->direction)
- {
- case ODR_ENCODE:
- if (!*pp)
- {
- if (!opt)
- {
- odr_seterror(o, OREQUIRED, 24);
- odr_setelement (o, name);
- }
- return 0;
- }
- if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0)
- return -1;
-#ifdef ODR_DEBUG
- fprintf(stderr, "\n[class=%d,tag=%d,cons=%d,stackp=%d]", zclass, tag,
- *constructed, o->stackp);
-#endif
- return 1;
-
- case ODR_DECODE:
- if (o->op->stackp > -1 && !odr_constructed_more(o))
- {
- if (!opt)
- {
- odr_seterror(o, OREQUIRED, 25);
- odr_setelement(o, name);
- }
- return 0;
- }
- if (odr_ber_tag->lclass < 0)
- {
- if ((odr_ber_tag->br =
- ber_dectag(o->bp, &odr_ber_tag->lclass,
- &odr_ber_tag->ltag, &odr_ber_tag->lcons,
- odr_max(o))) <= 0)
- {
- odr_seterror(o, OPROTO, 26);
- odr_setelement(o, name);
- return 0;
- }
-#ifdef ODR_DEBUG
- fprintf(stderr,
- "\n[class=%d,tag=%d,cons=%d,stackp=%d]",
- odr_ber_tag->lclass, odr_ber_tag->ltag,
- odr_ber_tag->lcons, o->stackp);
-#endif
- }
- if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag)
- {
- o->bp += odr_ber_tag->br;
- *constructed = odr_ber_tag->lcons;
- odr_ber_tag->lclass = -1;
- return 1;
- }
- else
- {
- if (!opt)
- {
- odr_seterror(o, OREQUIRED, 27);
- odr_setelement(o, name);
- }
- return 0;
- }
- case ODR_PRINT:
- if (!*pp && !opt)
- {
- odr_seterror(o,OREQUIRED, 28);
- odr_setelement(o, name);
- }
- return *pp != 0;
- default:
- odr_seterror(o, OOTHER, 29);
- odr_setelement(o, name);
- return 0;
- }
-}
-
-/* ber_enctag
- * BER-encode a zclass/tag/constructed package (identifier octets). Return
- * number of bytes encoded, or -1 if out of bounds.
- */
-int ber_enctag(ODR o, int zclass, int tag, int constructed)
-{
- int cons = (constructed ? 1 : 0), n = 0;
- unsigned char octs[sizeof(int)], b;
-
- b = (zclass << 6) & 0XC0;
- b |= (cons << 5) & 0X20;
- if (tag <= 30)
- {
- b |= tag & 0X1F;
- if (odr_putc(o, b) < 0)
- return -1;
- return 1;
- }
- else
- {
- b |= 0X1F;
- if (odr_putc(o, b) < 0)
- return -1;
- do
- {
- octs[n++] = tag & 0X7F;
- tag >>= 7;
- }
- while (tag);
- while (n--)
- {
- unsigned char oo;
-
- oo = octs[n] | ((n > 0) << 7);
- if (odr_putc(o, oo) < 0)
- return -1;
- }
- return 0;
- }
-}
-
-/* ber_dectag
- * Decode BER identifier octets. Return number of bytes read or -1 for error.
- */
-int ber_dectag(const unsigned char *b, int *zclass, int *tag,
- int *constructed, int max)
-{
- int l = 1;
-
- if (l > max)
- return -1;
-
- *zclass = *b >> 6;
- *constructed = (*b >> 5) & 0X01;
- if ((*tag = *b & 0x1F) <= 30)
- return 1;
- *tag = 0;
- do
- {
- if (l >= max)
- return -1;
- *tag <<= 7;
- *tag |= b[l] & 0X7F;
- }
- while (b[l++] & 0X80);
- return l;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: dumpber.c,v 1.16 2003-04-24 12:48:47 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include "odr-priv.h"
-
-static int do_dumpBER(FILE *f, const char *buf, int len, int level, int offset)
-{
- int res, ll, zclass, tag, cons, lenlen, taglen;
- const char *b = buf, *bp = buf;
-
- if (!len)
- return 0;
- if (!buf[0] && !buf[1])
- return 0;
- if ((res = ber_dectag((unsigned char*)b, &zclass, &tag, &cons, len)) <= 0)
- return 0;
- if (res > len)
- {
- fprintf(stderr, "Unexpected end of buffer\n");
- return 0;
- }
- fprintf(f, "%5d: %*s", offset, level * 4, "");
- if (zclass == ODR_UNIVERSAL)
- {
- static char *nl[] =
- {
- "[Univ 0]", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING",
- "NULL", "OID", "OBJECT DESCIPTOR", "EXTERNAL", "REAL",
- "ENUM", "[UNIV 11]", "[UNIV 12]", "[UNIV 13]", "[UNIV 14]",
- "[UNIV 15]", "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING",
- "[UNIV 20]", "[UNIV 21]", "[UNIV 22]", "[UNIV 23]", "[UNIV 24]",
- "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "[UNIV 28]"
- };
-
- if (tag >= 0 && tag < 28)
- fprintf(f, "%s", nl[tag]);
- else
- fprintf(f, "[UNIV %d]", tag);
- }
- else if (zclass == ODR_CONTEXT)
- fprintf(f, "[%d]", tag);
- else
- fprintf(f, "[%d:%d]", zclass, tag);
- b += res;
- taglen = res;
- len -= res;
- bp = b;
- if ((res = ber_declen((unsigned char*)b, &ll, len)) <= 0)
- {
- fprintf(f, "\n%*sBad length\n", level*4+5, "");
- return 0;
- }
- lenlen = res;
- b += res;
- len -= res;
- if (ll >= 0)
- fprintf(f, " len=%d", ll);
- else
- fprintf(f, " len=?");
- fprintf(f, " tl=%d, ll=%d cons=%d\n", taglen, lenlen, cons);
- if (!cons)
- {
- if (ll < 0 || ll > len)
- {
- fprintf(f, "%*sBad length on primitive type. ll=%d len=%d\n",
- level*4+5, "", ll, len);
- return 0;
- }
- return ll + (b - buf);
- }
- if (ll >= 0)
- {
- if (ll > len)
- {
- fprintf(f, "%*sBad length of constructed type ll=%d len=%d.\n",
- level*4+5, "", ll, len);
- return 0;
- }
- len = ll;
- }
- /* constructed - cycle through children */
- while ((ll == -1 && len >= 2) || (ll >= 0 && len))
- {
- if (ll == -1 && *b == 0 && *(b + 1) == 0)
- break;
- if (!(res = do_dumpBER(f, b, len, level + 1, offset + (b - buf))))
- {
- fprintf(f, "%*sDump of content element failed.\n", level*4+5, "");
- return 0;
- }
- b += res;
- len -= res;
- if (len < 0)
- {
- fprintf(f, "%*sBad length\n", level*4+5, "");
- return 0;
- }
- }
- if (ll == -1)
- {
- if (len < 2)
- {
- fprintf(f, "%*sBuffer too short in indefinite length.\n",
- level*4+5, "");
- return 0;
- }
- return (b - buf) + 2;
- }
- return b - buf;
-}
-
-int odr_dumpBER(FILE *f, const char *buf, int len)
-{
- return do_dumpBER(f, buf, len, 0, 0);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation, in whole or in part, for any purpose, is hereby granted,
- * provided that:
- *
- * 1. This copyright and permission notice appear in all copies of the
- * software and its documentation. Notices of copyright or attribution
- * which appear at the beginning of any file must remain unchanged.
- *
- * 2. The name of Index Data or the individual authors may not be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
- * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * $Id: odr-priv.h,v 1.6 2003-05-24 19:20:14 adam Exp $
- */
-
-#ifndef ODR_PRIV_H
-
-#define ODR_PRIV_H
-
-#include <yaz/odr.h>
-#include <yaz/yaz-util.h>
-
-struct Odr_ber_tag { /* used to be statics in ber_tag... */
- int lclass;
- int ltag;
- int br;
- int lcons;
-};
-
-#define odr_max(o) ((o)->size - ((o)->bp - (o)->buf))
-#define odr_offset(o) ((o)->bp - (o)->buf)
-
-struct Odr_private {
- /* stack for constructed types */
-#define ODR_MAX_STACK 50
- int stackp; /* top of stack (-1 == initial state) */
- odr_constack stack[ODR_MAX_STACK];
-
- struct Odr_ber_tag odr_ber_tag;
- yaz_iconv_t iconv_handle;
- int error_id;
- char element[80];
-};
-
-/* Private macro.
- * write a single character at the current position - grow buffer if
- * necessary.
- * (no, we're not usually this anal about our macros, but this baby is
- * next to unreadable without some indentation :)
- */
-#define odr_putc(o, c) \
-( \
- ( \
- (o)->pos < (o)->size ? \
- ( \
- (o)->buf[(o)->pos++] = (c), \
- 0 \
- ) : \
- ( \
- odr_grow_block((o), 1) == 0 ? \
- ( \
- (o)->buf[(o)->pos++] = (c), \
- 0 \
- ) : \
- ( \
- (o)->error = OSPACE, \
- -1 \
- ) \
- ) \
- ) == 0 ? \
- ( \
- (o)->pos > (o)->top ? \
- ( \
- (o)->top = (o)->pos, \
- 0 \
- ) : \
- 0 \
- ) : \
- -1 \
-)
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: odr.c,v 1.46 2003-10-16 10:37:06 adam Exp $
- *
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <yaz/xmalloc.h>
-#include "odr-priv.h"
-
-Odr_null *ODR_NULLVAL = (Odr_null *) "NULL"; /* the presence of a null value */
-
-Odr_null *odr_nullval (void)
-{
- return ODR_NULLVAL;
-}
-
-char *odr_errlist[] =
-{
- "No (unknown) error",
- "Memory allocation failed",
- "System error",
- "No space in buffer",
- "Required data element missing",
- "Unexpected tag",
- "Other error",
- "Protocol error",
- "Malformed data",
- "Stack overflow",
- "Length of constructed type different from sum of members",
- "Overflow writing definite length of constructed type",
- "Bad HTTP Request"
-};
-
-char *odr_errmsg(int n)
-{
- return odr_errlist[n];
-}
-
-void odr_perror(ODR o, const char *message)
-{
- const char *e = odr_getelement(o);
- int err, x;
-
- err = odr_geterrorx(o, &x);
- fprintf(stderr, "%s: %s (code %d:%d)", message, odr_errlist[err], err, x);
- if (e && *e)
- fprintf (stderr, " element %s", e);
- fprintf(stderr, "\n");
-}
-
-int odr_geterror(ODR o)
-{
- return o->error;
-}
-
-int odr_geterrorx(ODR o, int *x)
-{
- if (x)
- *x = o->op->error_id;
- return o->error;
-}
-
-char *odr_getelement(ODR o)
-{
- return o->op->element;
-}
-
-void odr_seterror(ODR o, int error, int id)
-{
- o->error = error;
- o->op->error_id = id;
- o->op->element[0] = '\0';
-}
-
-void odr_setelement(ODR o, const char *element)
-{
- if (element)
- {
- strncpy(o->op->element, element, sizeof(o->op->element)-1);
- o->op->element[sizeof(o->op->element)-1] = '\0';
- }
-}
-
-void odr_setprint(ODR o, FILE *file)
-{
- o->print = file;
-}
-
-int odr_set_charset(ODR o, const char *to, const char *from)
-{
- if (o->op->iconv_handle)
- yaz_iconv_close (o->op->iconv_handle);
- o->op->iconv_handle = 0;
- if (to && from)
- {
- o->op->iconv_handle = yaz_iconv_open (to, from);
- if (o->op->iconv_handle == 0)
- return -1;
- }
- return 0;
-}
-
-#include <yaz/log.h>
-
-ODR odr_createmem(int direction)
-{
- ODR r;
-
- if (!(r = (ODR)xmalloc(sizeof(*r))))
- return 0;
- r->direction = direction;
- r->print = stderr;
- r->buf = 0;
- r->size = r->pos = r->top = 0;
- r->can_grow = 1;
- r->mem = nmem_create();
- r->enable_bias = 1;
- r->op = (struct Odr_private *) xmalloc (sizeof(*r->op));
- r->op->odr_ber_tag.lclass = -1;
- r->op->iconv_handle = 0;
- odr_reset(r);
- yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
- return r;
-}
-
-void odr_reset(ODR o)
-{
- odr_seterror(o, ONONE, 0);
- o->bp = o->buf;
- odr_seek(o, ODR_S_SET, 0);
- o->top = 0;
- o->t_class = -1;
- o->t_tag = -1;
- o->indent = 0;
- o->op->stackp = -1;
- nmem_reset(o->mem);
- o->choice_bias = -1;
- o->lenlen = 1;
- if (o->op->iconv_handle != 0)
- yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
- yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
-}
-
-void odr_destroy(ODR o)
-{
- nmem_destroy(o->mem);
- if (o->buf && o->can_grow)
- xfree(o->buf);
- if (o->print && o->print != stderr)
- fclose(o->print);
- if (o->op->iconv_handle != 0)
- yaz_iconv_close (o->op->iconv_handle);
- xfree(o->op);
- xfree(o);
- yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
-}
-
-void odr_setbuf(ODR o, char *buf, int len, int can_grow)
-{
- o->bp = (unsigned char *) buf;
-
- o->buf = (unsigned char *) buf;
- o->can_grow = can_grow;
- o->top = o->pos = 0;
- o->size = len;
-}
-
-char *odr_getbuf(ODR o, int *len, int *size)
-{
- *len = o->top;
- if (size)
- *size = o->size;
- return (char*) o->buf;
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_any.c,v 1.14 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-/*
- * This is a catch-all type. It stuffs a random ostring (assumed to be properly
- * encoded) into the stream, or reads a full data element. Implicit tagging
- * does not work, and neither does the optional flag, unless the element
- * is the last in a sequence.
- */
-int odr_any(ODR o, Odr_any **p, int opt, const char *name)
-{
- if (o->error)
- return 0;
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "ANY (len=%d)\n", (*p)->len);
- return 1;
- }
- if (o->direction == ODR_DECODE)
- *p = (Odr_oct *)odr_malloc(o, sizeof(**p));
- if (ber_any(o, p))
- return 1;
- *p = 0;
- return odr_missing(o, opt, name);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_bit.c,v 1.18 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include "odr-priv.h"
-
-/*
- * Top level bitstring string en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_bitstring(ODR o, Odr_bitmask **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_BITSTRING;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "BITSTRING(len=%d)\n",(*p)->top + 1);
- return 1;
- }
- if (o->direction == ODR_DECODE)
- {
- *p = (Odr_bitmask *)odr_malloc(o, sizeof(Odr_bitmask));
- memset((*p)->bits, 0, ODR_BITMASK_SIZE);
- (*p)->top = -1;
- }
-#if 0
- /* ignoring the cons helps with at least one target.
- * http://bugzilla.indexdata.dk/cgi-bin/bugzilla/show_bug.cgi?id=24
- */
- return ber_bitstring(o, *p, 0);
-#else
- return ber_bitstring(o, *p, cons);
-#endif
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_bool.c,v 1.15 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include "odr-priv.h"
-
-/*
- * Top level boolean en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_bool(ODR o, int **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_BOOLEAN;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "%s\n", (**p ? "TRUE" : "FALSE"));
- return 1;
- }
- if (cons)
- return 0;
- if (o->direction == ODR_DECODE)
- *p = (int *)odr_malloc(o, sizeof(int));
- return ber_boolean(o, *p);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_choice.c,v 1.22 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
- const char *name)
-{
- int i, cl = -1, tg, cn, *which = (int *)whichp, bias = o->choice_bias;
-
- if (o->error)
- return 0;
- if (o->direction != ODR_DECODE && !*(char**)p)
- return 0;
-
- if (o->direction == ODR_DECODE)
- {
- *which = -1;
- *(char**)p = 0;
- }
- o->choice_bias = -1;
-
- if (o->direction == ODR_PRINT)
- {
- if (name)
- {
- odr_prname(o, name);
- fprintf (o->print, "choice\n");
- }
- }
- for (i = 0; arm[i].fun; i++)
- {
- if (o->direction == ODR_DECODE)
- {
- if (bias >= 0 && bias != arm[i].which)
- continue;
- *which = arm[i].which;
- }
- else if (*which != arm[i].which)
- continue;
-
- if (arm[i].tagmode != ODR_NONE)
- {
- if (o->direction == ODR_DECODE && cl < 0)
- {
- if (o->op->stackp > -1 && !odr_constructed_more(o))
- return 0;
- if (ber_dectag(o->bp, &cl, &tg, &cn, odr_max(o)) <= 0)
- return 0;
- }
- else if (o->direction != ODR_DECODE)
- {
- cl = arm[i].zclass;
- tg = arm[i].tag;
- }
- if (tg == arm[i].tag && cl == arm[i].zclass)
- {
- if (arm[i].tagmode == ODR_IMPLICIT)
- {
- odr_implicit_settag(o, cl, tg);
- return (*arm[i].fun)(o, (char **)p, 0, arm[i].name);
- }
- /* explicit */
- if (!odr_constructed_begin(o, p, cl, tg, 0))
- return 0;
- return (*arm[i].fun)(o, (char **)p, 0, arm[i].name) &&
- odr_constructed_end(o);
- }
- }
- else /* no tagging. Have to poll type */
- {
- if ((*arm[i].fun)(o, (char **)p, 1, arm[i].name) && *(char**)p)
- return 1;
- }
- }
- return 0;
-}
-
-void odr_choice_bias(ODR o, int what)
-{
- if (o->enable_bias)
- o->choice_bias = what;
-}
-
-void odr_choice_enable_bias (ODR o, int mode)
-{
- o->enable_bias = mode;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: odr_cons.c,v 1.26 2003-05-20 19:55:30 adam Exp $
- *
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-void odr_setlenlen(ODR o, int len)
-{
- o->lenlen = len;
-}
-
-int odr_constructed_begin(ODR o, void *p, int zclass, int tag,
- const char *name)
-{
- int res;
- int cons = 1;
- int lenlen = o->lenlen;
-
- if (o->error)
- return 0;
- o->lenlen = 1; /* reset lenlen */
- if (o->t_class < 0)
- {
- o->t_class = zclass;
- o->t_tag = tag;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, 1, name)) < 0)
- return 0;
- if (!res || !cons)
- return 0;
-
- if (o->op->stackp == ODR_MAX_STACK - 1)
- {
- odr_seterror(o, OSTACK, 30);
- return 0;
- }
- o->op->stack[++(o->op->stackp)].lenb = o->bp;
- o->op->stack[o->op->stackp].len_offset = odr_tell(o);
-#ifdef ODR_DEBUG
- fprintf(stderr, "[cons_begin(%d)]", o->op->stackp);
-#endif
- if (o->direction == ODR_ENCODE)
- {
- static unsigned char dummy[sizeof(int)+1];
-
- o->op->stack[o->op->stackp].lenlen = lenlen;
-
- if (odr_write(o, dummy, lenlen) < 0) /* dummy */
- {
- --(o->op->stackp);
- return 0;
- }
- }
- else if (o->direction == ODR_DECODE)
- {
- if ((res = ber_declen(o->bp, &o->op->stack[o->op->stackp].len,
- odr_max(o))) < 0)
- {
- odr_seterror(o, OOTHER, 31);
- --(o->op->stackp);
- return 0;
- }
- o->op->stack[o->op->stackp].lenlen = res;
- o->bp += res;
- if (o->op->stack[o->op->stackp].len > odr_max(o))
- {
- odr_seterror(o, OOTHER, 32);
- --(o->op->stackp);
- return 0;
- }
- }
- else if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "{\n");
- o->indent++;
- }
- else
- {
- odr_seterror(o, OOTHER, 33);
- --(o->op->stackp);
- return 0;
- }
- o->op->stack[o->op->stackp].base = o->bp;
- o->op->stack[o->op->stackp].base_offset = odr_tell(o);
- return 1;
-}
-
-int odr_constructed_more(ODR o)
-{
- if (o->error)
- return 0;
- if (o->op->stackp < 0)
- return 0;
- if (o->op->stack[o->op->stackp].len >= 0)
- return o->bp - o->op->stack[o->op->stackp].base < o->op->stack[o->op->stackp].len;
- else
- return (!(*o->bp == 0 && *(o->bp + 1) == 0));
-}
-
-int odr_constructed_end(ODR o)
-{
- int res;
- int pos;
-
- if (o->error)
- return 0;
- if (o->op->stackp < 0)
- {
- odr_seterror(o, OOTHER, 34);
- return 0;
- }
- switch (o->direction)
- {
- case ODR_DECODE:
- if (o->op->stack[o->op->stackp].len < 0)
- {
- if (*o->bp++ == 0 && *(o->bp++) == 0)
- {
- o->op->stackp--;
- return 1;
- }
- else
- {
- odr_seterror(o, OOTHER, 35);
- return 0;
- }
- }
- else if (o->bp - o->op->stack[o->op->stackp].base !=
- o->op->stack[o->op->stackp].len)
- {
- odr_seterror(o, OCONLEN, 36);
- return 0;
- }
- o->op->stackp--;
- return 1;
- case ODR_ENCODE:
- pos = odr_tell(o);
- odr_seek(o, ODR_S_SET, o->op->stack[o->op->stackp].len_offset);
- if ((res = ber_enclen(o, pos - o->op->stack[o->op->stackp].base_offset,
- o->op->stack[o->op->stackp].lenlen, 1)) < 0)
- {
- odr_seterror(o, OLENOV, 37);
- return 0;
- }
- odr_seek(o, ODR_S_END, 0);
- if (res == 0) /* indefinite encoding */
- {
-#ifdef ODR_DEBUG
- fprintf(stderr, "[cons_end(%d): indefinite]", o->op->stackp);
-#endif
- if (odr_putc(o, 0) < 0 || odr_putc(o, 0) < 0)
- return 0;
- }
-#ifdef ODR_DEBUG
- else
- {
- fprintf(stderr, "[cons_end(%d): definite]", o->op->stackp);
- }
-#endif
- o->op->stackp--;
- return 1;
- case ODR_PRINT:
- o->op->stackp--;
- o->indent--;
- odr_prname(o, 0);
- fprintf(o->print, "}\n");
- return 1;
- default:
- odr_seterror(o, OOTHER, 38);
- return 0;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_enum.c,v 1.9 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-/*
- * Top level enum en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_enum(ODR o, int **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_ENUM;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "%d\n", **p);
- return 1;
- }
- if (cons)
- {
- odr_seterror(o, OPROTO, 54);
- return 0;
- }
- if (o->direction == ODR_DECODE)
- *p = (int *)odr_malloc(o, sizeof(int));
- return ber_integer(o, *p);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_int.c,v 1.19 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-/*
- * Top level integer en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_integer(ODR o, int **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_INTEGER;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "%d\n", **p);
- return 1;
- }
- if (cons)
- {
- odr_seterror(o, OPROTO, 1);
- return 0;
- }
- if (o->direction == ODR_DECODE)
- *p = (int *)odr_malloc(o, sizeof(int));
- return ber_integer(o, *p);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: odr_mem.c,v 1.23 2003-03-18 13:34:35 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include "odr-priv.h"
-#include <yaz/xmalloc.h>
-
-/* ------------------------ NIBBLE MEMORY ---------------------- */
-
-/*
- * Extract the memory control block from o.
- */
-NMEM odr_extract_mem(ODR o)
-{
- NMEM r = o->mem;
-
- o->mem = 0;
- return r;
-}
-
-void *odr_malloc(ODR o, int size)
-{
- if (o && !o->mem)
- o->mem = nmem_create();
- return nmem_malloc(o ? o->mem : 0, size);
-}
-
-char *odr_strdup(ODR o, const char *str)
-{
- return nmem_strdup(o->mem, str);
-}
-
-char *odr_strdupn(ODR o, const char *str, size_t n)
-{
- return nmem_strdupn(o->mem, str, n);
-}
-
-int *odr_intdup(ODR o, int v)
-{
- return nmem_intdup(o->mem, v);
-}
-
-int odr_total(ODR o)
-{
- return o->mem ? nmem_total(o->mem) : 0;
-}
-
-/* ---------- memory management for data encoding ----------*/
-
-
-int odr_grow_block(ODR b, int min_bytes)
-{
- int togrow;
-
- if (!b->can_grow)
- return -1;
- if (!b->size)
- togrow = 1024;
- else
- togrow = b->size;
- if (togrow < min_bytes)
- togrow = min_bytes;
- if (b->size && !(b->buf =
- (unsigned char *) xrealloc(b->buf, b->size += togrow)))
- abort();
- else if (!b->size && !(b->buf = (unsigned char *)
- xmalloc(b->size = togrow)))
- abort();
-#ifdef ODR_DEBUG
- fprintf(stderr, "New size for encode_buffer: %d\n", b->size);
-#endif
- return 0;
-}
-
-int odr_write(ODR o, unsigned char *buf, int bytes)
-{
- if (o->pos + bytes >= o->size && odr_grow_block(o, bytes))
- {
- odr_seterror(o, OSPACE, 40);
- return -1;
- }
- memcpy(o->buf + o->pos, buf, bytes);
- o->pos += bytes;
- if (o->pos > o->top)
- o->top = o->pos;
- return 0;
-}
-
-int odr_seek(ODR o, int whence, int offset)
-{
- if (whence == ODR_S_CUR)
- offset += o->pos;
- else if (whence == ODR_S_END)
- offset += o->top;
- if (offset > o->size && odr_grow_block(o, offset - o->size))
- {
- odr_seterror(o, OSPACE, 41);
- return -1;
- }
- o->pos = offset;
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_null.c,v 1.17 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-/*
- * Top level null en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_null(ODR o, Odr_null **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_NULL;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "NULL\n");
- return 1;
- }
- if (cons)
- {
-#ifdef ODR_STRICT_NULL
- odr_seterror(OPROTO, 42);
- return 0;
-#else
- fprintf(stderr, "odr: Warning: Bad NULL\n");
-#endif
- }
- if (o->direction == ODR_DECODE)
- *p = odr_nullval();
- return ber_null(o);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_oct.c,v 1.22 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <yaz/log.h>
-#include "odr-priv.h"
-
-/*
- * Top level octet string en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_octetstring(ODR o, Odr_oct **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_OCTETSTRING;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- int i;
- odr_prname(o, name);
- fprintf(o->print, "OCTETSTRING(len=%d)", (*p)->len);
- for (i = 0; i<(*p)->len; i++)
- {
- if (i < 5 || i > ((*p)->len - 4))
- {
- fprintf (o->print, " %02X", (*p)->buf[i]);
- }
- else if (i == 5)
- fprintf (o->print, " .. ");
- }
- fprintf(o->print, "\n");
- return 1;
- }
- if (o->direction == ODR_DECODE)
- {
- *p = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));
- (*p)->size= 0;
- (*p)->len = 0;
- (*p)->buf = 0;
- }
- if (ber_octetstring(o, *p, cons))
- return 1;
- odr_seterror(o, OOTHER, 43);
- return 0;
-}
-
-/*
- * Friendlier interface to octetstring.
- */
-int odr_cstring(ODR o, char **p, int opt, const char *name)
-{
- int cons = 0, res;
- Odr_oct *t;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_OCTETSTRING;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "'%s'\n", *p);
- return 1;
- }
- t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
- if (o->direction == ODR_ENCODE)
- {
- t->buf = (unsigned char *) *p;
- t->size = t->len = strlen(*p);
- }
- else
- {
- t->size= 0;
- t->len = 0;
- t->buf = 0;
- }
- if (!ber_octetstring(o, t, cons))
- return 0;
- if (o->direction == ODR_DECODE)
- {
- *p = (char *) t->buf;
- *(*p + t->len) = '\0'; /* ber_octs reserves space for this */
- }
- return 1;
-}
-
-/*
- * iconv interface to octetstring.
- */
-int odr_iconv_string(ODR o, char **p, int opt, const char *name)
-{
- int cons = 0, res;
- Odr_oct *t;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_OCTETSTRING;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (o->direction == ODR_PRINT)
- {
- odr_prname(o, name);
- fprintf(o->print, "'%s'\n", *p);
- return 1;
- }
- t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
- if (o->direction == ODR_ENCODE)
- {
- t->buf = 0;
-
- if (o->op->iconv_handle != 0)
- {
- size_t inleft = strlen(*p);
- char *inbuf = *p;
- size_t outleft = 4 * inleft + 2;
- char *outbuf = (char *) odr_malloc (o, outleft);
- size_t ret;
-
- t->buf = (unsigned char *) outbuf;
-
- ret = yaz_iconv (o->op->iconv_handle, &inbuf, &inleft,
- &outbuf, &outleft);
- if (ret == (size_t)(-1))
- {
- odr_seterror(o, ODATA, 44);
- return 0;
- }
- t->size = t->len = outbuf - (char*) t->buf;
- }
- if (!t->buf)
- {
- t->buf = (unsigned char *) *p;
- t->size = t->len = strlen(*p);
- }
- }
- else
- {
- t->size= 0;
- t->len = 0;
- t->buf = 0;
- }
- if (!ber_octetstring(o, t, cons))
- return 0;
- if (o->direction == ODR_DECODE)
- {
- *p = 0;
-
- if (o->op->iconv_handle != 0)
- {
- size_t inleft = t->len;
- char *inbuf = (char *) t->buf;
- size_t outleft = 4 * inleft + 2;
- char *outbuf = (char *) odr_malloc (o, outleft);
- size_t ret;
-
- *p = outbuf;
-
- ret = yaz_iconv (o->op->iconv_handle, &inbuf, &inleft,
- &outbuf, &outleft);
- if (ret == (size_t)(-1))
- {
- odr_seterror(o, ODATA, 45);
- return 0;
- }
- inleft = outbuf - (char*) *p;
-
- (*p)[inleft] = '\0'; /* null terminate it */
- }
- if (!*p)
- {
- *p = (char *) t->buf;
- *(*p + t->len) = '\0'; /* ber_octs reserves space for this */
- }
- }
- return 1;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_oid.c,v 1.20 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-#include <yaz/oid.h>
-
-/*
- * Top level oid en/decoder.
- * Returns 1 on success, 0 on error.
- */
-int odr_oid(ODR o, Odr_oid **p, int opt, const char *name)
-{
- int res, cons = 0;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_OID;
- }
- if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
- return 0;
- if (!res)
- return odr_missing(o, opt, name);
- if (cons)
- {
- odr_seterror(o, OPROTO, 46);
- return 0;
- }
- if (o->direction == ODR_PRINT)
- {
- int i;
-
- odr_prname(o, name);
- fprintf(o->print, "OID:");
- for (i = 0; (*p)[i] > -1; i++)
- fprintf(o->print, " %d", (*p)[i]);
- fprintf(o->print, "\n");
- return 1;
- }
- if (o->direction == ODR_DECODE)
- *p = (int *)odr_malloc(o, OID_SIZE * sizeof(**p));
- return ber_oidc(o, *p);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_seq.c,v 1.30 2003-03-11 11:03:31 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int odr_sequence_begin(ODR o, void *p, int size, const char *name)
-{
- char **pp = (char**) p;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_SEQUENCE;
- }
- if (o->direction == ODR_DECODE)
- *pp = 0;
- if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
- {
- if (o->direction == ODR_DECODE && size)
- *pp = (char *)odr_malloc(o, size);
- return 1;
- }
- else
- return 0;
-}
-
-int odr_set_begin(ODR o, void *p, int size, const char *name)
-{
- char **pp = (char**) p;
-
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = ODR_UNIVERSAL;
- o->t_tag = ODR_SET;
- }
- if (o->direction == ODR_DECODE)
- *pp = 0;
- if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
- {
- if (o->direction == ODR_DECODE && size)
- *pp = (char *)odr_malloc(o, size);
- return 1;
- }
- else
- return 0;
-}
-
-int odr_sequence_end(ODR o)
-{
- return odr_constructed_end(o);
-}
-
-int odr_set_end(ODR o)
-{
- return odr_constructed_end(o);
-}
-
-static int odr_sequence_more(ODR o)
-{
- return odr_constructed_more(o);
-}
-
-static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num)
-{
- char ***pp = (char***) p; /* for dereferencing */
- char **tmp = 0;
- int size = 0, i;
-
- switch (o->direction)
- {
- case ODR_DECODE:
- *num = 0;
- *pp = (char **)odr_nullval();
- while (odr_sequence_more(o))
- {
- /* outgrown array? */
- if (*num * (int) sizeof(void*) >= size)
- {
- /* double the buffer size */
- tmp = (char **)odr_malloc(o, sizeof(void*) *
- (size += size ? size : 128));
- if (*num)
- {
- memcpy(tmp, *pp, *num * sizeof(void*));
- /*
- * For now, we just throw the old *p away, since we use
- * nibble memory anyway (disgusting, isn't it?).
- */
- }
- *pp = tmp;
- }
- if (!(*type)(o, (*pp) + *num, 0, 0))
- return 0;
- (*num)++;
- }
- break;
- case ODR_ENCODE: case ODR_PRINT:
-#ifdef ODR_DEBUG
- fprintf(stderr, "[seqof: num=%d]", *num);
-#endif
- for (i = 0; i < *num; i++)
- {
-#ifdef ODR_DEBUG
- fprintf(stderr, "[seqof: elem #%d]", i);
-#endif
- if (!(*type)(o, *pp + i, 0, 0))
- return 0;
- }
- break;
- default:
- odr_seterror(o, OOTHER, 47);
- return 0;
- }
- return odr_sequence_end(o);
-}
-
-int odr_set_of(ODR o, Odr_fun type, void *p, int *num, const char *name)
-{
- if (!odr_set_begin(o, p, 0, name)) {
- if (o->direction == ODR_DECODE)
- *num = 0;
- return 0;
- }
- return odr_sequence_x (o, type, p, num);
-}
-
-int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num,
- const char *name)
-{
- if (!odr_sequence_begin(o, p, 0, name)) {
- if (o->direction == ODR_DECODE)
- *num = 0;
- return 0;
- }
- return odr_sequence_x (o, type, p, num);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_tag.c,v 1.14 2003-03-11 11:03:31 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int odr_peektag(ODR o, int *zclass, int *tag, int *cons)
-{
- if (o->direction != ODR_DECODE)
- {
- odr_seterror(o, OOTHER, 48);
- return 0;
- }
- if (o->op->stackp > -1 && !odr_constructed_more(o))
- return 0;
- if (ber_dectag(o->bp, zclass, tag, cons, odr_max(o)) <= 0)
- {
- odr_seterror(o, OREQUIRED, 49);
- return 0;
- }
- return 1;
-}
-
-int odr_implicit_settag(ODR o, int zclass, int tag)
-{
- if (o->error)
- return 0;
- if (o->t_class < 0)
- {
- o->t_class = zclass;
- o->t_tag = tag;
- }
- return 1;
-}
-
-int odr_initmember(ODR o, void *p, int size)
-{
- char **pp = (char **) p;
-
- if (o->error)
- return 0;
- if (o->direction == ODR_DECODE)
- *pp = (char *)odr_malloc(o, size);
- else if (!*pp)
- {
- o->t_class = -1;
- return 0;
- }
- return 1;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: odr_use.c,v 1.14 2003-05-20 19:55:30 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "odr-priv.h"
-
-int odr_external(ODR o, Odr_external **p, int opt, const char *name)
-{
- Odr_external *pp;
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 0, ODR_EXTERNAL_single,
- (Odr_fun)odr_any, "single"},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, ODR_EXTERNAL_octet,
- (Odr_fun)odr_octetstring, "octet"},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, ODR_EXTERNAL_arbitrary,
- (Odr_fun)odr_bitstring, "arbitrary"},
- {-1, -1, -1, -1, 0, 0}
- };
-
- odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
- if (!odr_sequence_begin(o, p, sizeof(Odr_external), name))
- return odr_missing(o, opt, name);
- pp = *p;
- return
- odr_oid(o, &pp->direct_reference, 1, "direct") &&
- odr_integer(o, &pp->indirect_reference, 1, "indirect") &&
- odr_graphicstring(o, &pp->descriptor, 1, "descriptor") &&
- odr_choice(o, arm, &pp->u, &pp->which, 0) &&
- odr_sequence_end(o);
-}
-
-int odr_visiblestring(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
- ODR_VISIBLESTRING, opt, name);
-}
-
-/*
- * a char may not be sufficient to hold a general string, but we'll deal
- * with that once we start looking more closely at UniCode & co.
- */
-int odr_generalstring(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit_tag(o, odr_iconv_string, p, ODR_UNIVERSAL,
- ODR_GENERALSTRING,opt, name);
-}
-
-int odr_graphicstring(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
- ODR_GRAPHICSTRING, opt, name);
-}
-
-int odr_generalizedtime(ODR o, char **p, int opt, const char *name)
-{
- return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
- ODR_GENERALIZEDTIME, opt, name);
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: odr_util.c,v 1.25 2003-05-24 19:20:14 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include "odr-priv.h"
-#include <yaz/oid.h>
-
-void odr_prname(ODR o, const char *name)
-{
- if (name)
- fprintf (o->print, "%*s%s ", o->indent*4, "", name);
- else
- fprintf (o->print, "%*s", o->indent*4, "");
-}
-
-int odp_more_chunks(ODR o, const unsigned char *base, int len)
-{
- if (!len)
- return 0;
- if (len < 0) /* indefinite length */
- {
- if (*o->bp == 0 && *(o->bp + 1) == 0)
- {
- o->bp += 2;
- return 0;
- }
- else
- return 1;
- }
- else
- return o->bp - base < len;
-}
-
-Odr_oid *odr_oiddup_nmem(NMEM nmem, Odr_oid *o)
-{
- Odr_oid *r;
-
- if (!o)
- return 0;
- if (!(r = (int *)nmem_malloc(nmem, (oid_oidlen(o) + 1) * sizeof(int))))
- return 0;
- oid_oidcpy(r, o);
- return r;
-}
-
-Odr_oid *odr_oiddup(ODR odr, Odr_oid *o)
-{
- return odr_oiddup_nmem (odr->mem, o);
-}
-
-Odr_oid *odr_getoidbystr_nmem(NMEM nmem, const char *str)
-{
- int num = 1, i = 0;
- const char *p = str;
- Odr_oid *ret;
-
- if (!isdigit(*str))
- return 0;
- while ((p = strchr(p, '.')))
- num++, p++;
- ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(num + 1));
- p = str;
- do
- ret[i++] = atoi(p);
- while ((p = strchr(p, '.')) && *++p);
- ret[i] = -1;
- return ret;
-}
-
-Odr_oid *odr_getoidbystr(ODR o, const char *str)
-{
- return odr_getoidbystr_nmem (o->mem, str);
-}
-
-int odr_missing(ODR o, int opt, const char *name)
-{
- if (o->error)
- return 0;
- if (!opt)
- {
- odr_seterror(o, OREQUIRED, 53);
- odr_setelement(o, name);
- }
- return opt;
-}
+++ /dev/null
--- Small ASN.1 spec for tstodr test
--- $Id: tstodr.asn,v 1.1 2003-05-06 10:08:30 adam Exp $
-tstodrcodec
-{tstodrcodec} DEFINITIONS ::=
-BEGIN
-MySequence ::= SEQUENCE {
- first [1] IMPLICIT INTEGER,
- second [2] IMPLICIT OCTET STRING,
- third [3] IMPLICIT BOOLEAN,
- fourth [4] IMPLICIT NULL,
- fifth [5] IMPLICIT INTEGER {
- enum1(0),
- enum2(1)
- }
-}
-END
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tstodr.c,v 1.5 2003-05-26 13:47:23 adam Exp $
- *
- */
-#include <stdio.h>
-#include <yaz/odr.h>
-#include "tstodrcodec.h"
-
-void tst_MySequence1(ODR encode, ODR decode)
-{
- char *ber_buf;
- int ber_len;
- Yc_MySequence *s = odr_malloc(encode, sizeof(*s));
- Yc_MySequence *t;
-
- s->first = odr_intdup(encode, 12345);
- s->second = odr_malloc(encode, sizeof(*s->second));
- s->second->buf = "hello";
- s->second->len = 5;
- s->second->size = 0;
- s->third = odr_intdup(encode, 1);
- s->fourth = odr_nullval();
- s->fifth = odr_intdup(encode, YC_MySequence_enum1);
-
- if (!yc_MySequence(encode, &s, 0, 0))
- exit(1);
-
- ber_buf = odr_getbuf(encode, &ber_len, 0);
-
- odr_setbuf(decode, ber_buf, ber_len, 0);
-
- if (!yc_MySequence(decode, &t, 0, 0))
- exit(2);
- if (!t->first || *t->first != 12345)
- exit(3);
- if (!t->second || !t->second->buf || t->second->len != 5)
- exit(4);
- if (memcmp(t->second->buf, "hello", t->second->len))
- exit(5);
- if (!t->third || *t->third != 1)
- exit(6);
- if (!t->fourth)
- exit(7);
- if (!t->fifth || *t->fifth != YC_MySequence_enum1)
- exit(8);
-}
-
-void tst_MySequence2(ODR encode, ODR decode)
-{
- char *ber_buf;
- int ber_len;
- Yc_MySequence *s = odr_malloc(encode, sizeof(*s));
- Yc_MySequence *t;
-
- s->first = 0; /* deliberately miss this .. */
- s->second = odr_malloc(encode, sizeof(*s->second));
- s->second->buf = "hello";
- s->second->len = 5;
- s->second->size = 0;
- s->third = odr_intdup(encode, 1);
- s->fourth = odr_nullval();
- s->fifth = odr_intdup(encode, YC_MySequence_enum1);
-
- if (yc_MySequence(encode, &s, 0, 0)) /* should fail */
- exit(9);
- if (odr_geterror(encode) != OREQUIRED)
- exit(10);
- if (strcmp(odr_getelement(encode), "first"))
- exit(11);
- odr_reset(encode);
-
- if (odr_geterror(encode) != ONONE)
- exit(12);
- if (strcmp(odr_getelement(encode), ""))
- exit(13);
-}
-
-void tst_MySequence3(ODR encode, ODR decode)
-{
- char buf[40];
- int i;
- Yc_MySequence *t;
-
- srand(123);
- for (i = 0; i<1000; i++)
- {
- int j;
- for (j = 0; j<sizeof(buf); j++)
- buf[j] = rand();
-
- for (j = 1; j<sizeof(buf); j++)
- {
- odr_setbuf(decode, buf, j, 0);
- yc_MySequence(decode, &t, 0, 0);
- odr_reset(decode);
- }
- }
-}
-
-int main(int argc, char **argv)
-{
- ODR odr_encode = odr_createmem(ODR_ENCODE);
- ODR odr_decode = odr_createmem(ODR_DECODE);
-
- tst_MySequence1(odr_encode, odr_decode);
- tst_MySequence2(odr_encode, odr_decode);
- tst_MySequence3(odr_encode, odr_decode);
-
- odr_destroy(odr_encode);
- odr_destroy(odr_decode);
- exit(0);
-}
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libret.la
-*.lo
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libserver.la
-*.lo
+++ /dev/null
-
-
-noinst_LTLIBRARIES=libserver.la
-
-libserver_la_SOURCES = eventl.c seshigh.c statserv.c requestq.c tcpdchk.c \
- eventl.h service.h session.h
-
-EXTRA_DIST=service.c
-
-AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS) -DDOCDIR=\"$(datadir)/doc/$(PACKAGE)\"
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: eventl.c,v 1.39 2003-02-21 12:08:59 adam Exp $
- */
-
-#include <stdio.h>
-#include <assert.h>
-#ifdef WIN32
-#include <winsock.h>
-#else
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-
-#include <yaz/yconfig.h>
-#include <yaz/log.h>
-#include <yaz/comstack.h>
-#include <yaz/xmalloc.h>
-#include "eventl.h"
-#include "session.h"
-#include <yaz/statserv.h>
-
-#if YAZ_GNU_THREADS
-#include <pth.h>
-#define YAZ_EV_SELECT pth_select
-#endif
-
-#ifndef YAZ_EV_SELECT
-#define YAZ_EV_SELECT select
-#endif
-
-IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
-{
- IOCHAN new_iochan;
-
- if (!(new_iochan = (IOCHAN)xmalloc(sizeof(*new_iochan))))
- return 0;
- new_iochan->destroyed = 0;
- new_iochan->fd = fd;
- new_iochan->flags = flags;
- new_iochan->fun = cb;
- new_iochan->force_event = 0;
- new_iochan->last_event = new_iochan->max_idle = 0;
- new_iochan->next = NULL;
- return new_iochan;
-}
-
-int event_loop(IOCHAN *iochans)
-{
- do /* loop as long as there are active associations to process */
- {
- IOCHAN p, nextp;
- fd_set in, out, except;
- int res, max;
- static struct timeval to;
- time_t now = time(0);
-
- if (statserv_must_terminate())
- {
- for (p = *iochans; p; p = p->next)
- p->force_event = EVENT_TIMEOUT;
- }
- FD_ZERO(&in);
- FD_ZERO(&out);
- FD_ZERO(&except);
- to.tv_sec = 3600;
- to.tv_usec = 0;
- max = 0;
- for (p = *iochans; p; p = p->next)
- {
- time_t w, ftime;
- yaz_log(LOG_DEBUG, "fd=%d flags=%d force_event=%d",
- p->fd, p->flags, p->force_event);
- if (p->force_event)
- to.tv_sec = 0; /* polling select */
- if (p->flags & EVENT_INPUT)
- FD_SET(p->fd, &in);
- if (p->flags & EVENT_OUTPUT)
- FD_SET(p->fd, &out);
- if (p->flags & EVENT_EXCEPT)
- FD_SET(p->fd, &except);
- if (p->fd > max)
- max = p->fd;
- if (p->max_idle && p->last_event)
- {
- ftime = p->last_event + p->max_idle;
- if (ftime < now)
- w = p->max_idle;
- else
- w = ftime - now;
- if (w < to.tv_sec)
- to.tv_sec = w;
- }
- }
- yaz_log(LOG_DEBUG, "select start %ld", (long) to.tv_sec);
- res = YAZ_EV_SELECT(max + 1, &in, &out, &except, &to);
- yaz_log(LOG_DEBUG, "select end");
- if (res < 0)
- {
- if (yaz_errno() == EINTR)
- {
- if (statserv_must_terminate())
- {
- for (p = *iochans; p; p = p->next)
- p->force_event = EVENT_TIMEOUT;
- }
- continue;
- }
- else
- {
- /* Destroy the first member in the chain, and try again */
- association *assoc = (association *)iochan_getdata(*iochans);
- COMSTACK conn = assoc->client_link;
-
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(*iochans);
- yaz_log(LOG_DEBUG, "error select, destroying iochan %p",
- *iochans);
- }
- }
- now = time(0);
- for (p = *iochans; p; p = p->next)
- {
- int force_event = p->force_event;
-
- p->force_event = 0;
- if (!p->destroyed && (FD_ISSET(p->fd, &in) ||
- force_event == EVENT_INPUT))
- {
- p->last_event = now;
- (*p->fun)(p, EVENT_INPUT);
- }
- if (!p->destroyed && (FD_ISSET(p->fd, &out) ||
- force_event == EVENT_OUTPUT))
- {
- p->last_event = now;
- (*p->fun)(p, EVENT_OUTPUT);
- }
- if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
- force_event == EVENT_EXCEPT))
- {
- p->last_event = now;
- (*p->fun)(p, EVENT_EXCEPT);
- }
- if (!p->destroyed && ((p->max_idle && now - p->last_event >=
- p->max_idle) || force_event == EVENT_TIMEOUT))
- {
- p->last_event = now;
- (*p->fun)(p, EVENT_TIMEOUT);
- }
- }
- for (p = *iochans; p; p = nextp)
- {
- nextp = p->next;
-
- if (p->destroyed)
- {
- IOCHAN tmp = p, pr;
-
- /* We need to inform the threadlist that this channel has been destroyed */
- statserv_remove(p);
-
- /* Now reset the pointers */
- if (p == *iochans)
- *iochans = p->next;
- else
- {
- for (pr = *iochans; pr; pr = pr->next)
- if (pr->next == p)
- break;
- assert(pr); /* grave error if it weren't there */
- pr->next = p->next;
- }
- if (nextp == p)
- nextp = p->next;
- xfree(tmp);
- }
- }
- }
- while (*iochans);
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: eventl.h,v 1.12 2003-02-12 15:06:43 adam Exp $
- */
-
-#ifndef EVENTL_H
-#define EVENTL_H
-
-#include <time.h>
-
-struct iochan;
-
-typedef void (*IOC_CALLBACK)(struct iochan *i, int event);
-
-typedef struct iochan
-{
- int fd;
- int flags;
-#define EVENT_INPUT 0x01
-#define EVENT_OUTPUT 0x02
-#define EVENT_EXCEPT 0x04
-#define EVENT_TIMEOUT 0x08
-#define EVENT_WORK 0x10
-int force_event;
- IOC_CALLBACK fun;
- void *data;
- int destroyed;
- time_t last_event;
- time_t max_idle;
-
- struct iochan *next;
-} *IOCHAN;
-
-#define iochan_destroy(i) (void)((i)->destroyed = 1)
-#define iochan_getfd(i) ((i)->fd)
-#define iochan_setfd(i, f) ((i)->fd = (f))
-#define iochan_getdata(i) ((i)->data)
-#define iochan_setdata(i, d) ((i)->data = d)
-#define iochan_getflags(i) ((i)->flags)
-#define iochan_setflags(i, d) ((i)->flags = d)
-#define iochan_setflag(i, d) ((i)->flags |= d)
-#define iochan_clearflag(i, d) ((i)->flags &= ~(d))
-#define iochan_getflag(i, d) ((i)->flags & d ? 1 : 0)
-#define iochan_getfun(i) ((i)->fun)
-#define iochan_setfun(i, d) ((i)->fun = d)
-#define iochan_setevent(i, e) ((i)->force_event = (e))
-#define iochan_getnext(i) ((i)->next)
-#define iochan_settimeout(i, t) ((i)->max_idle = (t), (i)->last_event = time(0))
-
-IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags);
-int event_loop(IOCHAN *iochans);
-void statserv_remove (IOCHAN pIOChannel);
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1994-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: requestq.c,v 1.10 2003-10-20 18:20:55 adam Exp $
- *
- */
-
-/*
- * Simple queue management.
- *
- * We also use the request-freelist to store encoding buffers, rather than
- * freeing and xmalloc'ing them on each cycle.
- */
-
-#include <stdlib.h>
-
-#include <yaz/xmalloc.h>
-#include "session.h"
-
-void request_enq(request_q *q, request *r)
-{
- if (q->tail)
- q->tail->next = r;
- else
- q->head = r;
- q->tail = r;
- q->num++;
-}
-
-request *request_head(request_q *q)
-{
- return q->head;
-}
-
-request *request_deq(request_q *q)
-{
- request *r = q->head;
-
- if (!r)
- return 0;
- q->head = q->head->next;
- if (!q->head)
- q->tail = 0;
- q->num--;
- return r;
-}
-
-void request_initq(request_q *q)
-{
- q->head = q->tail = q->list = 0;
- q->num = 0;
-}
-
-void request_delq(request_q *q)
-{
- request *r1, *r = q->list;
- while (r)
- {
- xfree (r->response);
- r1 = r;
- r = r->next;
- xfree (r1);
- }
-}
-
-request *request_get(request_q *q)
-{
- request *r = q->list;
-
- if (r)
- q->list = r->next;
- else
- {
- if (!(r = (request *)xmalloc(sizeof(*r))))
- abort();
- r->response = 0;
- r->size_response = 0;
- }
- r->q = q;
- r->len_refid = 0;
- r->refid = 0;
- r->gdu_request = 0;
- r->apdu_request = 0;
- r->request_mem = 0;
- r->len_response = 0;
- r->clientData = 0;
- r->state = REQUEST_IDLE;
- r->next = 0;
- return r;
-}
-
-void request_release(request *r)
-{
- request_q *q = r->q;
- r->next = q->list;
- q->list = r;
-}
-
+++ /dev/null
-/*
- * NT Service interface Utility.
- * Based on code written by
- * Chas Woodfield, Fretwell Downing Informatics.
- * $Log: service.c,v $
- * Revision 1.5 2001-11-13 23:00:42 adam
- * Separate malloc debug library. Removal of ASN_COMPILED-#ifdefs.
- *
- * Revision 1.4 2000/12/05 19:05:10 adam
- * Service automatically starts in the directory from which it was installed.
- *
- * Revision 1.3 1999/06/10 11:45:30 adam
- * Added bend_start, bend_stop handlers and removed pre_init.
- * Handlers bend_start/bend_stop are called when service/daemon is
- * started/stopped.
- *
- * Revision 1.2 1999/02/02 13:57:36 adam
- * Uses preprocessor define WIN32 instead of WINDOWS to build code
- * for Microsoft WIN32.
- *
- * Revision 1.1 1997/11/07 13:31:52 adam
- * Added NT Service name part of statserv_options_block. Moved NT
- * service utility to server library.
- *
- * Revision 1.6 1997/09/18 08:49:14 adam
- * Option -runnormal no needed to run server in standalone mode.
- *
- * Revision 1.5 1997/09/17 12:10:43 adam
- * YAZ version 1.4.
- *
- * Revision 1.4 1997/09/09 10:10:20 adam
- * Another MSV5.0 port. Changed projects to include proper
- * library/include paths.
- * Server starts server in test-mode when no options are given.
- *
- * Revision 1.3 1997/09/04 13:50:30 adam
- * Bug fix in ztest.
- *
- */
-
-/************************************************************/
-/* Note this file is shared by all processes */
-/* Should really put it somewhere other than here */
-/* For some strange reason it won't work when part of a lib */
-/************************************************************/
-
-#ifdef WIN32
-
-#include <windows.h>
-#include <stdio.h>
-#include <tchar.h>
-#include <direct.h>
-
-#include "service.h"
-
-static AppService *pService = NULL;
-static BOOL bRunAsService = TRUE;
-static void *pAppHandle = NULL;
-
-/* Private functions to this module */
-void Service_Create(LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies, int argc, char **argv);
-void Service_Delete();
-void Service_Initialize();
-BOOL NotifyServiceController();
-BOOL UpdateServiceStatus(DWORD Status);
-void FailServiceStart(DWORD Win32Code, DWORD PrivateCode);
-void CmdInstallService(int argc, char *argv[], BOOL bAutoStart);
-void CmdRemoveService();
-LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize);
-BOOL CheckServiceArguments(int argc, char *argv[]);
-
-/* Callback functions for thee service manager */
-void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
-void WINAPI ServiceControlHandler(DWORD fdwControl);
-
-/* Function to handle Ctrl + C etc... */
-BOOL EventHandlerRoutine(DWORD dwCtrlType);
-
-void Service_Create(LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies, int argc, char **argv)
-{
- pService = malloc(sizeof(AppService));
- pService->pAppName = pAppName;
- pService->pServiceName = pServiceName;
- pService->pServiceDisplayName = pServiceDisplayName;
- pService->pDependancies = pDependancies;
- pService->hService = 0;
- pService->ServiceTable[0].lpServiceName = pServiceName;
- pService->ServiceTable[0].lpServiceProc = ServiceMain;
- pService->ServiceTable[1].lpServiceName = NULL;
- pService->ServiceTable[1].lpServiceProc = NULL;
- pService->argc = argc;
- pService->argv = argv;
-}
-
-void Service_Delete()
-{
- if (pService != NULL)
- {
- /* Mark the service as stopping */
- UpdateServiceStatus(SERVICE_STOP_PENDING);
-
- /* Stop the service */
- StopAppService(pAppHandle);
-
- /* Service has now stopped */
- UpdateServiceStatus(SERVICE_STOPPED);
-
- /* Free the memory */
- free(pService);
- pService = NULL;
- }
-}
-
-void Service_Initialize()
-{
- if (pService != NULL)
- {
- /* Register ourselves with the control dispatcher */
- StartServiceCtrlDispatcher(pService->ServiceTable);
- }
-}
-
-void WINAPI ServiceMain(DWORD argc, LPTSTR argv[])
-{
- if (pService != NULL)
- {
- if (NotifyServiceController())
- {
- /* Set the status to pending */
- UpdateServiceStatus(SERVICE_START_PENDING);
-
- /* Lets attempt to start the service */
- if (StartAppService(pAppHandle, pService->argc, pService->argv))
- {
- /* Service is now up and running */
- UpdateServiceStatus(SERVICE_RUNNING);
-
- /* Lets wait for our clients */
- RunAppService(pAppHandle);
- }
- else
- {
- FailServiceStart(GetLastError(), 0);
- Service_Delete();
- }
- }
- }
-}
-
-BOOL NotifyServiceController()
-{
- if (pService == NULL)
- {
- return(FALSE);
- }
- else
- {
- if (bRunAsService)
- {
- pService->ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
- pService->ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- pService->ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- pService->ServiceStatus.dwWin32ExitCode = 0;
- pService->ServiceStatus.dwServiceSpecificExitCode = 0;
- pService->ServiceStatus.dwCheckPoint = 0;
- pService->ServiceStatus.dwWaitHint = 0;
- pService->hService = RegisterServiceCtrlHandler(pService->pServiceName, ServiceControlHandler);
-
- if (pService->hService)
- UpdateServiceStatus(SERVICE_START_PENDING);
- else
- return(FALSE);
- }
- return(TRUE);
- }
-}
-
-void WINAPI ServiceControlHandler(DWORD fdwControl)
-{
- if (pService != NULL)
- {
- switch (fdwControl)
- {
- case SERVICE_CONTROL_STOP:
- /* Update the service status to be pending */
- Service_Delete();
- break;
-
- case SERVICE_CONTROL_INTERROGATE:
- UpdateServiceStatus(pService->ServiceStatus.dwCurrentState);
- break;
-
- default:
- break;
- }
- }
-}
-
-BOOL UpdateServiceStatus(DWORD Status)
-{
- if (pService != NULL)
- {
- if (pService->hService)
- {
- pService->ServiceStatus.dwCurrentState = Status;
- if ((Status == SERVICE_START_PENDING) || (Status == SERVICE_STOP_PENDING))
- {
- pService->ServiceStatus.dwCheckPoint ++;
- pService->ServiceStatus.dwWaitHint = 5000; /* 5 sec.*/
- }
- else
- {
- pService->ServiceStatus.dwCheckPoint = 0;
- pService->ServiceStatus.dwWaitHint = 0;
- }
-
- return(SetServiceStatus(pService->hService, &pService->ServiceStatus));
- }
- }
-
- return(FALSE);
-}
-
-void FailServiceStart(DWORD Win32Code, DWORD PrivateCode)
-{
- if (pService != NULL)
- {
- pService->ServiceStatus.dwWin32ExitCode = Win32Code;
- pService->ServiceStatus.dwServiceSpecificExitCode = PrivateCode;
- UpdateServiceStatus(SERVICE_STOPPED);
- }
-}
-
-void CmdInstallService(int argc, char *argv[], BOOL bAutoStart)
-{
- if (pService != NULL)
- {
- SC_HANDLE schService;
- SC_HANDLE schSCManager;
-
- TCHAR szPath[2048];
-
- if (GetModuleFileName(NULL, szPath, 512) == 0)
- {
- _tprintf(TEXT("Unable to install %s - %s\n"), TEXT(pService->pServiceDisplayName), GetLastErrorText(pService->szErr, 256));
- }
- else
- {
- int i;
- char cwdstr[_MAX_PATH];
-
- if (!_getcwd(cwdstr, sizeof(cwdstr)))
- strcpy (cwdstr, ".");
-
- strcat (szPath, TEXT(" -runservice \""));
- strcat (szPath, cwdstr);
- strcat (szPath, "\"");
-
- for (i = 1; i < argc; i++)
- {
- /* We will add the given command line arguments to the command */
- /* We are not interested in the install and remove options */
- if ((stricmp("-install", argv[i]) != 0) &&
- (stricmp("-installa", argv[i]) != 0) &&
- (stricmp("-remove", argv[i]) != 0))
- {
- strcat(szPath, TEXT(" "));
- strcat(szPath, argv[i]);
- }
- }
-
- schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */
- NULL, /* database (NULL == default) */
- SC_MANAGER_ALL_ACCESS); /* access required */
- if (schSCManager)
- {
- schService = CreateService(schSCManager, /* SCManager database */
- TEXT(pService->pServiceName), /* name of service */
- TEXT(pService->pServiceDisplayName), /* name to display */
- SERVICE_ALL_ACCESS, /* desired access */
- SERVICE_WIN32_OWN_PROCESS, /* service type */
- bAutoStart ? SERVICE_AUTO_START :
- SERVICE_DEMAND_START, /* start type */
- SERVICE_ERROR_NORMAL, /* error control type */
- szPath, /* service's binary */
- NULL, /* no load ordering group */
- NULL, /* no tag identifier */
- TEXT(pService->pDependancies), /* dependencies */
- NULL, /* LocalSystem account */
- NULL); /* no password */
-
- if (schService)
- {
- _tprintf(TEXT("%s installed.\n"), TEXT(pService->pServiceDisplayName));
- CloseServiceHandle(schService);
- }
- else
- {
- _tprintf(TEXT("CreateService failed - %s\n"), GetLastErrorText(pService->szErr, 256));
- }
-
- CloseServiceHandle(schSCManager);
- }
- else
- _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(pService->szErr,256));
- }
- }
-}
-
-void CmdRemoveService()
-{
- if (pService != NULL)
- {
- SC_HANDLE schService;
- SC_HANDLE schSCManager;
-
- schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */
- NULL, /* database (NULL == default) */
- SC_MANAGER_ALL_ACCESS); /* access required */
- if (schSCManager)
- {
- schService = OpenService(schSCManager, TEXT(pService->pServiceName), SERVICE_ALL_ACCESS);
-
- if (schService)
- {
- /* try to stop the service */
- if (ControlService(schService, SERVICE_CONTROL_STOP, &pService->ServiceStatus))
- {
- _tprintf(TEXT("Stopping %s."), TEXT(pService->pServiceDisplayName));
- Sleep(1000);
-
- while (QueryServiceStatus(schService, &pService->ServiceStatus))
- {
- if (pService->ServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
- {
- _tprintf(TEXT("."));
- Sleep( 1000 );
- }
- else
- break;
- }
-
- if (pService->ServiceStatus.dwCurrentState == SERVICE_STOPPED)
- _tprintf(TEXT("\n%s stopped.\n"), TEXT(pService->pServiceDisplayName));
- else
- _tprintf(TEXT("\n%s failed to stop.\n"), TEXT(pService->pServiceDisplayName));
-
- }
-
- /* now remove the service */
- if(DeleteService(schService))
- _tprintf(TEXT("%s removed.\n"), TEXT(pService->pServiceDisplayName));
- else
- _tprintf(TEXT("DeleteService failed - %s\n"), GetLastErrorText(pService->szErr,256));
-
- CloseServiceHandle(schService);
- }
- else
- _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(pService->szErr,256));
-
- CloseServiceHandle(schSCManager);
- }
- else
- _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(pService->szErr,256));
- }
-}
-
-LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
-{
- DWORD dwRet;
- LPTSTR lpszTemp = NULL;
-
- dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
- NULL,
- GetLastError(),
- LANG_NEUTRAL,
- (LPTSTR)&lpszTemp,
- 0,
- NULL);
-
- /* supplied buffer is not long enough */
- if (!dwRet || ((long)dwSize < (long)dwRet + 14))
- lpszBuf[0] = TEXT('\0');
- else
- {
- lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); /* remove cr and newline character */
- _stprintf(lpszBuf, TEXT("%s (0x%x)"), lpszTemp, GetLastError());
- }
-
- if (lpszTemp)
- LocalFree((HLOCAL)lpszTemp);
-
- return(lpszBuf);
-}
-
-BOOL CheckServiceArguments(int argc, char *argv[])
-{
- int i;
-
- /* Lets process the arguments */
- for (i = 1; i < argc; i++)
- {
- if (stricmp("-install", argv[i]) == 0)
- {
- /* They want to install the service */
- CmdInstallService(argc, argv, FALSE);
-
- /* We don't carry on, after we have installed the service */
- return(FALSE);
- }
- else if (stricmp("-installa", argv[i]) == 0)
- {
- /* They want to install the service */
- CmdInstallService(argc, argv, TRUE);
-
- /* We don't carry on, after we have installed the service */
- return(FALSE);
- }
- else if (stricmp("-remove", argv[i]) == 0)
- {
- /* Here they want to remove it */
- CmdRemoveService();
-
- /* We don't carry on, after we have removed the service */
- return(FALSE);
- }
- else if (stricmp ("-runservice", argv[i]) == 0)
- {
- /* We can carry on, if we reached here */
- chdir(argv[i+1]);
- argv[i] = "";
- argv[i+1] = "";
- return(TRUE);
- }
- }
- bRunAsService = FALSE;
- return(TRUE);
-}
-
-BOOL SetupService(int argc, char *argv[], void *pHandle, LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies)
-{
- BOOL bDeleteService = TRUE;
- BOOL bResult = FALSE;
-
- /* Save the handle for later use */
- pAppHandle = pHandle;
-
- /* Create our service class */
- Service_Create(pAppName, pServiceName, pServiceDisplayName, pDependancies, argc, argv);
-
- if (CheckServiceArguments(argc, argv))
- {
- if (bRunAsService)
- {
- /* No need to set the console control handler, as the service manager handles all this for us */
- Service_Initialize();
- bDeleteService = FALSE;
- }
- else
- {
- /* Set the console control handler for exiting the program */
- SetConsoleCtrlHandler((PHANDLER_ROUTINE)EventHandlerRoutine, TRUE);
-
- /* Now do the main work */
- ServiceMain(argc, argv);
- }
-
- /* We have been successful initializing, so let the caller know */
- bResult = TRUE;
- }
-
- if (bDeleteService)
- {
- /* Finished with the service now */
- Service_Delete();
- }
- return(bResult);
-}
-
-BOOL EventHandlerRoutine(DWORD dwCtrlType)
-{
- /* This routine dosn't seem to get called all the time, Why ??? */
- switch (dwCtrlType)
- {
- case CTRL_C_EVENT: /* A CTRL+C signal was received, either from keyboard input or from a signal generated by the GenerateConsoleCtrlEvent function.*/
- case CTRL_BREAK_EVENT: /* A CTRL+BREAK signal was received, either from keyboard input or from a signal generated by GenerateConsoleCtrlEvent.*/
- case CTRL_CLOSE_EVENT: /* A signal that the system sends to all processes attached to a console when the user closes the console (either by choosing the Close command from the console window's System menu, or by choosing the End Task command from the Task List).*/
- case CTRL_LOGOFF_EVENT: /* A signal that the system sends to all console processes when a user is logging off. This signal does not indicate which user is logging off, so no assumptions can be made.*/
- case CTRL_SHUTDOWN_EVENT: /* A signal that the system sends to all console processes when the system */
- /* We are basically shutting down, so call Service_Delete */
- Service_Delete();
- return(FALSE);
- break;
-
- default:
- /* we are not handling this one, so return FALSE */
- return(FALSE);
- }
-}
-#endif
+++ /dev/null
-/*
- * NT Service interface Utility.
- * Based on code written by
- * Chas Woodfield, Fretwell Downing Datasystems.
- * $Log: service.h,v $
- * Revision 1.1 1997-11-07 13:31:52 adam
- * Added NT Service name part of statserv_options_block. Moved NT
- * service utility to server library.
- *
- * Revision 1.2 1997/09/04 13:50:30 adam
- * Bug fix in ztest.
- *
- */
-
-#ifndef SERVICE_INCLUDED
-#define SERVICE_INCLUDED
-
-#ifdef WIN32
-
-#include <windows.h>
-
-typedef struct _Service
-{
- LPTSTR pAppName;
- LPTSTR pServiceName;
- LPTSTR pServiceDisplayName;
- LPTSTR pDependancies;
- TCHAR szErr[256];
- SERVICE_STATUS_HANDLE hService;
- SERVICE_STATUS ServiceStatus;
- SERVICE_TABLE_ENTRY ServiceTable[2];
- int argc;
- char **argv;
-} AppService;
-
-/* Called by the app to initialize the service */
-BOOL SetupService(int argc, char *argv[], void *pHandle, LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies);
-
-#endif /* WIN32 */
-
-/* Functions that must be in the main application */
-/* Initializes the app */
-int StartAppService(void *pHandle, int argc, char **argv);
-
-/* Now we wait for any connections */
-void RunAppService(void *pHandle);
-
-/* Time to tidyup and stop the service */
-void StopAppService(void *pHandle);
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: seshigh.c,v 1.164 2003-10-21 09:48:23 adam Exp $
- */
-
-/*
- * Frontend server logic.
- *
- * This code receives incoming APDUs, and handles client requests by means
- * of the backend API.
- *
- * Some of the code is getting quite involved, compared to simpler servers -
- * primarily because it is asynchronous both in the communication with
- * the user and the backend. We think the complexity will pay off in
- * the form of greater flexibility when more asynchronous facilities
- * are implemented.
- *
- * Memory management has become somewhat involved. In the simple case, where
- * only one PDU is pending at a time, it will simply reuse the same memory,
- * once it has found its working size. When we enable multiple concurrent
- * operations, perhaps even with multiple parallel calls to the backend, it
- * will maintain a pool of buffers for encoding and decoding, trying to
- * minimize memory allocation/deallocation during normal operation.
- *
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/types.h>
-#ifdef WIN32
-#include <io.h>
-#define S_ISREG(x) (x & _S_IFREG)
-#include <process.h>
-#include <sys/stat.h>
-#else
-#include <sys/stat.h>
-#include <unistd.h>
-#endif
-#include <assert.h>
-#include <ctype.h>
-
-#include <yaz/yconfig.h>
-#include <yaz/xmalloc.h>
-#include <yaz/comstack.h>
-#include "eventl.h"
-#include "session.h"
-#include <yaz/proto.h>
-#include <yaz/oid.h>
-#include <yaz/log.h>
-#include <yaz/logrpn.h>
-#include <yaz/statserv.h>
-#include <yaz/diagbib1.h>
-#include <yaz/charneg.h>
-#include <yaz/otherinfo.h>
-#include <yaz/yaz-util.h>
-#include <yaz/pquery.h>
-
-#include <yaz/srw.h>
-#include <yaz/backend.h>
-
-static void process_gdu_request(association *assoc, request *req);
-static int process_z_request(association *assoc, request *req, char **msg);
-void backend_response(IOCHAN i, int event);
-static int process_gdu_response(association *assoc, request *req, Z_GDU *res);
-static int process_z_response(association *assoc, request *req, Z_APDU *res);
-static Z_APDU *process_initRequest(association *assoc, request *reqb);
-static Z_External *init_diagnostics(ODR odr, int errcode, char *errstring);
-static Z_APDU *process_searchRequest(association *assoc, request *reqb,
- int *fd);
-static Z_APDU *response_searchRequest(association *assoc, request *reqb,
- bend_search_rr *bsrr, int *fd);
-static Z_APDU *process_presentRequest(association *assoc, request *reqb,
- int *fd);
-static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd);
-static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd);
-static void process_close(association *assoc, request *reqb);
-void save_referenceId (request *reqb, Z_ReferenceId *refid);
-static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
- int *fd);
-static Z_APDU *process_segmentRequest (association *assoc, request *reqb);
-
-static FILE *apduf = 0; /* for use in static mode */
-static statserv_options_block *control_block = 0;
-
-static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd);
-
-/*
- * Create and initialize a new association-handle.
- * channel : iochannel for the current line.
- * link : communications channel.
- * Returns: 0 or a new association handle.
- */
-association *create_association(IOCHAN channel, COMSTACK link)
-{
- association *anew;
-
- if (!control_block)
- control_block = statserv_getcontrol();
- if (!(anew = (association *)xmalloc(sizeof(*anew))))
- return 0;
- anew->init = 0;
- anew->version = 0;
- anew->client_chan = channel;
- anew->client_link = link;
- anew->cs_get_mask = 0;
- anew->cs_put_mask = 0;
- anew->cs_accept_mask = 0;
- if (!(anew->decode = odr_createmem(ODR_DECODE)) ||
- !(anew->encode = odr_createmem(ODR_ENCODE)))
- return 0;
- if (*control_block->apdufile)
- {
- char filename[256];
- FILE *f;
-
- strcpy(filename, control_block->apdufile);
- if (!(anew->print = odr_createmem(ODR_PRINT)))
- return 0;
- if (*control_block->apdufile == '@')
- {
- odr_setprint(anew->print, yaz_log_file());
- }
- else if (*control_block->apdufile != '-')
- {
- strcpy(filename, control_block->apdufile);
- if (!control_block->dynamic)
- {
- if (!apduf)
- {
- if (!(apduf = fopen(filename, "w")))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "%s", filename);
- return 0;
- }
- setvbuf(apduf, 0, _IONBF, 0);
- }
- f = apduf;
- }
- else
- {
- sprintf(filename + strlen(filename), ".%d", getpid());
- if (!(f = fopen(filename, "w")))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "%s", filename);
- return 0;
- }
- setvbuf(f, 0, _IONBF, 0);
- }
- odr_setprint(anew->print, f);
- }
- }
- else
- anew->print = 0;
- anew->input_buffer = 0;
- anew->input_buffer_len = 0;
- anew->backend = 0;
- anew->state = ASSOC_NEW;
- request_initq(&anew->incoming);
- request_initq(&anew->outgoing);
- anew->proto = cs_getproto(link);
- return anew;
-}
-
-/*
- * Free association and release resources.
- */
-void destroy_association(association *h)
-{
- statserv_options_block *cb = statserv_getcontrol();
- request *req;
-
- xfree(h->init);
- odr_destroy(h->decode);
- odr_destroy(h->encode);
- if (h->print)
- odr_destroy(h->print);
- if (h->input_buffer)
- xfree(h->input_buffer);
- if (h->backend)
- (*cb->bend_close)(h->backend);
- while ((req = request_deq(&h->incoming)))
- request_release(req);
- while ((req = request_deq(&h->outgoing)))
- request_release(req);
- request_delq(&h->incoming);
- request_delq(&h->outgoing);
- xfree(h);
- xmalloc_trav("session closed");
- if (control_block && control_block->one_shot)
- {
- exit (0);
- }
-}
-
-static void do_close_req(association *a, int reason, char *message,
- request *req)
-{
- Z_APDU apdu;
- Z_Close *cls = zget_Close(a->encode);
-
- /* Purge request queue */
- while (request_deq(&a->incoming));
- while (request_deq(&a->outgoing));
- if (a->version >= 3)
- {
- yaz_log(LOG_LOG, "Sending Close PDU, reason=%d, message=%s",
- reason, message ? message : "none");
- apdu.which = Z_APDU_close;
- apdu.u.close = cls;
- *cls->closeReason = reason;
- cls->diagnosticInformation = message;
- process_z_response(a, req, &apdu);
- iochan_settimeout(a->client_chan, 20);
- }
- else
- {
- request_release(req);
- yaz_log(LOG_DEBUG, "v2 client. No Close PDU");
- iochan_setevent(a->client_chan, EVENT_TIMEOUT); /* force imm close */
- }
- a->state = ASSOC_DEAD;
-}
-
-static void do_close(association *a, int reason, char *message)
-{
- request *req = request_get(&a->outgoing);
- do_close_req (a, reason, message, req);
-}
-
-/*
- * This is where PDUs from the client are read and the further
- * processing is initiated. Flow of control moves down through the
- * various process_* functions below, until the encoded result comes back up
- * to the output handler in here.
- *
- * h : the I/O channel that has an outstanding event.
- * event : the current outstanding event.
- */
-void ir_session(IOCHAN h, int event)
-{
- int res;
- association *assoc = (association *)iochan_getdata(h);
- COMSTACK conn = assoc->client_link;
- request *req;
-
- assert(h && conn && assoc);
- if (event == EVENT_TIMEOUT)
- {
- if (assoc->state != ASSOC_UP)
- {
- yaz_log(LOG_LOG, "Final timeout - closing connection.");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- }
- else
- {
- yaz_log(LOG_LOG, "Session idle too long. Sending close.");
- do_close(assoc, Z_Close_lackOfActivity, 0);
- }
- return;
- }
- if (event & assoc->cs_accept_mask)
- {
- yaz_log (LOG_DEBUG, "ir_session (accept)");
- if (!cs_accept (conn))
- {
- yaz_log (LOG_LOG, "accept failed");
- destroy_association(assoc);
- iochan_destroy(h);
- }
- iochan_clearflag (h, EVENT_OUTPUT|EVENT_OUTPUT);
- if (conn->io_pending)
- { /* cs_accept didn't complete */
- assoc->cs_accept_mask =
- ((conn->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) |
- ((conn->io_pending & CS_WANT_READ) ? EVENT_INPUT : 0);
-
- iochan_setflag (h, assoc->cs_accept_mask);
- }
- else
- { /* cs_accept completed. Prepare for reading (cs_get) */
- assoc->cs_accept_mask = 0;
- assoc->cs_get_mask = EVENT_INPUT;
- iochan_setflag (h, assoc->cs_get_mask);
- }
- return;
- }
- if ((event & assoc->cs_get_mask) || (event & EVENT_WORK)) /* input */
- {
- if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask))
- {
- yaz_log(LOG_DEBUG, "ir_session (input)");
- /* We aren't speaking to this fellow */
- if (assoc->state == ASSOC_DEAD)
- {
- yaz_log(LOG_LOG, "Connection closed - end of session");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- return;
- }
- assoc->cs_get_mask = EVENT_INPUT;
- if ((res = cs_get(conn, &assoc->input_buffer,
- &assoc->input_buffer_len)) <= 0)
- {
- yaz_log(LOG_LOG, "Connection closed by client");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- return;
- }
- else if (res == 1) /* incomplete read - wait for more */
- {
- if (conn->io_pending & CS_WANT_WRITE)
- assoc->cs_get_mask |= EVENT_OUTPUT;
- iochan_setflag(h, assoc->cs_get_mask);
- return;
- }
- if (cs_more(conn)) /* more stuff - call us again later, please */
- iochan_setevent(h, EVENT_INPUT);
-
- /* we got a complete PDU. Let's decode it */
- yaz_log(LOG_DEBUG, "Got PDU, %d bytes: lead=%02X %02X %02X", res,
- assoc->input_buffer[0] & 0xff,
- assoc->input_buffer[1] & 0xff,
- assoc->input_buffer[2] & 0xff);
- req = request_get(&assoc->incoming); /* get a new request */
- odr_reset(assoc->decode);
- odr_setbuf(assoc->decode, assoc->input_buffer, res, 0);
- if (!z_GDU(assoc->decode, &req->gdu_request, 0, 0))
- {
- yaz_log(LOG_LOG, "ODR error on incoming PDU: %s [element %s] "
- "[near byte %d] ",
- odr_errmsg(odr_geterror(assoc->decode)),
- odr_getelement(assoc->decode),
- odr_offset(assoc->decode));
- if (assoc->decode->error != OHTTP)
- {
- yaz_log(LOG_LOG, "PDU dump:");
- odr_dumpBER(yaz_log_file(), assoc->input_buffer, res);
- request_release(req);
- do_close(assoc, Z_Close_protocolError,"Malformed package");
- }
- else
- {
- Z_GDU *p = z_get_HTTP_Response(assoc->encode, 400);
- assoc->state = ASSOC_DEAD;
- process_gdu_response(assoc, req, p);
- }
- return;
- }
- req->request_mem = odr_extract_mem(assoc->decode);
- if (assoc->print && !z_GDU(assoc->print, &req->gdu_request, 0, 0))
- {
- yaz_log(LOG_WARN, "ODR print error: %s",
- odr_errmsg(odr_geterror(assoc->print)));
- odr_reset(assoc->print);
- }
- request_enq(&assoc->incoming, req);
- }
-
- /* can we do something yet? */
- req = request_head(&assoc->incoming);
- if (req->state == REQUEST_IDLE)
- {
- request_deq(&assoc->incoming);
- process_gdu_request(assoc, req);
- }
- }
- if (event & assoc->cs_put_mask)
- {
- request *req = request_head(&assoc->outgoing);
-
- assoc->cs_put_mask = 0;
- yaz_log(LOG_DEBUG, "ir_session (output)");
- req->state = REQUEST_PENDING;
- switch (res = cs_put(conn, req->response, req->len_response))
- {
- case -1:
- yaz_log(LOG_LOG, "Connection closed by client");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- break;
- case 0: /* all sent - release the request structure */
- yaz_log(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response);
-#if 0
- yaz_log(LOG_DEBUG, "HTTP out:\n%.*s", req->len_response,
- req->response);
-#endif
- nmem_destroy(req->request_mem);
- request_deq(&assoc->outgoing);
- request_release(req);
- if (!request_head(&assoc->outgoing))
- { /* restore mask for cs_get operation ... */
- iochan_clearflag(h, EVENT_OUTPUT|EVENT_INPUT);
- iochan_setflag(h, assoc->cs_get_mask);
- if (assoc->state == ASSOC_DEAD)
- iochan_setevent(assoc->client_chan, EVENT_TIMEOUT);
- }
- else
- {
- assoc->cs_put_mask = EVENT_OUTPUT;
- }
- break;
- default:
- if (conn->io_pending & CS_WANT_WRITE)
- assoc->cs_put_mask |= EVENT_OUTPUT;
- if (conn->io_pending & CS_WANT_READ)
- assoc->cs_put_mask |= EVENT_INPUT;
- iochan_setflag(h, assoc->cs_put_mask);
- }
- }
- if (event & EVENT_EXCEPT)
- {
- yaz_log(LOG_LOG, "ir_session (exception)");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- }
-}
-
-static int process_z_request(association *assoc, request *req, char **msg);
-
-static void assoc_init_reset(association *assoc)
-{
- xfree (assoc->init);
- assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init));
-
- assoc->init->stream = assoc->encode;
- assoc->init->print = assoc->print;
- assoc->init->auth = 0;
- assoc->init->referenceId = 0;
- assoc->init->implementation_version = 0;
- assoc->init->implementation_id = 0;
- assoc->init->implementation_name = 0;
- assoc->init->bend_sort = NULL;
- assoc->init->bend_search = NULL;
- assoc->init->bend_present = NULL;
- assoc->init->bend_esrequest = NULL;
- assoc->init->bend_delete = NULL;
- assoc->init->bend_scan = NULL;
- assoc->init->bend_segment = NULL;
- assoc->init->bend_fetch = NULL;
- assoc->init->bend_explain = NULL;
-
- assoc->init->charneg_request = NULL;
- assoc->init->charneg_response = NULL;
-
- assoc->init->decode = assoc->decode;
- assoc->init->peer_name =
- odr_strdup (assoc->encode, cs_addrstr(assoc->client_link));
-}
-
-static int srw_bend_init(association *assoc)
-{
- const char *encoding = "UTF-8";
- Z_External *ce;
- bend_initresult *binitres;
- statserv_options_block *cb = statserv_getcontrol();
-
- assoc_init_reset(assoc);
-
- assoc->maximumRecordSize = 3000000;
- assoc->preferredMessageSize = 3000000;
-#if 1
- ce = yaz_set_proposal_charneg(assoc->decode, &encoding, 1, 0, 0, 1);
- assoc->init->charneg_request = ce->u.charNeg3;
-#endif
- if (!(binitres = (*cb->bend_init)(assoc->init)))
- {
- yaz_log(LOG_WARN, "Bad response from backend.");
- return 0;
- }
- assoc->backend = binitres->handle;
- return 1;
-}
-
-static int srw_bend_fetch(association *assoc, int pos,
- Z_SRW_searchRetrieveRequest *srw_req,
- Z_SRW_record *record)
-{
- bend_fetch_rr rr;
- ODR o = assoc->encode;
-
- rr.setname = "default";
- rr.number = pos;
- rr.referenceId = 0;
- rr.request_format = VAL_TEXT_XML;
- rr.request_format_raw = yaz_oidval_to_z3950oid(assoc->decode,
- CLASS_TRANSYN,
- VAL_TEXT_XML);
- rr.comp = (Z_RecordComposition *)
- odr_malloc(assoc->decode, sizeof(*rr.comp));
- rr.comp->which = Z_RecordComp_complex;
- rr.comp->u.complex = (Z_CompSpec *)
- odr_malloc(assoc->decode, sizeof(Z_CompSpec));
- rr.comp->u.complex->selectAlternativeSyntax = (bool_t *)
- odr_malloc(assoc->encode, sizeof(bool_t));
- *rr.comp->u.complex->selectAlternativeSyntax = 0;
- rr.comp->u.complex->num_dbSpecific = 0;
- rr.comp->u.complex->dbSpecific = 0;
- rr.comp->u.complex->num_recordSyntax = 0;
- rr.comp->u.complex->recordSyntax = 0;
-
- rr.comp->u.complex->generic = (Z_Specification *)
- odr_malloc(assoc->decode, sizeof(Z_Specification));
- rr.comp->u.complex->generic->which = Z_Schema_uri;
- rr.comp->u.complex->generic->schema.uri = srw_req->recordSchema;
- rr.comp->u.complex->generic->elementSpec = 0;
-
- rr.stream = assoc->encode;
- rr.print = assoc->print;
-
- rr.basename = 0;
- rr.len = 0;
- rr.record = 0;
- rr.last_in_set = 0;
- rr.output_format = VAL_TEXT_XML;
- rr.output_format_raw = 0;
- rr.errcode = 0;
- rr.errstring = 0;
- rr.surrogate_flag = 0;
- rr.schema = srw_req->recordSchema;
-
- if (!assoc->init->bend_fetch)
- return 1;
-
- (*assoc->init->bend_fetch)(assoc->backend, &rr);
-
- if (rr.len >= 0)
- {
- record->recordData_buf = rr.record;
- record->recordData_len = rr.len;
- record->recordPosition = odr_intdup(o, pos);
- if (rr.schema)
- record->recordSchema = odr_strdup(o, rr.schema);
- else
- record->recordSchema = 0;
- }
- return rr.errcode;
-}
-
-static void srw_bend_search(association *assoc, request *req,
- Z_SRW_searchRetrieveRequest *srw_req,
- Z_SRW_searchRetrieveResponse *srw_res)
-{
- int srw_error = 0;
- bend_search_rr rr;
- Z_External *ext;
-
- yaz_log(LOG_LOG, "Got SRW SearchRetrieveRequest");
- yaz_log(LOG_DEBUG, "srw_bend_search");
- if (!assoc->init)
- {
- yaz_log(LOG_DEBUG, "srw_bend_init");
- if (!srw_bend_init(assoc))
- {
- srw_error = 3; /* assume Authentication error */
-
- srw_res->num_diagnostics = 1;
- srw_res->diagnostics = (Z_SRW_diagnostic *)
- odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
- srw_res->diagnostics[0].code =
- odr_intdup(assoc->encode, srw_error);
- srw_res->diagnostics[0].details = 0;
- return;
- }
- }
-
- rr.setname = "default";
- rr.replace_set = 1;
- rr.num_bases = 1;
- rr.basenames = &srw_req->database;
- rr.referenceId = 0;
-
- rr.query = (Z_Query *) odr_malloc (assoc->decode, sizeof(*rr.query));
-
- if (srw_req->query_type == Z_SRW_query_type_cql)
- {
- ext = (Z_External *) odr_malloc(assoc->decode, sizeof(*ext));
- ext->direct_reference = odr_getoidbystr(assoc->decode,
- "1.2.840.10003.16.2");
- ext->indirect_reference = 0;
- ext->descriptor = 0;
- ext->which = Z_External_CQL;
- ext->u.cql = srw_req->query.cql;
-
- rr.query->which = Z_Query_type_104;
- rr.query->u.type_104 = ext;
- }
- else if (srw_req->query_type == Z_SRW_query_type_pqf)
- {
- Z_RPNQuery *RPNquery;
- YAZ_PQF_Parser pqf_parser;
-
- pqf_parser = yaz_pqf_create ();
-
- RPNquery = yaz_pqf_parse (pqf_parser, assoc->decode,
- srw_req->query.pqf);
- if (!RPNquery)
- {
- const char *pqf_msg;
- size_t off;
- int code = yaz_pqf_error (pqf_parser, &pqf_msg, &off);
- yaz_log(LOG_LOG, "%*s^\n", off+4, "");
- yaz_log(LOG_LOG, "Bad PQF: %s (code %d)\n", pqf_msg, code);
-
- srw_error = 10;
- }
-
- rr.query->which = Z_Query_type_1;
- rr.query->u.type_1 = RPNquery;
-
- yaz_pqf_destroy (pqf_parser);
- }
- else
- srw_error = 11;
-
- if (!srw_error && srw_req->sort_type != Z_SRW_sort_type_none)
- srw_error = 80;
-
- if (!srw_error && !assoc->init->bend_search)
- srw_error = 1;
-
- if (srw_error)
- {
- yaz_log(LOG_DEBUG, "srw_bend_search returned SRW error %d", srw_error);
- srw_res->num_diagnostics = 1;
- srw_res->diagnostics = (Z_SRW_diagnostic *)
- odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
- srw_res->diagnostics[0].code =
- odr_intdup(assoc->encode, srw_error);
- srw_res->diagnostics[0].details = 0;
- return;
- }
-
- rr.stream = assoc->encode;
- rr.decode = assoc->decode;
- rr.print = assoc->print;
- rr.request = req;
- rr.association = assoc;
- rr.fd = 0;
- rr.hits = 0;
- rr.errcode = 0;
- rr.errstring = 0;
- rr.search_info = 0;
- yaz_log_zquery(rr.query);
- (assoc->init->bend_search)(assoc->backend, &rr);
- srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
- if (rr.errcode)
- {
- yaz_log(LOG_DEBUG, "bend_search returned Bib-1 code %d", rr.errcode);
- srw_res->num_diagnostics = 1;
- srw_res->diagnostics = (Z_SRW_diagnostic *)
- odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
- srw_res->diagnostics[0].code =
- odr_intdup(assoc->encode,
- yaz_diag_bib1_to_srw (rr.errcode));
- srw_res->diagnostics[0].details = rr.errstring;
- yaz_log(LOG_DEBUG, "srw_bend_search returned SRW error %d",
- *srw_res->diagnostics[0].code);
-
- }
- else
- {
- int number = srw_req->maximumRecords ? *srw_req->maximumRecords : 0;
- int start = srw_req->startRecord ? *srw_req->startRecord : 1;
-
- yaz_log(LOG_LOG, "Request to pack %d+%d out of %d",
- start, number, rr.hits);
-
- srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
- if (number > 0)
- {
- int i;
-
- if (start > rr.hits)
- {
- yaz_log(LOG_LOG, "Request out or range");
- }
- else
- {
- int j = 0;
- int packing = Z_SRW_recordPacking_string;
- if (start + number > rr.hits)
- number = rr.hits - start + 1;
- if (srw_req->recordPacking &&
- !strcmp(srw_req->recordPacking, "xml"))
- packing = Z_SRW_recordPacking_XML;
- srw_res->records = (Z_SRW_record *)
- odr_malloc(assoc->encode,
- number * sizeof(*srw_res->records));
- for (i = 0; i<number; i++)
- {
- int errcode;
-
- srw_res->records[j].recordPacking = packing;
- srw_res->records[j].recordData_buf = 0;
- yaz_log(LOG_DEBUG, "srw_bend_fetch %d", i+start);
- errcode = srw_bend_fetch(assoc, i+start, srw_req,
- srw_res->records + j);
- if (errcode)
- {
- srw_res->num_diagnostics = 1;
- srw_res->diagnostics = (Z_SRW_diagnostic *)
- odr_malloc(assoc->encode,
- sizeof(*srw_res->diagnostics));
- srw_res->diagnostics[0].code =
- odr_intdup(assoc->encode,
- yaz_diag_bib1_to_srw (errcode));
- srw_res->diagnostics[0].details = rr.errstring;
- break;
- }
- if (srw_res->records[j].recordData_buf)
- j++;
- }
- srw_res->num_records = j;
- if (!j)
- srw_res->records = 0;
- }
- }
- }
-}
-
-
-static void srw_bend_explain(association *assoc, request *req,
- Z_SRW_explainRequest *srw_req,
- Z_SRW_explainResponse *srw_res)
-{
- yaz_log(LOG_LOG, "Got SRW ExplainRequest");
- if (!assoc->init)
- {
- yaz_log(LOG_DEBUG, "srw_bend_init");
- if (!srw_bend_init(assoc))
- return;
- }
- if (assoc->init && assoc->init->bend_explain)
- {
- bend_explain_rr rr;
-
- rr.stream = assoc->encode;
- rr.decode = assoc->decode;
- rr.print = assoc->print;
- rr.explain_buf = 0;
- (*assoc->init->bend_explain)(assoc->backend, &rr);
- if (rr.explain_buf)
- {
- srw_res->explainData_buf = rr.explain_buf;
- srw_res->explainData_len = strlen(rr.explain_buf);
- }
- }
-}
-
-static int hex_digit (int ch)
-{
- if (ch >= '0' && ch <= '9')
- return ch - '0';
- else if (ch >= 'a' && ch <= 'f')
- return ch - 'a'+10;
- else if (ch >= 'A' && ch <= 'F')
- return ch - 'A'+10;
- return 0;
-}
-
-static char *uri_val(const char *path, const char *name, ODR o)
-{
- size_t nlen = strlen(name);
- if (*path != '?')
- return 0;
- path++;
- while (path && *path)
- {
- const char *p1 = strchr(path, '=');
- if (!p1)
- break;
- if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen))
- {
- size_t i = 0;
- char *ret;
-
- path = p1 + 1;
- p1 = strchr(path, '&');
- if (!p1)
- p1 = strlen(path) + path;
- ret = odr_malloc(o, p1 - path + 1);
- while (*path && *path != '&')
- {
- if (*path == '+')
- {
- ret[i++] = ' ';
- path++;
- }
- else if (*path == '%' && path[1] && path[2])
- {
- ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
- path = path + 3;
- }
- else
- ret[i++] = *path++;
- }
- ret[i] = '\0';
- return ret;
- }
- path = strchr(p1, '&');
- if (path)
- path++;
- }
- return 0;
-}
-
-void uri_val_int(const char *path, const char *name, ODR o, int **intp)
-{
- const char *v = uri_val(path, name, o);
- if (v)
- *intp = odr_intdup(o, atoi(v));
-}
-
-static void process_http_request(association *assoc, request *req)
-{
- Z_HTTP_Request *hreq = req->gdu_request->u.HTTP_Request;
- ODR o = assoc->encode;
- Z_GDU *p = 0;
- Z_HTTP_Response *hres = 0;
- int keepalive = 1;
-
- if (!strcmp(hreq->method, "GET"))
- {
- char *db = "Default";
- const char *p0 = hreq->path, *p1;
-#if HAVE_XML2
- int ret = -1;
- char *charset = 0;
- Z_SOAP *soap_package = 0;
- static Z_SOAP_Handler soap_handlers[2] = {
- {"http://www.loc.gov/zing/srw/v1.0/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
-#endif
-
- if (*p0 == '/')
- p0++;
- p1 = strchr(p0, '?');
- if (!p1)
- p1 = p0 + strlen(p0);
- if (p1 != p0)
- {
- db = odr_malloc(assoc->decode, p1 - p0 + 1);
- memcpy (db, p0, p1 - p0);
- db[p1 - p0] = '\0';
- }
-#if HAVE_XML2
- if (p1 && *p1 == '?' && p1[1])
- {
- Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_searchRetrieve_response);
- Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_searchRetrieve_request);
- char *query = uri_val(p1, "query", o);
- char *pQuery = uri_val(p1, "pQuery", o);
- char *sortKeys = uri_val(p1, "sortKeys", o);
-
- if (query)
- {
- sr->u.request->query_type = Z_SRW_query_type_cql;
- sr->u.request->query.cql = query;
- }
- if (pQuery)
- {
- sr->u.request->query_type = Z_SRW_query_type_pqf;
- sr->u.request->query.pqf = pQuery;
- }
- if (sortKeys)
- {
- sr->u.request->sort_type = Z_SRW_sort_type_sort;
- sr->u.request->sort.sortKeys = sortKeys;
- }
- sr->u.request->recordSchema = uri_val(p1, "recordSchema", o);
- sr->u.request->recordPacking = uri_val(p1, "recordPacking", o);
- if (!sr->u.request->recordPacking)
- sr->u.request->recordPacking = "xml";
- uri_val_int(p1, "maximumRecords", o,
- &sr->u.request->maximumRecords);
- uri_val_int(p1, "startRecord", o,
- &sr->u.request->startRecord);
- if (sr->u.request->startRecord)
- yaz_log(LOG_LOG, "startRecord=%d", *sr->u.request->startRecord);
- sr->u.request->database = db;
- srw_bend_search(assoc, req, sr->u.request, res->u.response);
-
- soap_package = odr_malloc(o, sizeof(*soap_package));
- soap_package->which = Z_SOAP_generic;
-
- soap_package->u.generic =
- odr_malloc(o, sizeof(*soap_package->u.generic));
-
- soap_package->u.generic->p = res;
- soap_package->u.generic->ns = soap_handlers[0].ns;
- soap_package->u.generic->no = 0;
-
- soap_package->ns = "SRU";
-
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
-
- ret = z_soap_codec_enc(assoc->encode, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers, charset);
- if (!charset)
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
- else
- {
- char ctype[60];
- strcpy(ctype, "text/xml; charset=");
- strcat(ctype, charset);
- z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
- }
-
- }
- else
- {
- Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_explain_response);
- Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_explain_request);
-
- srw_bend_explain(assoc, req, sr->u.explain_request,
- res->u.explain_response);
-
- if (res->u.explain_response->explainData_buf)
- {
- soap_package = odr_malloc(o, sizeof(*soap_package));
- soap_package->which = Z_SOAP_generic;
-
- soap_package->u.generic =
- odr_malloc(o, sizeof(*soap_package->u.generic));
-
- soap_package->u.generic->p = res;
- soap_package->u.generic->ns = soap_handlers[0].ns;
- soap_package->u.generic->no = 0;
-
- soap_package->ns = "SRU";
-
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
-
- ret = z_soap_codec_enc(assoc->encode, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers, charset);
- if (!charset)
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
- else
- {
- char ctype[60];
- strcpy(ctype, "text/xml; charset=");
- strcat(ctype, charset);
- z_HTTP_header_add(o, &hres->headers, "Content-Type",
- ctype);
- }
- }
- }
-#endif
-#ifdef DOCDIR
- if (strlen(hreq->path) >= 5 && strlen(hreq->path) < 80 &&
- !memcmp(hreq->path, "/doc/", 5))
- {
- FILE *f;
- char fpath[120];
-
- strcpy(fpath, DOCDIR);
- strcat(fpath, hreq->path+4);
- f = fopen(fpath, "rb");
- if (f) {
- struct stat sbuf;
- if (fstat(fileno(f), &sbuf) || !S_ISREG(sbuf.st_mode))
- {
- fclose(f);
- f = 0;
- }
- }
- if (f)
- {
- long sz;
- fseek(f, 0L, SEEK_END);
- sz = ftell(f);
- if (sz >= 0 && sz < 500000)
- {
- const char *ctype = "application/octet-stream";
- const char *cp;
-
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
- hres->content_buf = (char *) odr_malloc(o, sz + 1);
- hres->content_len = sz;
- fseek(f, 0L, SEEK_SET);
- fread(hres->content_buf, 1, sz, f);
- if ((cp = strrchr(fpath, '.'))) {
- cp++;
- if (!strcmp(cp, "png"))
- ctype = "image/png";
- else if (!strcmp(cp, "gif"))
- ctype = "image/gif";
- else if (!strcmp(cp, "xml"))
- ctype = "text/xml";
- else if (!strcmp(cp, "html"))
- ctype = "text/html";
- }
- z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
- }
- fclose(f);
- }
- }
-#endif
-
-#if 0
- if (!strcmp(hreq->path, "/"))
- {
-#ifdef DOCDIR
- struct stat sbuf;
-#endif
- const char *doclink = "";
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
- hres->content_buf = (char *) odr_malloc(o, 400);
-#ifdef DOCDIR
- if (stat(DOCDIR "/yaz.html", &sbuf) == 0 && S_ISREG(sbuf.st_mode))
- doclink = "<P><A HREF=\"/doc/yaz.html\">Documentation</A></P>";
-#endif
- sprintf (hres->content_buf,
- "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
- "<HTML>\n"
- " <HEAD>\n"
- " <TITLE>YAZ " YAZ_VERSION "</TITLE>\n"
- " </HEAD>\n"
- " <BODY>\n"
- " <P><A HREF=\"http://www.indexdata.dk/yaz/\">YAZ</A> "
- YAZ_VERSION "</P>\n"
- "%s"
- " </BODY>\n"
- "</HTML>\n", doclink);
- hres->content_len = strlen(hres->content_buf);
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
- }
-#endif
-
- if (!p)
- {
- p = z_get_HTTP_Response(o, 404);
- }
- }
- else if (!strcmp(hreq->method, "POST"))
- {
- const char *content_type = z_HTTP_header_lookup(hreq->headers,
- "Content-Type");
- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
- {
- Z_SOAP *soap_package = 0;
- int ret = -1;
- int http_code = 500;
- const char *charset_p = 0;
- char *charset = 0;
-
- static Z_SOAP_Handler soap_handlers[2] = {
-#if HAVE_XML2
- {"http://www.loc.gov/zing/srw/v1.0/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
-#endif
- {0, 0, 0}
- };
- if ((charset_p = strstr(content_type, "; charset=")))
- {
- int i = 0;
- charset_p += 10;
- while (i < 20 && charset_p[i] &&
- !strchr("; \n\r", charset_p[i]))
- i++;
- charset = odr_malloc(assoc->encode, i+1);
- memcpy(charset, charset_p, i);
- charset[i] = '\0';
- yaz_log(LOG_LOG, "SOAP encoding %s", charset);
- }
- ret = z_soap_codec(assoc->decode, &soap_package,
- &hreq->content_buf, &hreq->content_len,
- soap_handlers);
-#if HAVE_XML2
- if (!ret && soap_package->which == Z_SOAP_generic &&
- soap_package->u.generic->no == 0)
- {
- /* SRW package */
- Z_SRW_PDU *sr = soap_package->u.generic->p;
-
- if (sr->which == Z_SRW_searchRetrieve_request)
- {
- Z_SRW_PDU *res =
- yaz_srw_get(assoc->encode,
- Z_SRW_searchRetrieve_response);
-
- if (!sr->u.request->database)
- {
- const char *p0 = hreq->path, *p1;
- if (*p0 == '/')
- p0++;
- p1 = strchr(p0, '?');
- if (!p1)
- p1 = p0 + strlen(p0);
- if (p1 != p0)
- {
- sr->u.request->database =
- odr_malloc(assoc->decode, p1 - p0 + 1);
- memcpy (sr->u.request->database, p0, p1 - p0);
- sr->u.request->database[p1 - p0] = '\0';
- }
- else
- sr->u.request->database = "Default";
- }
- srw_bend_search(assoc, req, sr->u.request,
- res->u.response);
-
- soap_package->u.generic->p = res;
- http_code = 200;
- }
- else if (sr->which == Z_SRW_explain_request)
- {
- Z_SRW_PDU *res =
- yaz_srw_get(assoc->encode, Z_SRW_explain_response);
-
- srw_bend_explain(assoc, req, sr->u.explain_request,
- res->u.explain_response);
- if (!res->u.explain_response->explainData_buf)
- {
- z_soap_error(assoc->encode, soap_package,
- "SOAP-ENV:Client", "Explain Not Supported", 0);
- }
- else
- {
- soap_package->u.generic->p = res;
- http_code = 200;
- }
- }
- else
- {
- z_soap_error(assoc->encode, soap_package,
- "SOAP-ENV:Client", "Bad method", 0);
- }
- }
-#endif
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
- ret = z_soap_codec_enc(assoc->encode, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers, charset);
- hres->code = http_code;
- if (!charset)
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
- else
- {
- char ctype[60];
- strcpy(ctype, "text/xml; charset=");
- strcat(ctype, charset);
- z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
- }
- }
- if (!p) /* still no response ? */
- p = z_get_HTTP_Response(o, 500);
- }
- else
- {
- p = z_get_HTTP_Response(o, 405);
- hres = p->u.HTTP_Response;
-
- z_HTTP_header_add(o, &hres->headers, "Allow", "GET, POST");
- }
- hres = p->u.HTTP_Response;
- if (!strcmp(hreq->version, "1.0"))
- {
- const char *v = z_HTTP_header_lookup(hreq->headers, "Connection");
- if (v && !strcmp(v, "Keep-Alive"))
- keepalive = 1;
- else
- keepalive = 0;
- hres->version = "1.0";
- }
- else
- {
- const char *v = z_HTTP_header_lookup(hreq->headers, "Connection");
- if (v && !strcmp(v, "close"))
- keepalive = 0;
- else
- keepalive = 1;
- hres->version = "1.1";
- }
- if (!keepalive)
- {
- z_HTTP_header_add(o, &hres->headers, "Connection", "close");
- assoc->state = ASSOC_DEAD;
- }
- else
- {
- int t;
- const char *alive = z_HTTP_header_lookup(hreq->headers, "Keep-Alive");
-
- if (alive && isdigit(*alive))
- t = atoi(alive);
- else
- t = 15;
- if (t < 0 || t > 3600)
- t = 3600;
- iochan_settimeout(assoc->client_chan,t);
- z_HTTP_header_add(o, &hres->headers, "Connection", "Keep-Alive");
- }
- process_gdu_response(assoc, req, p);
-}
-
-static void process_gdu_request(association *assoc, request *req)
-{
- if (req->gdu_request->which == Z_GDU_Z3950)
- {
- char *msg = 0;
- req->apdu_request = req->gdu_request->u.z3950;
- if (process_z_request(assoc, req, &msg) < 0)
- do_close_req(assoc, Z_Close_systemProblem, msg, req);
- }
- else if (req->gdu_request->which == Z_GDU_HTTP_Request)
- process_http_request(assoc, req);
- else
- {
- do_close_req(assoc, Z_Close_systemProblem, "bad protocol packet", req);
- }
-}
-
-/*
- * Initiate request processing.
- */
-static int process_z_request(association *assoc, request *req, char **msg)
-{
- int fd = -1;
- Z_APDU *res;
- int retval;
-
- *msg = "Unknown Error";
- assert(req && req->state == REQUEST_IDLE);
- if (req->apdu_request->which != Z_APDU_initRequest && !assoc->init)
- {
- *msg = "Missing InitRequest";
- return -1;
- }
- switch (req->apdu_request->which)
- {
- case Z_APDU_initRequest:
- iochan_settimeout(assoc->client_chan,
- statserv_getcontrol()->idle_timeout * 60);
- res = process_initRequest(assoc, req); break;
- case Z_APDU_searchRequest:
- res = process_searchRequest(assoc, req, &fd); break;
- case Z_APDU_presentRequest:
- res = process_presentRequest(assoc, req, &fd); break;
- case Z_APDU_scanRequest:
- if (assoc->init->bend_scan)
- res = process_scanRequest(assoc, req, &fd);
- else
- {
- *msg = "Cannot handle Scan APDU";
- return -1;
- }
- break;
- case Z_APDU_extendedServicesRequest:
- if (assoc->init->bend_esrequest)
- res = process_ESRequest(assoc, req, &fd);
- else
- {
- *msg = "Cannot handle Extended Services APDU";
- return -1;
- }
- break;
- case Z_APDU_sortRequest:
- if (assoc->init->bend_sort)
- res = process_sortRequest(assoc, req, &fd);
- else
- {
- *msg = "Cannot handle Sort APDU";
- return -1;
- }
- break;
- case Z_APDU_close:
- process_close(assoc, req);
- return 0;
- case Z_APDU_deleteResultSetRequest:
- if (assoc->init->bend_delete)
- res = process_deleteRequest(assoc, req, &fd);
- else
- {
- *msg = "Cannot handle Delete APDU";
- return -1;
- }
- break;
- case Z_APDU_segmentRequest:
- if (assoc->init->bend_segment)
- {
- res = process_segmentRequest (assoc, req);
- }
- else
- {
- *msg = "Cannot handle Segment APDU";
- return -1;
- }
- break;
- default:
- *msg = "Bad APDU received";
- return -1;
- }
- if (res)
- {
- yaz_log(LOG_DEBUG, " result immediately available");
- retval = process_z_response(assoc, req, res);
- }
- else if (fd < 0)
- {
- yaz_log(LOG_DEBUG, " result unavailble");
- retval = 0;
- }
- else /* no result yet - one will be provided later */
- {
- IOCHAN chan;
-
- /* Set up an I/O handler for the fd supplied by the backend */
-
- yaz_log(LOG_DEBUG, " establishing handler for result");
- req->state = REQUEST_PENDING;
- if (!(chan = iochan_create(fd, backend_response, EVENT_INPUT)))
- abort();
- iochan_setdata(chan, assoc);
- retval = 0;
- }
- return retval;
-}
-
-/*
- * Handle message from the backend.
- */
-void backend_response(IOCHAN i, int event)
-{
- association *assoc = (association *)iochan_getdata(i);
- request *req = request_head(&assoc->incoming);
- Z_APDU *res;
- int fd;
-
- yaz_log(LOG_DEBUG, "backend_response");
- assert(assoc && req && req->state != REQUEST_IDLE);
- /* determine what it is we're waiting for */
- switch (req->apdu_request->which)
- {
- case Z_APDU_searchRequest:
- res = response_searchRequest(assoc, req, 0, &fd); break;
-#if 0
- case Z_APDU_presentRequest:
- res = response_presentRequest(assoc, req, 0, &fd); break;
- case Z_APDU_scanRequest:
- res = response_scanRequest(assoc, req, 0, &fd); break;
-#endif
- default:
- yaz_log(LOG_WARN, "Serious programmer's lapse or bug");
- abort();
- }
- if ((res && process_z_response(assoc, req, res) < 0) || fd < 0)
- {
- yaz_log(LOG_LOG, "Fatal error when talking to backend");
- do_close(assoc, Z_Close_systemProblem, 0);
- iochan_destroy(i);
- return;
- }
- else if (!res) /* no result yet - try again later */
- {
- yaz_log(LOG_DEBUG, " no result yet");
- iochan_setfd(i, fd); /* in case fd has changed */
- }
-}
-
-/*
- * Encode response, and transfer the request structure to the outgoing queue.
- */
-static int process_gdu_response(association *assoc, request *req, Z_GDU *res)
-{
- odr_setbuf(assoc->encode, req->response, req->size_response, 1);
-
- if (assoc->print && !z_GDU(assoc->print, &res, 0, 0))
- {
- yaz_log(LOG_WARN, "ODR print error: %s",
- odr_errmsg(odr_geterror(assoc->print)));
- odr_reset(assoc->print);
- }
- if (!z_GDU(assoc->encode, &res, 0, 0))
- {
- yaz_log(LOG_WARN, "ODR error when encoding PDU: %s [element %s]",
- odr_errmsg(odr_geterror(assoc->decode)),
- odr_getelement(assoc->decode));
- request_release(req);
- return -1;
- }
- req->response = odr_getbuf(assoc->encode, &req->len_response,
- &req->size_response);
- odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */
- odr_reset(assoc->encode);
- req->state = REQUEST_IDLE;
- request_enq(&assoc->outgoing, req);
- /* turn the work over to the ir_session handler */
- iochan_setflag(assoc->client_chan, EVENT_OUTPUT);
- assoc->cs_put_mask = EVENT_OUTPUT;
- /* Is there more work to be done? give that to the input handler too */
-#if 1
- if (request_head(&assoc->incoming))
- {
- yaz_log (LOG_DEBUG, "more work to be done");
- iochan_setevent(assoc->client_chan, EVENT_WORK);
- }
-#endif
- return 0;
-}
-
-/*
- * Encode response, and transfer the request structure to the outgoing queue.
- */
-static int process_z_response(association *assoc, request *req, Z_APDU *res)
-{
- Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*res));
- gres->which = Z_GDU_Z3950;
- gres->u.z3950 = res;
-
- return process_gdu_response(assoc, req, gres);
-}
-
-
-/*
- * Handle init request.
- * At the moment, we don't check the options
- * anywhere else in the code - we just try not to do anything that would
- * break a naive client. We'll toss 'em into the association block when
- * we need them there.
- */
-static Z_APDU *process_initRequest(association *assoc, request *reqb)
-{
- statserv_options_block *cb = statserv_getcontrol();
- Z_InitRequest *req = reqb->apdu_request->u.initRequest;
- Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_initResponse);
- Z_InitResponse *resp = apdu->u.initResponse;
- bend_initresult *binitres;
-
- char options[140];
-
- yaz_log(LOG_LOG, "Got initRequest");
- if (req->implementationId)
- yaz_log(LOG_LOG, "Id: %s", req->implementationId);
- if (req->implementationName)
- yaz_log(LOG_LOG, "Name: %s", req->implementationName);
- if (req->implementationVersion)
- yaz_log(LOG_LOG, "Version: %s", req->implementationVersion);
-
- assoc_init_reset(assoc);
-
- assoc->init->auth = req->idAuthentication;
- assoc->init->referenceId = req->referenceId;
-
- if (ODR_MASK_GET(req->options, Z_Options_negotiationModel))
- {
- Z_CharSetandLanguageNegotiation *negotiation =
- yaz_get_charneg_record (req->otherInfo);
- if (negotiation->which == Z_CharSetandLanguageNegotiation_proposal)
- assoc->init->charneg_request = negotiation;
- }
-
- if (!(binitres = (*cb->bend_init)(assoc->init)))
- {
- yaz_log(LOG_WARN, "Bad response from backend.");
- return 0;
- }
-
- assoc->backend = binitres->handle;
- if ((assoc->init->bend_sort))
- yaz_log (LOG_DEBUG, "Sort handler installed");
- if ((assoc->init->bend_search))
- yaz_log (LOG_DEBUG, "Search handler installed");
- if ((assoc->init->bend_present))
- yaz_log (LOG_DEBUG, "Present handler installed");
- if ((assoc->init->bend_esrequest))
- yaz_log (LOG_DEBUG, "ESRequest handler installed");
- if ((assoc->init->bend_delete))
- yaz_log (LOG_DEBUG, "Delete handler installed");
- if ((assoc->init->bend_scan))
- yaz_log (LOG_DEBUG, "Scan handler installed");
- if ((assoc->init->bend_segment))
- yaz_log (LOG_DEBUG, "Segment handler installed");
-
- resp->referenceId = req->referenceId;
- *options = '\0';
- /* let's tell the client what we can do */
- if (ODR_MASK_GET(req->options, Z_Options_search))
- {
- ODR_MASK_SET(resp->options, Z_Options_search);
- strcat(options, "srch");
- }
- if (ODR_MASK_GET(req->options, Z_Options_present))
- {
- ODR_MASK_SET(resp->options, Z_Options_present);
- strcat(options, " prst");
- }
- if (ODR_MASK_GET(req->options, Z_Options_delSet) &&
- assoc->init->bend_delete)
- {
- ODR_MASK_SET(resp->options, Z_Options_delSet);
- strcat(options, " del");
- }
- if (ODR_MASK_GET(req->options, Z_Options_extendedServices) &&
- assoc->init->bend_esrequest)
- {
- ODR_MASK_SET(resp->options, Z_Options_extendedServices);
- strcat (options, " extendedServices");
- }
- if (ODR_MASK_GET(req->options, Z_Options_namedResultSets))
- {
- ODR_MASK_SET(resp->options, Z_Options_namedResultSets);
- strcat(options, " namedresults");
- }
- if (ODR_MASK_GET(req->options, Z_Options_scan) && assoc->init->bend_scan)
- {
- ODR_MASK_SET(resp->options, Z_Options_scan);
- strcat(options, " scan");
- }
- if (ODR_MASK_GET(req->options, Z_Options_concurrentOperations))
- {
- ODR_MASK_SET(resp->options, Z_Options_concurrentOperations);
- strcat(options, " concurrop");
- }
- if (ODR_MASK_GET(req->options, Z_Options_sort) && assoc->init->bend_sort)
- {
- ODR_MASK_SET(resp->options, Z_Options_sort);
- strcat(options, " sort");
- }
-
- if (ODR_MASK_GET(req->options, Z_Options_negotiationModel)
- && assoc->init->charneg_response)
- {
- Z_OtherInformation **p;
- Z_OtherInformationUnit *p0;
-
- yaz_oi_APDU(apdu, &p);
-
- if ((p0=yaz_oi_update(p, assoc->encode, NULL, 0, 0))) {
- ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
-
- p0->which = Z_OtherInfo_externallyDefinedInfo;
- p0->information.externallyDefinedInfo =
- assoc->init->charneg_response;
- }
- ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
- strcat(options, " negotiation");
- }
-
- if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1))
- {
- ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_1);
- assoc->version = 2; /* 1 & 2 are equivalent */
- }
- if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_2))
- {
- ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_2);
- assoc->version = 2;
- }
- if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_3))
- {
- ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_3);
- assoc->version = 3;
- }
-
- yaz_log(LOG_LOG, "Negotiated to v%d: %s", assoc->version, options);
- assoc->maximumRecordSize = *req->maximumRecordSize;
- if (assoc->maximumRecordSize > control_block->maxrecordsize)
- assoc->maximumRecordSize = control_block->maxrecordsize;
- assoc->preferredMessageSize = *req->preferredMessageSize;
- if (assoc->preferredMessageSize > assoc->maximumRecordSize)
- assoc->preferredMessageSize = assoc->maximumRecordSize;
-
- resp->preferredMessageSize = &assoc->preferredMessageSize;
- resp->maximumRecordSize = &assoc->maximumRecordSize;
-
- resp->implementationName = "GFS/YAZ";
-
- if (assoc->init->implementation_id)
- {
- char *nv = (char *)
- odr_malloc (assoc->encode,
- strlen(assoc->init->implementation_id) + 10 +
- strlen(resp->implementationId));
- sprintf (nv, "%s / %s",
- resp->implementationId, assoc->init->implementation_id);
- resp->implementationId = nv;
- }
- if (assoc->init->implementation_name)
- {
- char *nv = (char *)
- odr_malloc (assoc->encode,
- strlen(assoc->init->implementation_name) + 10 +
- strlen(resp->implementationName));
- sprintf (nv, "%s / %s",
- resp->implementationName, assoc->init->implementation_name);
- resp->implementationName = nv;
- }
- if (assoc->init->implementation_version)
- {
- char *nv = (char *)
- odr_malloc (assoc->encode,
- strlen(assoc->init->implementation_version) + 10 +
- strlen(resp->implementationVersion));
- sprintf (nv, "YAZ %s / %s",
- resp->implementationVersion,
- assoc->init->implementation_version);
- resp->implementationVersion = nv;
- }
-
- if (binitres->errcode)
- {
- yaz_log(LOG_LOG, "Connection rejected by backend.");
- *resp->result = 0;
- assoc->state = ASSOC_DEAD;
- resp->userInformationField = init_diagnostics(assoc->encode,
- binitres->errcode,
- binitres->errstring);
- }
- else
- assoc->state = ASSOC_UP;
- return apdu;
-}
-
-/*
- * Diagnostic in default format, to be returned as either a surrogate
- * or non-surrogate diagnostic in the context of an open session, or
- * as User-information when an Init is refused.
- */
-static Z_DefaultDiagFormat *justdiag(ODR odr, int error, char *addinfo)
-{
- int *err = odr_intdup(odr, error);
- Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
- odr_malloc (odr, sizeof(*dr));
-
- yaz_log(LOG_LOG, "[%d] %s%s%s", error, diagbib1_str(error),
- addinfo ? " -- " : "", addinfo ? addinfo : "");
-
- dr->diagnosticSetId =
- yaz_oidval_to_z3950oid (odr, CLASS_DIAGSET, VAL_BIB1);
- dr->condition = err;
- dr->which = Z_DefaultDiagFormat_v2Addinfo;
- dr->u.v2Addinfo = odr_strdup (odr, addinfo ? addinfo : "");
- return dr;
-}
-
-/*
- * Set the specified `errcode' and `errstring' into a UserInfo-1
- * external to be returned to the client in accordance with Z35.90
- * Implementor Agreement 5 (Returning diagnostics in an InitResponse):
- * http://lcweb.loc.gov/z3950/agency/agree/initdiag.html
- */
-static Z_External *init_diagnostics(ODR odr, int error, char *addinfo)
-{
- Z_External *x, *x2;
- oident oid;
- Z_OtherInformation *u;
- Z_OtherInformationUnit *l;
- Z_DiagnosticFormat *d;
- Z_DiagnosticFormat_s *e;
-
- x = (Z_External*) odr_malloc(odr, sizeof *x);
- x->descriptor = 0;
- x->indirect_reference = 0;
- oid.proto = PROTO_Z3950;
- oid.oclass = CLASS_USERINFO;
- oid.value = VAL_USERINFO1;
- x->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
- x->which = Z_External_userInfo1;
-
- u = odr_malloc(odr, sizeof *u);
- x->u.userInfo1 = u;
- u->num_elements = 1;
- u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
- u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
- l = u->list[0];
- l->category = 0;
- l->which = Z_OtherInfo_externallyDefinedInfo;
-
- x2 = (Z_External*) odr_malloc(odr, sizeof *x);
- l->information.externallyDefinedInfo = x2;
- x2->descriptor = 0;
- x2->indirect_reference = 0;
- oid.oclass = CLASS_DIAGSET;
- oid.value = VAL_DIAG1;
- x2->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
- x2->which = Z_External_diag1;
-
- d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
- x2->u.diag1 = d;
- d->num = 1;
- d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
- d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
- e = d->elements[0];
-
- e->which = Z_DiagnosticFormat_s_defaultDiagRec;
- e->u.defaultDiagRec = justdiag(odr, error, addinfo);
- return x;
-}
-
-/*
- * nonsurrogate diagnostic record.
- */
-static Z_Records *diagrec(association *assoc, int error, char *addinfo)
-{
- Z_Records *rec = (Z_Records *)
- odr_malloc (assoc->encode, sizeof(*rec));
- rec->which = Z_Records_NSD;
- rec->u.nonSurrogateDiagnostic = justdiag(assoc->encode, error, addinfo);
- return rec;
-}
-
-/*
- * surrogate diagnostic.
- */
-static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname,
- int error, char *addinfo)
-{
- Z_NamePlusRecord *rec = (Z_NamePlusRecord *)
- odr_malloc (assoc->encode, sizeof(*rec));
- Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec));
-
- yaz_log(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo);
- rec->databaseName = dbname;
- rec->which = Z_NamePlusRecord_surrogateDiagnostic;
- rec->u.surrogateDiagnostic = drec;
- drec->which = Z_DiagRec_defaultFormat;
- drec->u.defaultFormat = justdiag(assoc->encode, error, addinfo);
-
- return rec;
-}
-
-/*
- * multiple nonsurrogate diagnostics.
- */
-static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo)
-{
- Z_DiagRecs *recs = (Z_DiagRecs *)odr_malloc (assoc->encode, sizeof(*recs));
- int *err = odr_intdup(assoc->encode, error);
- Z_DiagRec **recp = (Z_DiagRec **)odr_malloc (assoc->encode, sizeof(*recp));
- Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec));
- Z_DefaultDiagFormat *rec = (Z_DefaultDiagFormat *)
- odr_malloc (assoc->encode, sizeof(*rec));
-
- yaz_log(LOG_DEBUG, "DiagRecs: %d -- %s", error, addinfo ? addinfo : "");
-
- recs->num_diagRecs = 1;
- recs->diagRecs = recp;
- recp[0] = drec;
- drec->which = Z_DiagRec_defaultFormat;
- drec->u.defaultFormat = rec;
-
- rec->diagnosticSetId =
- yaz_oidval_to_z3950oid (assoc->encode, CLASS_DIAGSET, VAL_BIB1);
- rec->condition = err;
-
- rec->which = Z_DefaultDiagFormat_v2Addinfo;
- rec->u.v2Addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : "");
- return recs;
-}
-
-static Z_Records *pack_records(association *a, char *setname, int start,
- int *num, Z_RecordComposition *comp,
- int *next, int *pres, oid_value format,
- Z_ReferenceId *referenceId,
- int *oid)
-{
- int recno, total_length = 0, toget = *num, dumped_records = 0;
- Z_Records *records =
- (Z_Records *) odr_malloc (a->encode, sizeof(*records));
- Z_NamePlusRecordList *reclist =
- (Z_NamePlusRecordList *) odr_malloc (a->encode, sizeof(*reclist));
- Z_NamePlusRecord **list =
- (Z_NamePlusRecord **) odr_malloc (a->encode, sizeof(*list) * toget);
-
- records->which = Z_Records_DBOSD;
- records->u.databaseOrSurDiagnostics = reclist;
- reclist->num_records = 0;
- reclist->records = list;
- *pres = Z_PRES_SUCCESS;
- *num = 0;
- *next = 0;
-
- yaz_log(LOG_LOG, "Request to pack %d+%d+%s", start, toget, setname);
- yaz_log(LOG_DEBUG, "pms=%d, mrs=%d", a->preferredMessageSize,
- a->maximumRecordSize);
- for (recno = start; reclist->num_records < toget; recno++)
- {
- bend_fetch_rr freq;
- Z_NamePlusRecord *thisrec;
- int this_length = 0;
- /*
- * we get the number of bytes allocated on the stream before any
- * allocation done by the backend - this should give us a reasonable
- * idea of the total size of the data so far.
- */
- total_length = odr_total(a->encode) - dumped_records;
- freq.errcode = 0;
- freq.errstring = 0;
- freq.basename = 0;
- freq.len = 0;
- freq.record = 0;
- freq.last_in_set = 0;
- freq.setname = setname;
- freq.surrogate_flag = 0;
- freq.number = recno;
- freq.comp = comp;
- freq.request_format = format;
- freq.request_format_raw = oid;
- freq.output_format = format;
- freq.output_format_raw = 0;
- freq.stream = a->encode;
- freq.print = a->print;
- freq.referenceId = referenceId;
- freq.schema = 0;
- (*a->init->bend_fetch)(a->backend, &freq);
- /* backend should be able to signal whether error is system-wide
- or only pertaining to current record */
- if (freq.errcode)
- {
- if (!freq.surrogate_flag)
- {
- char s[20];
- *pres = Z_PRES_FAILURE;
- /* for 'present request out of range',
- set addinfo to record position if not set */
- if (freq.errcode == 13 && freq.errstring == 0)
- {
- sprintf (s, "%d", recno);
- freq.errstring = s;
- }
- return diagrec(a, freq.errcode, freq.errstring);
- }
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, freq.errcode,
- freq.errstring);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- continue;
- }
- if (freq.len >= 0)
- this_length = freq.len;
- else
- this_length = odr_total(a->encode) - total_length;
- yaz_log(LOG_DEBUG, " fetched record, len=%d, total=%d",
- this_length, total_length);
- if (this_length + total_length > a->preferredMessageSize)
- {
- /* record is small enough, really */
- if (this_length <= a->preferredMessageSize)
- {
- yaz_log(LOG_DEBUG, " Dropped last normal-sized record");
- *pres = Z_PRES_PARTIAL_2;
- break;
- }
- /* record can only be fetched by itself */
- if (this_length < a->maximumRecordSize)
- {
- yaz_log(LOG_DEBUG, " Record > prefmsgsz");
- if (toget > 1)
- {
- yaz_log(LOG_DEBUG, " Dropped it");
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 16, 0);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- dumped_records += this_length;
- continue;
- }
- }
- else /* too big entirely */
- {
- yaz_log(LOG_LOG, "Record > maxrcdsz this=%d max=%d", this_length, a->maximumRecordSize);
- reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 17, 0);
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- dumped_records += this_length;
- continue;
- }
- }
-
- if (!(thisrec = (Z_NamePlusRecord *)
- odr_malloc(a->encode, sizeof(*thisrec))))
- return 0;
- if (!(thisrec->databaseName = (char *)odr_malloc(a->encode,
- strlen(freq.basename) + 1)))
- return 0;
- strcpy(thisrec->databaseName, freq.basename);
- thisrec->which = Z_NamePlusRecord_databaseRecord;
-
- if (freq.output_format_raw)
- {
- struct oident *ident = oid_getentbyoid(freq.output_format_raw);
- freq.output_format = ident->value;
- }
- thisrec->u.databaseRecord = z_ext_record(a->encode, freq.output_format,
- freq.record, freq.len);
- if (!thisrec->u.databaseRecord)
- return 0;
- reclist->records[reclist->num_records] = thisrec;
- reclist->num_records++;
- *next = freq.last_in_set ? 0 : recno + 1;
- }
- *num = reclist->num_records;
- return records;
-}
-
-static Z_APDU *process_searchRequest(association *assoc, request *reqb,
- int *fd)
-{
- Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
- bend_search_rr *bsrr =
- (bend_search_rr *)nmem_malloc (reqb->request_mem, sizeof(*bsrr));
-
- yaz_log(LOG_LOG, "Got SearchRequest.");
- bsrr->fd = fd;
- bsrr->request = reqb;
- bsrr->association = assoc;
- bsrr->referenceId = req->referenceId;
- save_referenceId (reqb, bsrr->referenceId);
-
- yaz_log (LOG_LOG, "ResultSet '%s'", req->resultSetName);
- if (req->databaseNames)
- {
- int i;
- for (i = 0; i < req->num_databaseNames; i++)
- yaz_log (LOG_LOG, "Database '%s'", req->databaseNames[i]);
- }
- yaz_log_zquery(req->query);
-
- if (assoc->init->bend_search)
- {
- bsrr->setname = req->resultSetName;
- bsrr->replace_set = *req->replaceIndicator;
- bsrr->num_bases = req->num_databaseNames;
- bsrr->basenames = req->databaseNames;
- bsrr->query = req->query;
- bsrr->stream = assoc->encode;
- bsrr->decode = assoc->decode;
- bsrr->print = assoc->print;
- bsrr->errcode = 0;
- bsrr->hits = 0;
- bsrr->errstring = NULL;
- bsrr->search_info = NULL;
- (assoc->init->bend_search)(assoc->backend, bsrr);
- if (!bsrr->request)
- return 0;
- }
- return response_searchRequest(assoc, reqb, bsrr, fd);
-}
-
-int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;}
-
-/*
- * Prepare a searchresponse based on the backend results. We probably want
- * to look at making the fetching of records nonblocking as well, but
- * so far, we'll keep things simple.
- * If bsrt is null, that means we're called in response to a communications
- * event, and we'll have to get the response for ourselves.
- */
-static Z_APDU *response_searchRequest(association *assoc, request *reqb,
- bend_search_rr *bsrt, int *fd)
-{
- Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
- Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
- Z_SearchResponse *resp = (Z_SearchResponse *)
- odr_malloc (assoc->encode, sizeof(*resp));
- int *nulint = odr_intdup (assoc->encode, 0);
- bool_t *sr = odr_intdup(assoc->encode, 1);
- int *next = odr_intdup(assoc->encode, 0);
- int *none = odr_intdup(assoc->encode, Z_RES_NONE);
-
- apdu->which = Z_APDU_searchResponse;
- apdu->u.searchResponse = resp;
- resp->referenceId = req->referenceId;
- resp->additionalSearchInfo = 0;
- resp->otherInfo = 0;
- *fd = -1;
- if (!bsrt && !bend_searchresponse(assoc->backend, bsrt))
- {
- yaz_log(LOG_FATAL, "Bad result from backend");
- return 0;
- }
- else if (bsrt->errcode)
- {
- resp->records = diagrec(assoc, bsrt->errcode, bsrt->errstring);
- resp->resultCount = nulint;
- resp->numberOfRecordsReturned = nulint;
- resp->nextResultSetPosition = nulint;
- resp->searchStatus = nulint;
- resp->resultSetStatus = none;
- resp->presentStatus = 0;
- }
- else
- {
- int *toget = odr_intdup(assoc->encode, 0);
- int *presst = odr_intdup(assoc->encode, 0);
- Z_RecordComposition comp, *compp = 0;
-
- yaz_log (LOG_LOG, "resultCount: %d", bsrt->hits);
-
- resp->records = 0;
- resp->resultCount = &bsrt->hits;
-
- comp.which = Z_RecordComp_simple;
- /* how many records does the user agent want, then? */
- if (bsrt->hits <= *req->smallSetUpperBound)
- {
- *toget = bsrt->hits;
- if ((comp.u.simple = req->smallSetElementSetNames))
- compp = ∁
- }
- else if (bsrt->hits < *req->largeSetLowerBound)
- {
- *toget = *req->mediumSetPresentNumber;
- if (*toget > bsrt->hits)
- *toget = bsrt->hits;
- if ((comp.u.simple = req->mediumSetElementSetNames))
- compp = ∁
- }
- else
- *toget = 0;
-
- if (*toget && !resp->records)
- {
- oident *prefformat;
- oid_value form;
-
- if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)))
- form = VAL_NONE;
- else
- form = prefformat->value;
- resp->records = pack_records(assoc, req->resultSetName, 1,
- toget, compp, next, presst, form, req->referenceId,
- req->preferredRecordSyntax);
- if (!resp->records)
- return 0;
- resp->numberOfRecordsReturned = toget;
- resp->nextResultSetPosition = next;
- resp->searchStatus = sr;
- resp->resultSetStatus = 0;
- resp->presentStatus = presst;
- }
- else
- {
- if (*resp->resultCount)
- *next = 1;
- resp->numberOfRecordsReturned = nulint;
- resp->nextResultSetPosition = next;
- resp->searchStatus = sr;
- resp->resultSetStatus = 0;
- resp->presentStatus = 0;
- }
- }
- resp->additionalSearchInfo = bsrt->search_info;
- return apdu;
-}
-
-/*
- * Maybe we got a little over-friendly when we designed bend_fetch to
- * get only one record at a time. Some backends can optimise multiple-record
- * fetches, and at any rate, there is some overhead involved in
- * all that selecting and hopping around. Problem is, of course, that the
- * frontend can't know ahead of time how many records it'll need to
- * fill the negotiated PDU size. Annoying. Segmentation or not, Z/SR
- * is downright lousy as a bulk data transfer protocol.
- *
- * To start with, we'll do the fetching of records from the backend
- * in one operation: To save some trips in and out of the event-handler,
- * and to simplify the interface to pack_records. At any rate, asynch
- * operation is more fun in operations that have an unpredictable execution
- * speed - which is normally more true for search than for present.
- */
-static Z_APDU *process_presentRequest(association *assoc, request *reqb,
- int *fd)
-{
- Z_PresentRequest *req = reqb->apdu_request->u.presentRequest;
- oident *prefformat;
- oid_value form;
- Z_APDU *apdu;
- Z_PresentResponse *resp;
- int *next;
- int *num;
-
- yaz_log(LOG_LOG, "Got PresentRequest.");
-
- if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)))
- form = VAL_NONE;
- else
- form = prefformat->value;
- resp = (Z_PresentResponse *)odr_malloc (assoc->encode, sizeof(*resp));
- resp->records = 0;
- resp->presentStatus = odr_intdup(assoc->encode, 0);
- if (assoc->init->bend_present)
- {
- bend_present_rr *bprr = (bend_present_rr *)
- nmem_malloc (reqb->request_mem, sizeof(*bprr));
- bprr->setname = req->resultSetId;
- bprr->start = *req->resultSetStartPoint;
- bprr->number = *req->numberOfRecordsRequested;
- bprr->format = form;
- bprr->comp = req->recordComposition;
- bprr->referenceId = req->referenceId;
- bprr->stream = assoc->encode;
- bprr->print = assoc->print;
- bprr->request = reqb;
- bprr->association = assoc;
- bprr->errcode = 0;
- bprr->errstring = NULL;
- (*assoc->init->bend_present)(assoc->backend, bprr);
-
- if (!bprr->request)
- return 0;
- if (bprr->errcode)
- {
- resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
- *resp->presentStatus = Z_PRES_FAILURE;
- }
- }
- apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
- next = odr_intdup(assoc->encode, 0);
- num = odr_intdup(assoc->encode, 0);
-
- apdu->which = Z_APDU_presentResponse;
- apdu->u.presentResponse = resp;
- resp->referenceId = req->referenceId;
- resp->otherInfo = 0;
-
- if (!resp->records)
- {
- *num = *req->numberOfRecordsRequested;
- resp->records =
- pack_records(assoc, req->resultSetId, *req->resultSetStartPoint,
- num, req->recordComposition, next, resp->presentStatus,
- form, req->referenceId, req->preferredRecordSyntax);
- }
- if (!resp->records)
- return 0;
- resp->numberOfRecordsReturned = num;
- resp->nextResultSetPosition = next;
-
- return apdu;
-}
-
-/*
- * Scan was implemented rather in a hurry, and with support for only the basic
- * elements of the service in the backend API. Suggestions are welcome.
- */
-static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
-{
- Z_ScanRequest *req = reqb->apdu_request->u.scanRequest;
- Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
- Z_ScanResponse *res = (Z_ScanResponse *)
- odr_malloc (assoc->encode, sizeof(*res));
- int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
- int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
- Z_ListEntries *ents = (Z_ListEntries *)
- odr_malloc (assoc->encode, sizeof(*ents));
- Z_DiagRecs *diagrecs_p = NULL;
- oident *attset;
- bend_scan_rr *bsrr = (bend_scan_rr *)
- odr_malloc (assoc->encode, sizeof(*bsrr));
- struct scan_entry *save_entries;
-
- yaz_log(LOG_LOG, "Got ScanRequest");
-
- apdu->which = Z_APDU_scanResponse;
- apdu->u.scanResponse = res;
- res->referenceId = req->referenceId;
-
- /* if step is absent, set it to 0 */
- res->stepSize = odr_intdup(assoc->encode, 0);
- if (req->stepSize)
- *res->stepSize = *req->stepSize;
-
- res->scanStatus = scanStatus;
- res->numberOfEntriesReturned = numberOfEntriesReturned;
- res->positionOfTerm = 0;
- res->entries = ents;
- ents->num_entries = 0;
- ents->entries = NULL;
- ents->num_nonsurrogateDiagnostics = 0;
- ents->nonsurrogateDiagnostics = NULL;
- res->attributeSet = 0;
- res->otherInfo = 0;
-
- if (req->databaseNames)
- {
- int i;
- for (i = 0; i < req->num_databaseNames; i++)
- yaz_log (LOG_LOG, "Database '%s'", req->databaseNames[i]);
- }
- bsrr->num_bases = req->num_databaseNames;
- bsrr->basenames = req->databaseNames;
- bsrr->num_entries = *req->numberOfTermsRequested;
- bsrr->term = req->termListAndStartPoint;
- bsrr->referenceId = req->referenceId;
- bsrr->stream = assoc->encode;
- bsrr->print = assoc->print;
- bsrr->step_size = res->stepSize;
- bsrr->entries = 0;
- /* Note that version 2.0 of YAZ and older did not set entries ..
- We do now. And when we do it's easier to extend the scan entry
- We know that if the scan handler did set entries, it will
- not know of new member display_term.
- */
- if (bsrr->num_entries > 0)
- {
- int i;
- bsrr->entries = odr_malloc(assoc->decode, sizeof(*bsrr->entries) *
- bsrr->num_entries);
- for (i = 0; i<bsrr->num_entries; i++)
- {
- bsrr->entries[i].term = 0;
- bsrr->entries[i].occurrences = 0;
- bsrr->entries[i].errcode = 0;
- bsrr->entries[i].errstring = 0;
- bsrr->entries[i].display_term = 0;
- }
- }
- save_entries = bsrr->entries; /* save it so we can compare later */
-
- if (req->attributeSet &&
- (attset = oid_getentbyoid(req->attributeSet)) &&
- (attset->oclass == CLASS_ATTSET || attset->oclass == CLASS_GENERAL))
- bsrr->attributeset = attset->value;
- else
- bsrr->attributeset = VAL_NONE;
- log_scan_term (req->termListAndStartPoint, bsrr->attributeset);
- bsrr->term_position = req->preferredPositionInResponse ?
- *req->preferredPositionInResponse : 1;
- ((int (*)(void *, bend_scan_rr *))
- (*assoc->init->bend_scan))(assoc->backend, bsrr);
- if (bsrr->errcode)
- diagrecs_p = diagrecs(assoc, bsrr->errcode, bsrr->errstring);
- else
- {
- int i;
- Z_Entry **tab = (Z_Entry **)
- odr_malloc (assoc->encode, sizeof(*tab) * bsrr->num_entries);
-
- if (bsrr->status == BEND_SCAN_PARTIAL)
- *scanStatus = Z_Scan_partial_5;
- else
- *scanStatus = Z_Scan_success;
- ents->entries = tab;
- ents->num_entries = bsrr->num_entries;
- res->numberOfEntriesReturned = &ents->num_entries;
- res->positionOfTerm = &bsrr->term_position;
- for (i = 0; i < bsrr->num_entries; i++)
- {
- Z_Entry *e;
- Z_TermInfo *t;
- Odr_oct *o;
-
- tab[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e));
- if (bsrr->entries[i].occurrences >= 0)
- {
- e->which = Z_Entry_termInfo;
- e->u.termInfo = t = (Z_TermInfo *)
- odr_malloc(assoc->encode, sizeof(*t));
- t->suggestedAttributes = 0;
- t->displayTerm = 0;
- if (save_entries == bsrr->entries &&
- bsrr->entries[i].display_term)
- {
- /* the entries was NOT set by the handler. So it's
- safe to test for new member display_term. It is
- NULL'ed by us.
- */
- t->displayTerm = odr_strdup(assoc->encode,
- bsrr->entries[i].display_term);
- }
- t->alternativeTerm = 0;
- t->byAttributes = 0;
- t->otherTermInfo = 0;
- t->globalOccurrences = &bsrr->entries[i].occurrences;
- t->term = (Z_Term *)
- odr_malloc(assoc->encode, sizeof(*t->term));
- t->term->which = Z_Term_general;
- t->term->u.general = o =
- (Odr_oct *)odr_malloc(assoc->encode, sizeof(Odr_oct));
- o->buf = (unsigned char *)
- odr_malloc(assoc->encode, o->len = o->size =
- strlen(bsrr->entries[i].term));
- memcpy(o->buf, bsrr->entries[i].term, o->len);
- yaz_log(LOG_DEBUG, " term #%d: '%s' (%d)", i,
- bsrr->entries[i].term, bsrr->entries[i].occurrences);
- }
- else
- {
- Z_DiagRecs *drecs = diagrecs (assoc,
- bsrr->entries[i].errcode,
- bsrr->entries[i].errstring);
- assert (drecs->num_diagRecs == 1);
- e->which = Z_Entry_surrogateDiagnostic;
- assert (drecs->diagRecs[0]);
- e->u.surrogateDiagnostic = drecs->diagRecs[0];
- }
- }
- }
- if (diagrecs_p)
- {
- ents->num_nonsurrogateDiagnostics = diagrecs_p->num_diagRecs;
- ents->nonsurrogateDiagnostics = diagrecs_p->diagRecs;
- }
- return apdu;
-}
-
-static Z_APDU *process_sortRequest(association *assoc, request *reqb,
- int *fd)
-{
- Z_SortRequest *req = reqb->apdu_request->u.sortRequest;
- Z_SortResponse *res = (Z_SortResponse *)
- odr_malloc (assoc->encode, sizeof(*res));
- bend_sort_rr *bsrr = (bend_sort_rr *)
- odr_malloc (assoc->encode, sizeof(*bsrr));
-
- Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
-
- yaz_log(LOG_LOG, "Got SortRequest.");
-
- bsrr->num_input_setnames = req->num_inputResultSetNames;
- bsrr->input_setnames = req->inputResultSetNames;
- bsrr->referenceId = req->referenceId;
- bsrr->output_setname = req->sortedResultSetName;
- bsrr->sort_sequence = req->sortSequence;
- bsrr->stream = assoc->encode;
- bsrr->print = assoc->print;
-
- bsrr->sort_status = Z_SortStatus_failure;
- bsrr->errcode = 0;
- bsrr->errstring = 0;
-
- (*assoc->init->bend_sort)(assoc->backend, bsrr);
-
- res->referenceId = bsrr->referenceId;
- res->sortStatus = odr_intdup(assoc->encode, bsrr->sort_status);
- res->resultSetStatus = 0;
- if (bsrr->errcode)
- {
- Z_DiagRecs *dr = diagrecs (assoc, bsrr->errcode, bsrr->errstring);
- res->diagnostics = dr->diagRecs;
- res->num_diagnostics = dr->num_diagRecs;
- }
- else
- {
- res->num_diagnostics = 0;
- res->diagnostics = 0;
- }
- res->resultCount = 0;
- res->otherInfo = 0;
-
- apdu->which = Z_APDU_sortResponse;
- apdu->u.sortResponse = res;
- return apdu;
-}
-
-static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
- int *fd)
-{
- Z_DeleteResultSetRequest *req =
- reqb->apdu_request->u.deleteResultSetRequest;
- Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *)
- odr_malloc (assoc->encode, sizeof(*res));
- bend_delete_rr *bdrr = (bend_delete_rr *)
- odr_malloc (assoc->encode, sizeof(*bdrr));
- Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
-
- yaz_log(LOG_LOG, "Got DeleteRequest.");
-
- bdrr->num_setnames = req->num_resultSetList;
- bdrr->setnames = req->resultSetList;
- bdrr->stream = assoc->encode;
- bdrr->print = assoc->print;
- bdrr->function = *req->deleteFunction;
- bdrr->referenceId = req->referenceId;
- bdrr->statuses = 0;
- if (bdrr->num_setnames > 0)
- {
- int i;
- bdrr->statuses = (int*)
- odr_malloc(assoc->encode, sizeof(*bdrr->statuses) *
- bdrr->num_setnames);
- for (i = 0; i < bdrr->num_setnames; i++)
- bdrr->statuses[i] = 0;
- }
- (*assoc->init->bend_delete)(assoc->backend, bdrr);
-
- res->referenceId = req->referenceId;
-
- res->deleteOperationStatus = odr_intdup(assoc->encode,bdrr->delete_status);
-
- res->deleteListStatuses = 0;
- if (bdrr->num_setnames > 0)
- {
- int i;
- res->deleteListStatuses = (Z_ListStatuses *)
- odr_malloc(assoc->encode, sizeof(*res->deleteListStatuses));
- res->deleteListStatuses->num = bdrr->num_setnames;
- res->deleteListStatuses->elements =
- (Z_ListStatus **)
- odr_malloc (assoc->encode,
- sizeof(*res->deleteListStatuses->elements) *
- bdrr->num_setnames);
- for (i = 0; i<bdrr->num_setnames; i++)
- {
- res->deleteListStatuses->elements[i] =
- (Z_ListStatus *)
- odr_malloc (assoc->encode,
- sizeof(**res->deleteListStatuses->elements));
- res->deleteListStatuses->elements[i]->status = bdrr->statuses+i;
- res->deleteListStatuses->elements[i]->id =
- odr_strdup (assoc->encode, bdrr->setnames[i]);
-
- }
- }
- res->numberNotDeleted = 0;
- res->bulkStatuses = 0;
- res->deleteMessage = 0;
- res->otherInfo = 0;
-
- apdu->which = Z_APDU_deleteResultSetResponse;
- apdu->u.deleteResultSetResponse = res;
- return apdu;
-}
-
-static void process_close(association *assoc, request *reqb)
-{
- Z_Close *req = reqb->apdu_request->u.close;
- static char *reasons[] =
- {
- "finished",
- "shutdown",
- "systemProblem",
- "costLimit",
- "resources",
- "securityViolation",
- "protocolError",
- "lackOfActivity",
- "peerAbort",
- "unspecified"
- };
-
- yaz_log(LOG_LOG, "Got Close, reason %s, message %s",
- reasons[*req->closeReason], req->diagnosticInformation ?
- req->diagnosticInformation : "NULL");
- if (assoc->version < 3) /* to make do_force respond with close */
- assoc->version = 3;
- do_close_req(assoc, Z_Close_finished,
- "Association terminated by client", reqb);
-}
-
-void save_referenceId (request *reqb, Z_ReferenceId *refid)
-{
- if (refid)
- {
- reqb->len_refid = refid->len;
- reqb->refid = (char *)nmem_malloc (reqb->request_mem, refid->len);
- memcpy (reqb->refid, refid->buf, refid->len);
- }
- else
- {
- reqb->len_refid = 0;
- reqb->refid = NULL;
- }
-}
-
-void bend_request_send (bend_association a, bend_request req, Z_APDU *res)
-{
- process_z_response (a, req, res);
-}
-
-bend_request bend_request_mk (bend_association a)
-{
- request *nreq = request_get (&a->outgoing);
- nreq->request_mem = nmem_create ();
- return nreq;
-}
-
-Z_ReferenceId *bend_request_getid (ODR odr, bend_request req)
-{
- Z_ReferenceId *id;
- if (!req->refid)
- return 0;
- id = (Odr_oct *)odr_malloc (odr, sizeof(*odr));
- id->buf = (unsigned char *)odr_malloc (odr, req->len_refid);
- id->len = id->size = req->len_refid;
- memcpy (id->buf, req->refid, req->len_refid);
- return id;
-}
-
-void bend_request_destroy (bend_request *req)
-{
- nmem_destroy((*req)->request_mem);
- request_release(*req);
- *req = NULL;
-}
-
-int bend_backend_respond (bend_association a, bend_request req)
-{
- char *msg;
- int r;
- r = process_z_request (a, req, &msg);
- if (r < 0)
- yaz_log (LOG_WARN, "%s", msg);
- return r;
-}
-
-void bend_request_setdata(bend_request r, void *p)
-{
- r->clientData = p;
-}
-
-void *bend_request_getdata(bend_request r)
-{
- return r->clientData;
-}
-
-static Z_APDU *process_segmentRequest (association *assoc, request *reqb)
-{
- bend_segment_rr req;
-
- req.segment = reqb->apdu_request->u.segmentRequest;
- req.stream = assoc->encode;
- req.decode = assoc->decode;
- req.print = assoc->print;
- req.association = assoc;
-
- (*assoc->init->bend_segment)(assoc->backend, &req);
-
- return 0;
-}
-
-static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
-{
- bend_esrequest_rr esrequest;
-
- Z_ExtendedServicesRequest *req =
- reqb->apdu_request->u.extendedServicesRequest;
- Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_extendedServicesResponse);
-
- Z_ExtendedServicesResponse *resp = apdu->u.extendedServicesResponse;
-
- yaz_log(LOG_DEBUG,"inside Process esRequest");
-
- esrequest.esr = reqb->apdu_request->u.extendedServicesRequest;
- esrequest.stream = assoc->encode;
- esrequest.decode = assoc->decode;
- esrequest.print = assoc->print;
- esrequest.errcode = 0;
- esrequest.errstring = NULL;
- esrequest.request = reqb;
- esrequest.association = assoc;
- esrequest.taskPackage = 0;
- esrequest.referenceId = req->referenceId;
-
- (*assoc->init->bend_esrequest)(assoc->backend, &esrequest);
-
- /* If the response is being delayed, return NULL */
- if (esrequest.request == NULL)
- return(NULL);
-
- resp->referenceId = req->referenceId;
-
- if (esrequest.errcode == -1)
- {
- /* Backend service indicates request will be processed */
- yaz_log(LOG_DEBUG,"Request could be processed...Accepted !");
- *resp->operationStatus = Z_ExtendedServicesResponse_accepted;
- }
- else if (esrequest.errcode == 0)
- {
- /* Backend service indicates request will be processed */
- yaz_log(LOG_DEBUG,"Request could be processed...Done !");
- *resp->operationStatus = Z_ExtendedServicesResponse_done;
- }
- else
- {
- Z_DiagRecs *diagRecs = diagrecs (assoc, esrequest.errcode,
- esrequest.errstring);
-
- /* Backend indicates error, request will not be processed */
- yaz_log(LOG_DEBUG,"Request could not be processed...failure !");
- *resp->operationStatus = Z_ExtendedServicesResponse_failure;
- resp->num_diagnostics = diagRecs->num_diagRecs;
- resp->diagnostics = diagRecs->diagRecs;
- }
- /* Do something with the members of bend_extendedservice */
- if (esrequest.taskPackage)
- resp->taskPackage = z_ext_record (assoc->encode, VAL_EXTENDED,
- (const char *) esrequest.taskPackage,
- -1);
- yaz_log(LOG_DEBUG,"Send the result apdu");
- return apdu;
-}
-
+++ /dev/null
-/*
- * Copyright (C) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: session.h,v 1.29 2003-02-17 21:23:31 adam Exp $
- */
-
-#ifndef SESSION_H
-#define SESSION_H
-
-#include <sys/types.h>
-#include <yaz/comstack.h>
-#include <yaz/odr.h>
-#include <yaz/oid.h>
-#include <yaz/proto.h>
-#include "eventl.h"
-
-typedef enum {
- REQUEST_IDLE, /* the request is just sitting in the queue */
- REQUEST_PENDING /* operation pending (b'end processing or network I/O*/
- /* this list will have more elements when acc/res control is added */
-} request_state;
-
-typedef struct request
-{
- int len_refid; /* length of referenceid */
- char *refid; /* referenceid */
- request_state state;
-
- Z_GDU *gdu_request; /* Current request */
- Z_APDU *apdu_request; /* Current Z39.50 request */
- NMEM request_mem; /* memory handle for request */
-
- int size_response; /* size of buffer */
- int len_response; /* length of encoded data */
- char *response; /* encoded data waiting for transmission */
-
- void *clientData;
- struct request *next;
- struct request_q *q;
-} request;
-
-typedef struct request_q
-{
- request *head;
- request *tail;
- request *list;
- int num;
-} request_q;
-
-/*
- * association state.
- */
-typedef enum
-{
- ASSOC_NEW, /* not initialized yet */
- ASSOC_UP, /* normal operation */
- ASSOC_DEAD /* dead. Close if input arrives */
-} association_state;
-
-typedef struct association
-{
- IOCHAN client_chan; /* event-loop control */
- COMSTACK client_link; /* communication handle */
- ODR decode; /* decoding stream */
- ODR encode; /* encoding stream */
- ODR print; /* printing stream (for -a) */
- char *encode_buffer; /* temporary buffer for encoded data */
- int encoded_len; /* length of encoded data */
- char *input_buffer; /* input buffer (allocated by comstack) */
- int input_buffer_len; /* length (size) of buffer */
- int input_apdu_len; /* length of current incoming APDU */
- oid_proto proto; /* protocol (PROTO_Z3950/PROTO_SR) */
- void *backend; /* backend handle */
- request_q incoming; /* Q of incoming PDUs */
- request_q outgoing; /* Q of outgoing data buffers (enc. PDUs) */
- association_state state;
-
- /* session parameters */
- int preferredMessageSize;
- int maximumRecordSize;
- int version; /* highest version-bit set (2 or 3) */
-
- unsigned cs_get_mask;
- unsigned cs_put_mask;
- unsigned cs_accept_mask;
-
- struct bend_initrequest *init;
-} association;
-
-association *create_association(IOCHAN channel, COMSTACK link);
-void destroy_association(association *h);
-void ir_session(IOCHAN h, int event);
-
-void request_enq(request_q *q, request *r);
-request *request_head(request_q *q);
-request *request_deq(request_q *q);
-request *request_deq_x(request_q *q, request *r);
-void request_initq(request_q *q);
-void request_delq(request_q *q);
-request *request_get(request_q *q);
-void request_release(request *r);
-
-int statserv_must_terminate(void);
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * NT threaded server code by
- * Chas Woodfield, Fretwell Downing Informatics.
- *
- * $Id: statserv.c,v 1.98 2003-03-03 19:57:35 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#ifdef WIN32
-#include <process.h>
-#include <winsock.h>
-#include <direct.h>
-#include "service.h"
-#else
-#include <unistd.h>
-#include <pwd.h>
-#endif
-
-#if YAZ_POSIX_THREADS
-#include <pthread.h>
-#elif YAZ_GNU_THREADS
-#include <pth.h>
-#endif
-
-#include <fcntl.h>
-#include <signal.h>
-#include <errno.h>
-
-#include <yaz/comstack.h>
-#include <yaz/tcpip.h>
-#include <yaz/options.h>
-#ifdef USE_XTIMOSI
-#include <yaz/xmosi.h>
-#endif
-#include <yaz/log.h>
-#include "eventl.h"
-#include "session.h"
-#include <yaz/statserv.h>
-
-static IOCHAN pListener = NULL;
-
-static char *me = "statserver";
-/*
- * default behavior.
- */
-int check_options(int argc, char **argv);
-statserv_options_block control_block = {
- 1, /* dynamic mode */
- 0, /* threaded mode */
- 0, /* one shot (single session) */
- LOG_DEFAULT_LEVEL, /* log level */
- "", /* no PDUs */
- "", /* diagnostic output to stderr */
- "tcp:@:9999", /* default listener port */
- PROTO_Z3950, /* default application protocol */
- 15, /* idle timeout (minutes) */
- 1024*1024, /* maximum PDU size (approx.) to allow */
- "default-config", /* configuration name to pass to backend */
- "", /* set user id */
- 0, /* bend_start handler */
- 0, /* bend_stop handler */
- check_options, /* Default routine, for checking the run-time arguments */
- check_ip_tcpd,
- "",
- 0, /* default value for inet deamon */
- 0, /* handle (for service, etc) */
- 0, /* bend_init handle */
- 0, /* bend_close handle */
-#ifdef WIN32
- "Z39.50 Server", /* NT Service Name */
- "Server", /* NT application Name */
- "", /* NT Service Dependencies */
- "Z39.50 Server", /* NT Service Display Name */
-#endif /* WIN32 */
- 0 /* SOAP handlers */
-};
-
-static int max_sessions = 0;
-
-/*
- * handle incoming connect requests.
- * The dynamic mode is a bit tricky mostly because we want to avoid
- * doing all of the listening and accepting in the parent - it's
- * safer that way.
- */
-#ifdef WIN32
-
-typedef struct _ThreadList ThreadList;
-
-struct _ThreadList
-{
- HANDLE hThread;
- IOCHAN pIOChannel;
- ThreadList *pNext;
-};
-
-static ThreadList *pFirstThread;
-static CRITICAL_SECTION Thread_CritSect;
-static BOOL bInitialized = FALSE;
-
-static void ThreadList_Initialize()
-{
- /* Initialize the critical Sections */
- InitializeCriticalSection(&Thread_CritSect);
-
- /* Set the first thraed */
- pFirstThread = NULL;
-
- /* we have been initialized */
- bInitialized = TRUE;
-}
-
-static void statserv_add(HANDLE hThread, IOCHAN pIOChannel)
-{
- /* Only one thread can go through this section at a time */
- EnterCriticalSection(&Thread_CritSect);
-
- {
- /* Lets create our new object */
- ThreadList *pNewThread = (ThreadList *)malloc(sizeof(ThreadList));
- pNewThread->hThread = hThread;
- pNewThread->pIOChannel = pIOChannel;
- pNewThread->pNext = pFirstThread;
- pFirstThread = pNewThread;
-
- /* Lets let somebody else create a new object now */
- LeaveCriticalSection(&Thread_CritSect);
- }
-}
-
-void statserv_remove(IOCHAN pIOChannel)
-{
- /* Only one thread can go through this section at a time */
- EnterCriticalSection(&Thread_CritSect);
-
- {
- ThreadList *pCurrentThread = pFirstThread;
- ThreadList *pNextThread;
- ThreadList *pPrevThread =NULL;
-
- /* Step through alll the threads */
- for (; pCurrentThread != NULL; pCurrentThread = pNextThread)
- {
- /* We only need to compare on the IO Channel */
- if (pCurrentThread->pIOChannel == pIOChannel)
- {
- /* We have found the thread we want to delete */
- /* First of all reset the next pointers */
- if (pPrevThread == NULL)
- pFirstThread = pCurrentThread->pNext;
- else
- pPrevThread->pNext = pCurrentThread->pNext;
-
- /* All we need todo now is delete the memory */
- free(pCurrentThread);
-
- /* No need to look at any more threads */
- pNextThread = NULL;
- }
- else
- {
- /* We need to look at another thread */
- pNextThread = pCurrentThread->pNext;
- pPrevThread = pCurrentThread;
- }
- }
-
- /* Lets let somebody else remove an object now */
- LeaveCriticalSection(&Thread_CritSect);
- }
-}
-
-/* WIN32 statserv_closedown */
-void statserv_closedown()
-{
- /* Shouldn't do anything if we are not initialized */
- if (bInitialized)
- {
- int iHandles = 0;
- HANDLE *pThreadHandles = NULL;
-
- /* We need to stop threads adding and removing while we */
- /* start the closedown process */
- EnterCriticalSection(&Thread_CritSect);
-
- {
- /* We have exclusive access to the thread stuff now */
- /* Y didn't i use a semaphore - Oh well never mind */
- ThreadList *pCurrentThread = pFirstThread;
-
- /* Before we do anything else, we need to shutdown the listener */
- if (pListener != NULL)
- iochan_destroy(pListener);
-
- for (; pCurrentThread != NULL; pCurrentThread = pCurrentThread->pNext)
- {
- /* Just destroy the IOCHAN, that should do the trick */
- iochan_destroy(pCurrentThread->pIOChannel);
- closesocket(pCurrentThread->pIOChannel->fd);
-
- /* Keep a running count of our handles */
- iHandles++;
- }
-
- if (iHandles > 0)
- {
- HANDLE *pCurrentHandle ;
-
- /* Allocate the thread handle array */
- pThreadHandles = (HANDLE *)malloc(sizeof(HANDLE) * iHandles);
- pCurrentHandle = pThreadHandles;
-
- for (pCurrentThread = pFirstThread;
- pCurrentThread != NULL;
- pCurrentThread = pCurrentThread->pNext, pCurrentHandle++)
- {
- /* Just the handle */
- *pCurrentHandle = pCurrentThread->hThread;
- }
- }
-
- /* We can now leave the critical section */
- LeaveCriticalSection(&Thread_CritSect);
- }
-
- /* Now we can really do something */
- if (iHandles > 0)
- {
- logf (LOG_LOG, "waiting for %d to die", iHandles);
- /* This will now wait, until all the threads close */
- WaitForMultipleObjects(iHandles, pThreadHandles, TRUE, INFINITE);
-
- /* Free the memory we allocated for the handle array */
- free(pThreadHandles);
- }
-
- if (control_block.bend_stop)
- (*control_block.bend_stop)(&control_block);
- /* No longer require the critical section, since all threads are dead */
- DeleteCriticalSection(&Thread_CritSect);
- }
-}
-
-void __cdecl event_loop_thread (IOCHAN iochan)
-{
- event_loop (&iochan);
-}
-
-/* WIN32 listener */
-static void listener(IOCHAN h, int event)
-{
- COMSTACK line = (COMSTACK) iochan_getdata(h);
- association *newas;
- int res;
- HANDLE newHandle;
-
- if (event == EVENT_INPUT)
- {
- if ((res = cs_listen(line, 0, 0)) < 0)
- {
- yaz_log(LOG_FATAL, "cs_listen failed");
- return;
- }
- else if (res == 1)
- return;
- yaz_log(LOG_DEBUG, "listen ok");
- iochan_setevent(h, EVENT_OUTPUT);
- iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */
- }
- else if (event == EVENT_OUTPUT)
- {
- COMSTACK new_line = cs_accept(line);
- IOCHAN new_chan;
- char *a = NULL;
-
- if (!new_line)
- {
- yaz_log(LOG_FATAL, "Accept failed.");
- iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT);
- return;
- }
- yaz_log(LOG_DEBUG, "Accept ok");
-
- if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session,
- EVENT_INPUT)))
- {
- yaz_log(LOG_FATAL, "Failed to create iochan");
- iochan_destroy(h);
- return;
- }
-
- yaz_log(LOG_DEBUG, "Creating association");
- if (!(newas = create_association(new_chan, new_line)))
- {
- yaz_log(LOG_FATAL, "Failed to create new assoc.");
- iochan_destroy(h);
- return;
- }
- newas->cs_get_mask = EVENT_INPUT;
- newas->cs_put_mask = 0;
- newas->cs_accept_mask = 0;
-
- yaz_log(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout);
- iochan_setdata(new_chan, newas);
- iochan_settimeout(new_chan, 60);
-
- /* Now what we need todo is create a new thread with this iochan as
- the parameter */
- newHandle = (HANDLE) _beginthread(event_loop_thread, 0, new_chan);
- if (newHandle == (HANDLE) -1)
- {
-
- yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create new thread.");
- iochan_destroy(h);
- return;
- }
- /* We successfully created the thread, so add it to the list */
- statserv_add(newHandle, new_chan);
-
- yaz_log(LOG_DEBUG, "Created new thread, id = %ld iochan %p",(long) newHandle, new_chan);
- iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
- }
- else
- {
- yaz_log(LOG_FATAL, "Bad event on listener.");
- iochan_destroy(h);
- return;
- }
-}
-
-int statserv_must_terminate(void)
-{
- return 0;
-}
-
-#else /* ! WIN32 */
-
-static int term_flag = 0;
-/* To save having an #ifdef in event_loop we need to
- define this empty function
-*/
-int statserv_must_terminate(void)
-{
- return term_flag;
-}
-
-void statserv_remove(IOCHAN pIOChannel)
-{
-}
-
-void statserv_closedown()
-{
- IOCHAN p;
-
- if (control_block.bend_stop)
- (*control_block.bend_stop)(&control_block);
- for (p = pListener; p; p = p->next)
- {
- iochan_destroy(p);
- }
-}
-
-void sigterm(int sig)
-{
- term_flag = 1;
-}
-
-static void *new_session (void *vp);
-static int no_sessions = 0;
-
-/* UNIX listener */
-static void listener(IOCHAN h, int event)
-{
- COMSTACK line = (COMSTACK) iochan_getdata(h);
- static int hand[2];
- static int child = 0;
- int res;
-
- if (event == EVENT_INPUT)
- {
- if (control_block.dynamic && !child)
- {
- int res;
-
- ++no_sessions;
- if (pipe(hand) < 0)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "pipe");
- iochan_destroy(h);
- return;
- }
- if ((res = fork()) < 0)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "fork");
- iochan_destroy(h);
- return;
- }
- else if (res == 0) /* child */
- {
- char nbuf[100];
- IOCHAN pp;
-
- close(hand[0]);
- child = 1;
- for (pp = pListener; pp; pp = iochan_getnext(pp))
- {
- if (pp != h)
- {
- COMSTACK l = (COMSTACK)iochan_getdata(pp);
- cs_close(l);
- iochan_destroy(pp);
- }
- }
- sprintf(nbuf, "%s(%d)", me, getpid());
- yaz_log_init(control_block.loglevel, nbuf, 0);
- /* ensure that bend_stop is not called when each child exits -
- only for the main process ..
- */
- control_block.bend_stop = 0;
- }
- else /* parent */
- {
- close(hand[1]);
- /* wait for child to take the call */
- for (;;)
- {
- char dummy[1];
- int res;
-
- if ((res = read(hand[0], dummy, 1)) < 0 &&
- yaz_errno() != EINTR)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "handshake read");
- return;
- }
- else if (res >= 0)
- break;
- }
- yaz_log(LOG_DEBUG, "P: Child has taken the call");
- close(hand[0]);
- return;
- }
- }
- if ((res = cs_listen_check(line, 0, 0, control_block.check_ip,
- control_block.daemon_name)) < 0)
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "cs_listen failed");
- return;
- }
- else if (res == 1)
- return;
- yaz_log(LOG_DEBUG, "listen ok");
- iochan_setevent(h, EVENT_OUTPUT);
- iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */
- }
- /* in dynamic mode, only the child ever comes down here */
- else if (event == EVENT_OUTPUT)
- {
- COMSTACK new_line = cs_accept(line);
-
- if (!new_line)
- {
- yaz_log(LOG_FATAL, "Accept failed.");
- iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
- return;
- }
- yaz_log(LOG_DEBUG, "accept ok");
- if (control_block.dynamic)
- {
- IOCHAN pp;
- /* close our half of the listener socket */
- for (pp = pListener; pp; pp = iochan_getnext(pp))
- {
- COMSTACK l = (COMSTACK)iochan_getdata(pp);
- cs_close(l);
- iochan_destroy(pp);
- }
- /* release dad */
- yaz_log(LOG_DEBUG, "Releasing parent");
- close(hand[1]);
- }
- else
- {
- iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
- ++no_sessions;
- }
-#if YAZ_POSIX_THREADS
- if (control_block.threads)
- {
- pthread_t child_thread;
- pthread_create (&child_thread, 0, new_session, new_line);
- pthread_detach (child_thread);
- }
- else
- new_session(new_line);
-#elif YAZ_GNU_THREADS
- if (control_block.threads)
- {
- pth_attr_t attr;
- pth_t child_thread;
-
- attr = pth_attr_new ();
- pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE);
- pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024);
- pth_attr_set (attr, PTH_ATTR_NAME, "session");
- yaz_log (LOG_LOG, "pth_spawn begin");
- child_thread = pth_spawn (attr, new_session, new_line);
- yaz_log (LOG_LOG, "pth_spawn finish");
- pth_attr_destroy (attr);
- }
- else
- new_session(new_line);
-#else
- new_session(new_line);
-#endif
- }
- else if (event == EVENT_TIMEOUT)
- {
- yaz_log(LOG_LOG, "Shutting down listener.");
- iochan_destroy(h);
- }
- else
- {
- yaz_log(LOG_FATAL, "Bad event on listener.");
- iochan_destroy(h);
- }
-}
-
-static void *new_session (void *vp)
-{
- char *a;
- association *newas;
- IOCHAN new_chan;
- COMSTACK new_line = (COMSTACK) vp;
-
- unsigned cs_get_mask, cs_accept_mask, mask =
- ((new_line->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) |
- ((new_line->io_pending & CS_WANT_READ) ? EVENT_INPUT : 0);
-
- if (mask)
- {
- cs_accept_mask = mask; /* accept didn't complete */
- cs_get_mask = 0;
- }
- else
- {
- cs_accept_mask = 0; /* accept completed. */
- cs_get_mask = mask = EVENT_INPUT;
- }
-
- if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, mask)))
- {
- yaz_log(LOG_FATAL, "Failed to create iochan");
- return 0;
- }
- if (!(newas = create_association(new_chan, new_line)))
- {
- yaz_log(LOG_FATAL, "Failed to create new assoc.");
- return 0;
- }
- newas->cs_accept_mask = cs_accept_mask;
- newas->cs_get_mask = cs_get_mask;
-
- iochan_setdata(new_chan, newas);
- iochan_settimeout(new_chan, 60);
-#if 1
- a = cs_addrstr(new_line);
-#else
- a = 0;
-#endif
- yaz_log(LOG_LOG, "Starting session %d from %s",
- no_sessions, a ? a : "[Unknown]");
- if (max_sessions && no_sessions == max_sessions)
- control_block.one_shot = 1;
- if (control_block.threads)
- {
- event_loop(&new_chan);
- }
- else
- {
- new_chan->next = pListener;
- pListener = new_chan;
- }
- return 0;
-}
-
-/* UNIX */
-#endif
-
-static void inetd_connection(int what)
-{
- COMSTACK line;
- IOCHAN chan;
- association *assoc;
- char *addr;
-
- if ((line = cs_createbysocket(0, tcpip_type, 0, what)))
- {
- if ((chan = iochan_create(cs_fileno(line), ir_session, EVENT_INPUT)))
- {
- if ((assoc = create_association(chan, line)))
- {
- iochan_setdata(chan, assoc);
- iochan_settimeout(chan, 60);
- addr = cs_addrstr(line);
- yaz_log(LOG_LOG, "Inetd association from %s",
- addr ? addr : "[UNKNOWN]");
- assoc->cs_get_mask = EVENT_INPUT;
- }
- else
- {
- yaz_log(LOG_FATAL, "Failed to create association structure");
- }
- chan->next = pListener;
- pListener = chan;
- }
- else
- {
- yaz_log(LOG_FATAL, "Failed to create iochan");
- }
- }
- else
- {
- yaz_log(LOG_ERRNO|LOG_FATAL, "Failed to create comstack on socket 0");
- }
-}
-
-/*
- * Set up a listening endpoint, and give it to the event-handler.
- */
-static int add_listener(char *where, int what)
-{
- COMSTACK l;
- void *ap;
- IOCHAN lst = NULL;
- const char *mode;
-
- if (control_block.dynamic)
- mode = "dynamic";
- else if (control_block.threads)
- mode = "threaded";
- else
- mode = "static";
-
- yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode,
- what == PROTO_SR ? "SR" : "Z3950", where);
-
- l = cs_create_host(where, 0, &ap);
- if (!l)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where);
- return -1;
- }
- if (cs_bind(l, ap, CS_SERVER) < 0)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where);
- cs_close (l);
- return -1;
- }
- if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT |
- EVENT_EXCEPT)))
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create IOCHAN-type");
- cs_close (l);
- return -1;
- }
- iochan_setdata(lst, l);
-
- /* Ensure our listener chain is setup properly */
- lst->next = pListener;
- pListener = lst;
- return 0; /* OK */
-}
-
-#ifndef WIN32
-/* UNIX only (for windows we don't need to catch the signals) */
-static void catchchld(int num)
-{
- while (waitpid(-1, 0, WNOHANG) > 0)
- ;
- signal(SIGCHLD, catchchld);
-}
-#endif
-
-statserv_options_block *statserv_getcontrol(void)
-{
- static statserv_options_block cb;
-
- memcpy(&cb, &control_block, sizeof(cb));
- return &cb;
-}
-
-void statserv_setcontrol(statserv_options_block *block)
-{
- memcpy(&control_block, block, sizeof(*block));
-}
-
-static void statserv_reset(void)
-{
-}
-
-int statserv_start(int argc, char **argv)
-{
- int ret;
-
-#ifdef WIN32
- /* We need to initialize the thread list */
- ThreadList_Initialize();
-/* WIN32 */
-#endif
-
-#ifdef WIN32
- if ((me = strrchr (argv[0], '\\')))
- me++;
- else
- me = argv[0];
-#else
- me = argv[0];
-#endif
- if (control_block.options_func(argc, argv))
- return(1);
-
- if (control_block.bend_start)
- (*control_block.bend_start)(&control_block);
-#ifdef WIN32
- yaz_log (LOG_LOG, "Starting server %s", me);
-#else
-/* UNIX */
- if (control_block.inetd)
- inetd_connection(control_block.default_proto);
- else
- {
- yaz_log (LOG_LOG, "Starting server %s pid=%d", me, getpid());
-#if 0
- sigset_t sigs_to_block;
-
- sigemptyset(&sigs_to_block);
- sigaddset (&sigs_to_block, SIGTERM);
- pthread_sigmask (SIG_BLOCK, &sigs_to_block, 0);
- /* missing... */
-#endif
- if (control_block.dynamic)
- signal(SIGCHLD, catchchld);
- }
- signal (SIGPIPE, SIG_IGN);
- signal (SIGTERM, sigterm);
- if (*control_block.setuid)
- {
- struct passwd *pw;
-
- if (!(pw = getpwnam(control_block.setuid)))
- {
- yaz_log(LOG_FATAL, "%s: Unknown user", control_block.setuid);
- return(1);
- }
- if (setuid(pw->pw_uid) < 0)
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
- exit(1);
- }
- }
-/* UNIX */
-#endif
-
-
- if ((pListener == NULL) && *control_block.default_listen)
- add_listener(control_block.default_listen,
- control_block.default_proto);
-
- if (pListener == NULL)
- ret = 1;
- else
- {
- yaz_log(LOG_LOG, "Entering event loop.");
- ret = event_loop(&pListener);
- }
- return ret;
-}
-
-int check_options(int argc, char **argv)
-{
- int ret = 0, r;
- char *arg;
-
- while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:D:", argv, argc, &arg)) != -2)
- {
- switch (ret)
- {
- case 0:
- if (add_listener(arg, control_block.default_proto))
- return 1; /* failed to create listener */
- break;
- case '1':
- control_block.one_shot = 1;
- control_block.dynamic = 0;
- break;
- case 'z':
- control_block.default_proto = PROTO_Z3950;
- break;
- case 's':
- fprintf (stderr, "%s: SR protocol no longer supported\n", me);
- exit (1);
- break;
- case 'S':
- control_block.dynamic = 0;
- break;
- case 'T':
-#if YAZ_POSIX_THREADS
- control_block.dynamic = 0;
- control_block.threads = 1;
-#elif YAZ_GNU_THREADS
- control_block.dynamic = 0;
- control_block.threads = 1;
-#else
- fprintf(stderr, "%s: Threaded mode not available.\n", me);
- return 1;
-#endif
- break;
- case 'l':
- strcpy(control_block.logfile, arg ? arg : "");
- yaz_log_init(control_block.loglevel, me, control_block.logfile);
- break;
- case 'v':
- control_block.loglevel = yaz_log_mask_str(arg);
- yaz_log_init(control_block.loglevel, me, control_block.logfile);
- break;
- case 'a':
- strcpy(control_block.apdufile, arg ? arg : "");
- break;
- case 'u':
- strcpy(control_block.setuid, arg ? arg : "");
- break;
- case 'c':
- strcpy(control_block.configname, arg ? arg : "");
- break;
- case 'd':
- strcpy(control_block.daemon_name, arg ? arg : "");
- break;
- case 't':
- if (!arg || !(r = atoi(arg)))
- {
- fprintf(stderr, "%s: Specify positive timeout for -t.\n", me);
- return(1);
- }
- control_block.idle_timeout = r;
- break;
- case 'k':
- if (!arg || !(r = atoi(arg)))
- {
- fprintf(stderr, "%s: Specify positive size for -k.\n", me);
- return(1);
- }
- control_block.maxrecordsize = r * 1024;
- break;
- case 'i':
- control_block.inetd = 1;
- break;
- case 'w':
- if (chdir(arg))
- {
- perror(arg);
- return 1;
- }
- break;
- case 'D':
- max_sessions = atoi(arg);
- break;
- default:
- fprintf(stderr, "Usage: %s [ -a <pdufile> -v <loglevel>"
- " -l <logfile> -u <user> -c <config> -t <minutes>"
- " -k <kilobytes> -d <daemon>"
- " -ziST1 -w <directory> <listender-addr>... ]\n", me);
- return 1;
- }
- }
- return 0;
-}
-
-#ifdef WIN32
-typedef struct _Args
-{
- char **argv;
- int argc;
-} Args;
-
-static Args ArgDetails;
-
-/* name of the executable */
-#define SZAPPNAME "server"
-
-/* list of service dependencies - "dep1\0dep2\0\0" */
-#define SZDEPENDENCIES ""
-
-int statserv_main(int argc, char **argv,
- bend_initresult *(*bend_init)(bend_initrequest *r),
- void (*bend_close)(void *handle))
-{
- statserv_options_block *cb = statserv_getcontrol();
-
- cb->bend_init = bend_init;
- cb->bend_close = bend_close;
-
- statserv_setcontrol(cb);
-
- /* Lets setup the Arg structure */
- ArgDetails.argc = argc;
- ArgDetails.argv = argv;
-
- /* Now setup the service with the service controller */
- SetupService(argc, argv, &ArgDetails, SZAPPNAME,
- cb->service_name, /* internal service name */
- cb->service_display_name, /* displayed name */
- SZDEPENDENCIES);
- return 0;
-}
-
-int StartAppService(void *pHandle, int argc, char **argv)
-{
- /* Initializes the App */
- return 1;
-}
-
-void RunAppService(void *pHandle)
-{
- Args *pArgs = (Args *)pHandle;
-
- /* Starts the app running */
- statserv_start(pArgs->argc, pArgs->argv);
-}
-
-void StopAppService(void *pHandle)
-{
- /* Stops the app */
- statserv_closedown();
- statserv_reset();
-}
-/* WIN32 */
-#else
-/* UNIX */
-int statserv_main(int argc, char **argv,
- bend_initresult *(*bend_init)(bend_initrequest *r),
- void (*bend_close)(void *handle))
-{
- int ret;
- statserv_options_block *cb = statserv_getcontrol();
-
- cb->bend_init = bend_init;
- cb->bend_close = bend_close;
-
- statserv_setcontrol(cb);
- ret = statserv_start (argc, argv);
- statserv_closedown ();
- statserv_reset();
- return ret;
-}
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2000, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: tcpdchk.c,v $
- * Revision 1.5 2000-02-28 11:20:06 adam
- * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
- *
- * Revision 1.4 1999/11/30 13:47:12 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.3 1999/08/27 09:40:32 adam
- * Renamed logf function to yaz_log. Removed VC++ project files.
- *
- * Revision 1.2 1999/04/20 09:56:48 adam
- * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
- * Modified all encoders/decoders to reflect this change.
- *
- * Revision 1.1 1999/04/16 14:45:55 adam
- * Added interface for tcpd wrapper for access control.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include <yaz/yconfig.h>
-#include <yaz/comstack.h>
-
-#if HAVE_TCPD_H
-#include <syslog.h>
-#include <tcpd.h>
-
-
-int allow_severity = LOG_INFO;
-int deny_severity = LOG_WARNING;
-
-#ifdef LOG_DEBUG
-#undef LOG_DEBUG
-#endif
-#ifdef LOG_WARN
-#undef LOG_WARN
-#endif
-
-#endif
-
-#include <yaz/statserv.h>
-#include <yaz/log.h>
-
-int check_ip_tcpd(void *cd, const char *addr, int len, int type)
-{
- const char *daemon_name = (const char *) cd;
-
- if (type == AF_INET)
- {
- if (daemon_name && *daemon_name)
- {
-#if HAVE_TCPD_H
- struct request_info request_info;
- int i;
-#endif
- char *host_name = 0, *host_addr = 0;
- struct hostent *host;
-
- struct sockaddr_in *addr_in = (struct sockaddr_in *) addr;
-
- if ((host = gethostbyaddr((char*)&addr_in->sin_addr,
- sizeof(addr_in->sin_addr),
- AF_INET)))
- host_name = (char*) host->h_name;
- host_addr = inet_ntoa(addr_in->sin_addr);
-#if HAVE_TCPD_H
- if (host_addr)
- request_init(&request_info, RQ_DAEMON, daemon_name,
- RQ_CLIENT_NAME, host_name,
- RQ_CLIENT_SIN, addr_in,
- RQ_CLIENT_ADDR, host_addr, 0);
- else
- request_init(&request_info, RQ_DAEMON, daemon_name,
- RQ_CLIENT_SIN, addr_in,
- RQ_CLIENT_ADDR, host_addr, 0);
- i = hosts_access(&request_info);
- if (!i)
- {
- yaz_log (LOG_DEBUG, "access denied from %s",
- host_name ? host_name : host_addr);
- return 1;
- }
- yaz_log (LOG_DEBUG, "access granted from %s",
- host_name ? host_name : host_addr);
-#endif
- }
- }
- return 0;
-}
-
--- /dev/null
+Makefile.in
+Makefile
+.deps
+.libs
+*.o
+*.lo
+*.la
+zes-*.c
+z-*.c
+item-req.c
+ill-core.c
+marc8.c
+cql.c
--- /dev/null
+## Copyright (C) 1994-2003, Index Data
+## All rights reserved.
+## $Id: Makefile.am,v 1.1 2003-10-27 12:21:30 adam Exp $
+
+if ISTHR
+thrlib=libyazthread.la
+endif
+
+if ISSSL
+ssllib=libyazssl.la
+endif
+
+YAZ_VERSION_INFO=2:0:0
+
+lib_LTLIBRARIES = libyaz.la $(thrlib) $(ssllib)
+
+TESTS = $(check_PROGRAMS)
+
+tabdatadir = $(pkgdatadir)/z39.50
+tabdata_DATA=datetime.asn esupdate.asn univres.asn z3950v3.asn z.tcl \
+ esadmin.asn charneg-3.asn mterm2.asn oclcui.asn
+
+illdatadir=$(pkgdatadir)/ill
+illdata_DATA=ill9702.asn item-req.asn ill.tcl
+
+EXTRA_DIST=$(tabdata_DATA) $(illdata_DATA) \
+ charconv.tcl charconv.sgm charconv_cjk.xml
+
+YAZCOMP = $(top_srcdir)/util/yaz-asncomp
+YAZCOMPLINE = $(YAZCOMP) -d z.tcl -i yaz -I../include $(YCFLAGS)
+
+AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS)
+AM_YFLAGS=-p cql_
+THREADED_FLAGS = @CFLAGSTHREADS@
+
+# MARC8 conversion is generated from charconv.sgm
+marc8.c: charconv.sgm charconv.tcl
+ cd $(srcdir); ./charconv.tcl -p marc8 -s 50 charconv.sgm -o marc8.c
+
+libyaz_la_SOURCES=version.c options.c log.c marcdisp.c oid.c wrbuf.c \
+ nmemsdup.c xmalloc.c readconf.c tpath.c nmem.c matchstr.c atoin.c \
+ siconv.c marc8.c \
+ odr_bool.c ber_bool.c ber_len.c ber_tag.c odr_util.c \
+ odr_null.c ber_null.c odr_int.c ber_int.c odr_tag.c odr_cons.c \
+ odr_seq.c odr_oct.c ber_oct.c odr_bit.c ber_bit.c odr_oid.c \
+ ber_oid.c odr_use.c odr_choice.c odr_any.c ber_any.c odr.c odr_mem.c \
+ dumpber.c odr_enum.c odr-priv.h \
+ comstack.c tcpip.c waislen.c unix.c \
+ z-accdes1.c z-accform1.c z-acckrb1.c z-core.c \
+ z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-mterm2.c z-opac.c \
+ z-uifr1.c z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c z-oclcui.c\
+ zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c \
+ zes-pset.c zes-update0.c z-date.c z-univ.c zes-update.c zes-admin.c \
+ z-charneg.c \
+ prt-ext.c \
+ ill-core.c item-req.c ill-get.c \
+ zget.c yaz-ccl.c diagbib1.c logrpn.c \
+ otherinfo.c pquery.c sortspec.c z3950oid.c charneg.c \
+ zoom-c.c zoom-opt.c zoom-p.h grs1disp.c zgdu.c soap.c srw.c opacdisp.c \
+ cclfind.c ccltoken.c cclerrms.c cclqual.c cclptree.c \
+ cclqfile.c cclstr.c \
+ cql.y cqlstdio.c cqltransform.c cqlutil.c xcqlutil.c cqlstring.c \
+ cqlstrer.c lexer.h \
+ eventl.c seshigh.c statserv.c requestq.c tcpdchk.c \
+ eventl.h service.c service.h session.h
+libyaz_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
+
+libyazthread_la_SOURCES=
+libyazthread_la_LIBADD=thr-nmem.lo thr-statserv.lo thr-eventl.lo
+libyazthread_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
+
+libyazssl_la_SOURCES=
+libyazssl_la_LIBADD=ssl-comstack.lo ssl-tcpip.lo
+libyazssl_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
+
+# Rules for Z39.50 V3
+$(srcdir)/z-accdes1.c \
+$(srcdir)/z-accform1.c \
+$(srcdir)/z-acckrb1.c \
+$(srcdir)/z-core.c \
+$(srcdir)/z-diag1.c \
+$(srcdir)/z-espec1.c \
+$(srcdir)/z-estask.c \
+$(srcdir)/z-exp.c \
+$(srcdir)/z-grs.c \
+$(srcdir)/z-opac.c \
+$(srcdir)/z-uifr1.c \
+$(srcdir)/z-rrf1.c \
+$(srcdir)/z-rrf2.c \
+$(srcdir)/z-sum.c \
+$(srcdir)/z-sutrs.c \
+$(srcdir)/zes-expi.c \
+$(srcdir)/zes-exps.c \
+$(srcdir)/zes-order.c \
+$(srcdir)/zes-pquery.c \
+$(srcdir)/zes-psched.c \
+$(srcdir)/zes-pset.c \
+$(srcdir)/zes-update0.c \
+$(top_srcdir)/include/z-accdes1.h \
+$(top_srcdir)/include/z-core.h: \
+$(srcdir)/z.tcl $(srcdir)/z3950v3.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMPLINE) z3950v3.asn
+
+# Date extension
+$(srcdir)/z-date.c \
+$(top_srcdir)/include/yaz/z-date.h: $(srcdir)/z.tcl $(srcdir)/datetime.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMPLINE) datetime.asn
+
+# UNIverse extension
+$(srcdir)/z-univ.c \
+$(top_srcdir)/include/yaz/z-univ.h: \
+$(srcdir)/z.tcl $(srcdir)/univres.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMPLINE) univres.asn
+
+# New Update extended service
+$(srcdir)/zes-update.c \
+$(top_srcdir)/include/yaz/zes-update.h: \
+$(srcdir)/z.tcl $(srcdir)/esupdate.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMPLINE) esupdate.asn
+
+# Admin extended service
+$(srcdir)/zes-admin.c \
+$(top_srcdir)/include/yaz/zes-admin.h: \
+$(srcdir)/z.tcl $(srcdir)/esadmin.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMPLINE) esadmin.asn
+
+# Charset negotiation
+$(srcdir)/z-charneg.c: $(srcdir)/z.tcl $(srcdir)/charneg-3.asn
+ cd $(srcdir); $(YAZCOMPLINE) $(YCFLAGS) charneg-3.asn
+
+# UserInfoFormat-multipleSearchTerms-2
+$(srcdir)/z-mterm2.c: $(srcdir)/z.tcl $(srcdir)/mterm2.asn
+ cd $(srcdir); $(YAZCOMPLINE) mterm2.asn
+
+# UserInfoFormat-multipleSearchTerms-2
+$(srcdir)/z-oclcui.c: $(srcdir)/z.tcl $(srcdir)/oclcui.asn
+ cd $(srcdir); $(YAZCOMPLINE) oclcui.asn
+
+# ILL protocol
+$(srcdir)/ill-core.c \
+$(top_srcdir)/include/yaz/ill-core.h: \
+$(srcdir)/ill.tcl $(srcdir)/ill9702.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMP) -d ill.tcl -i yaz -I ../include $(YCFLAGS) ill9702.asn
+
+# Item Request
+$(srcdir)/item-req.c \
+$(top_srcdir)/include/yaz/item-req.h: \
+$(srcdir)/ill.tcl $(srcdir)/item-req.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMP) -d ill.tcl -i yaz -I ../include $(YCFLAGS) item-req.asn
+
+# Threaded versions of objects.
+thr-nmem.lo: nmem.c
+ $(LTCOMPILE) $(THREADED_FLAGS) -c $(srcdir)/nmem.c -o thr-nmem.lo
+
+thr-statserv.lo: statserv.c
+ $(LTCOMPILE) $(THREADED_FLAGS) -c $(srcdir)/statserv.c -o thr-statserv.lo
+thr-eventl.lo: eventl.c
+ $(LTCOMPILE) $(THREADED_FLAGS) -c $(srcdir)/eventl.c -o thr-eventl.lo
+
+# SSL versions of objects.
+ssl-comstack.lo: comstack.c
+ $(LTCOMPILE) $(SSL_FLAGS) -c $(srcdir)/comstack.c -o ssl-comstack.lo
+
+ssl-tcpip.lo: tcpip.c
+ $(LTCOMPILE) $(SSL_FLAGS) -c $(srcdir)/tcpip.c -o ssl-tcpip.lo
+
+
--- /dev/null
+/*
+ * Copyright (c) 1997-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: atoin.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <yaz/yaz-util.h>
+
+int atoi_n (const char *buf, int len)
+{
+ int val = 0;
+
+ while (--len >= 0)
+ {
+ if (isdigit (*buf))
+ val = val*10 + (*buf - '0');
+ buf++;
+ }
+ return val;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: ber_any.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include "odr-priv.h"
+
+int ber_any(ODR o, Odr_any **p)
+{
+ int res;
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if ((res = completeBER(o->bp, odr_max(o))) <= 0) /* FIX THIS */
+ {
+ odr_seterror(o, OPROTO, 2);
+ return 0;
+ }
+ (*p)->buf = (unsigned char *)odr_malloc(o, res);
+ memcpy((*p)->buf, o->bp, res);
+ (*p)->len = (*p)->size = res;
+ o->bp += res;
+ return 1;
+ case ODR_ENCODE:
+ if (odr_write(o, (*p)->buf, (*p)->len) < 0)
+ return 0;
+ return 1;
+ default: odr_seterror(o, OOTHER, 3); return 0;
+ }
+}
+
+#define BER_ANY_DEBUG 0
+
+/*
+ * Return length of BER-package or 0.
+ */
+int completeBER_n(const unsigned char *buf, int len, int level)
+{
+ int res, ll, zclass, tag, cons;
+ const unsigned char *b = buf;
+ int bad = 0;
+
+ if (len > 5000000 || level > 1000)
+ {
+ bad = 1;
+#if BER_ANY_DEBUG
+ yaz_log(LOG_LOG, "completeBER lev=%d len=%d", level, len);
+#endif
+ if (level > 1000)
+ return -2;
+ }
+ if (len < 2)
+ return 0;
+ if (!buf[0] && !buf[1])
+ return -2;
+ if ((res = ber_dectag(b, &zclass, &tag, &cons, len)) <= 0)
+ return 0;
+#if 0
+/* removed, since ber_dectag never reads that far .. */
+ if (res > len)
+ return 0;
+#endif
+ b += res;
+ len -= res;
+ assert (len >= 0);
+ res = ber_declen(b, &ll, len);
+ if (res == -2)
+ {
+#if BER_ANY_DEBUG
+ if (bad)
+ yaz_log(LOG_LOG, "<<<<<<<<< return1 lev=%d res=%d", level, res);
+#endif
+ return -1; /* error */
+ }
+ if (res == -1)
+ {
+#if BER_ANY_DEBUG
+ if (bad)
+ yaz_log(LOG_LOG, "<<<<<<<<< return3 lev=%d res=-1", level);
+#endif
+ return 0; /* incomplete length */
+ }
+ if (ll > 5000000)
+ {
+#if BER_ANY_DEBUG
+ if (bad)
+ yaz_log(LOG_LOG, "<<<<<<<<< return2 lev=%d len=%d res=%d ll=%d",
+ level, len, res, ll);
+#endif
+ return -1; /* error */
+ }
+#if 0
+/* no longer necessary, since ber_declen never reads that far (returns -1) */
+ if (res > len)
+ {
+ if (bad)
+ yaz_log(LOG_LOG, "<<<<<<<<< return4 lev=%d res=%d len=%d",
+ level, res, len);
+ return 0;
+ }
+#endif
+ b += res;
+ len -= res;
+ if (ll >= 0)
+ { /* definite length */
+#if BER_ANY_DEBUG
+ if (bad && len < ll)
+ yaz_log(LOG_LOG, "<<<<<<<<< return5 lev=%d len=%d ll=%d",
+ level, len, ll);
+#endif
+ return (len >= ll ? ll + (b-buf) : 0);
+ }
+ /* indefinite length */
+ if (!cons)
+ { /* if primitive, it's an error */
+#if BER_ANY_DEBUG
+ yaz_log(LOG_LOG, "<<<<<<<<< return6 lev=%d ll=%d len=%d res=%d",
+ level, ll, len, res);
+#endif
+ return -1; /* error */
+ }
+ /* constructed - cycle through children */
+ while (len >= 2)
+ {
+ if (b[0] == 0 && b[1] == 0)
+ break;
+ if (!(res = completeBER_n(b, len, level+1)))
+ return 0;
+ if (res == -1)
+ return -1;
+ b += res;
+ len -= res;
+ }
+ if (len < 2)
+ return 0;
+ return (b - buf) + 2;
+}
+
+int completeBER(const unsigned char *buf, int len)
+{
+ int res = completeBER_n(buf, len, 0);
+ if (res < 0)
+ return len;
+ return res;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_bit.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int ber_bitstring(ODR o, Odr_bitmask *p, int cons)
+{
+ int res, len;
+ const unsigned char *base;
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
+ {
+ odr_seterror(o, OPROTO, 4);
+ return 0;
+ }
+ o->bp += res;
+ if (cons) /* fetch component strings */
+ {
+ base = o->bp;
+ while (odp_more_chunks(o, base, len))
+ if (!odr_bitstring(o, &p, 0, 0))
+ return 0;
+ return 1;
+ }
+ /* primitive bitstring */
+ if (len < 0)
+ {
+ odr_seterror(o, OOTHER, 5);
+ return 0;
+ }
+ if (len == 0)
+ return 1;
+ if (len - 1 > ODR_BITMASK_SIZE)
+ {
+ odr_seterror(o, OOTHER, 6);
+ return 0;
+ }
+ if (len > odr_max(o))
+ {
+ odr_seterror(o, OOTHER, 7);
+ return 0;
+ }
+ o->bp++; /* silently ignore the unused-bits field */
+ len--;
+ memcpy(p->bits + p->top + 1, o->bp, len);
+ p->top += len;
+ o->bp += len;
+ return 1;
+ case ODR_ENCODE:
+ if ((res = ber_enclen(o, p->top + 2, 5, 0)) < 0)
+ return 0;
+ if (odr_putc(o, 0) < 0) /* no unused bits here */
+ return 0;
+ if (p->top < 0)
+ return 1;
+ if (odr_write(o, p->bits, p->top + 1) < 0)
+ return 0;
+ return 1;
+ case ODR_PRINT:
+ return 1;
+ default:
+ odr_seterror(o, OOTHER, 8);
+ return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_bool.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "odr-priv.h"
+
+int ber_boolean(ODR o, int *val)
+{
+ int res, len;
+
+ switch (o->direction)
+ {
+ case ODR_ENCODE:
+ if (ber_enclen(o, 1, 1, 1) != 1)
+ return 0;
+ if (odr_putc(o, *val) < 0)
+ return 0;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[val=%d]\n", *val);
+#endif
+ return 1;
+ case ODR_DECODE:
+ if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
+ {
+ odr_seterror(o, OPROTO, 9);
+ return 0;
+ }
+ o->bp+= res;
+ if (len != 1 || odr_max(o) < len)
+ {
+ odr_seterror(o, OPROTO, 10);
+ return 0;
+ }
+ *val = *o->bp;
+ o->bp++;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[val=%d]\n", *val);
+#endif
+ return 1;
+ case ODR_PRINT:
+ return 1;
+ default: odr_seterror(o, OOTHER, 11); return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_int.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <sys/types.h>
+#include <netinet/in.h>
+#endif
+
+#include "odr-priv.h"
+
+static int ber_encinteger(ODR o, int val);
+static int ber_decinteger(const unsigned char *buf, int *val, int max);
+
+int ber_integer(ODR o, int *val)
+{
+ int res;
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if ((res = ber_decinteger(o->bp, val, odr_max(o))) <= 0)
+ {
+ odr_seterror(o, OPROTO, 50);
+ return 0;
+ }
+ o->bp += res;
+ return 1;
+ case ODR_ENCODE:
+ if ((res = ber_encinteger(o, *val)) < 0)
+ return 0;
+ return 1;
+ case ODR_PRINT: return 1;
+ default: odr_seterror(o, OOTHER, 51); return 0;
+ }
+}
+
+/*
+ * Returns: number of bytes written or -1 for error (out of bounds).
+ */
+int ber_encinteger(ODR o, int val)
+{
+ int a, len;
+ union { int i; unsigned char c[sizeof(int)]; } tmp;
+
+ tmp.i = htonl(val); /* ensure that that we're big-endian */
+ for (a = 0; a < (int) sizeof(int) - 1; a++) /* skip superfluous octets */
+ if (!((tmp.c[a] == 0 && !(tmp.c[a+1] & 0X80)) ||
+ (tmp.c[a] == 0XFF && (tmp.c[a+1] & 0X80))))
+ break;
+ len = sizeof(int) - a;
+ if (ber_enclen(o, len, 1, 1) != 1)
+ return -1;
+ if (odr_write(o, (unsigned char*) tmp.c + a, len) < 0)
+ return -1;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[val=%d]", val);
+#endif
+ return 0;
+}
+
+/*
+ * Returns: Number of bytes read or 0 if no match, -1 if error.
+ */
+int ber_decinteger(const unsigned char *buf, int *val, int max)
+{
+ const unsigned char *b = buf;
+ unsigned char fill;
+ int res, len, remains;
+ union { int i; unsigned char c[sizeof(int)]; } tmp;
+
+ if ((res = ber_declen(b, &len, max)) < 0)
+ return -1;
+ if (len+res > max || len < 0) /* out of bounds or indefinite encoding */
+ return -1;
+ if (len > (int) sizeof(int)) /* let's be reasonable, here */
+ return -1;
+ b+= res;
+
+ remains = sizeof(int) - len;
+ memcpy(tmp.c + remains, b, len);
+ if (*b & 0X80)
+ fill = 0XFF;
+ else
+ fill = 0X00;
+ memset(tmp.c, fill, remains);
+ *val = ntohl(tmp.i);
+
+ b += len;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[val=%d]", *val);
+#endif
+ return b - buf;
+}
--- /dev/null
+/*
+ * Copyright (C) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_len.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "odr-priv.h"
+
+/*
+ * Encode BER length octets. If exact, lenlen is the exact desired
+ * encoding size, else, lenlen is the max available space. Len < 0 =
+ * Indefinite encoding.
+ * Returns: >0 success, number of bytes encoded.
+ * Returns: =0 success, indefinite start-marker set. 1 byte encoded.
+ * Returns: -1 failure, out of bounds.
+ */
+int ber_enclen(ODR o, int len, int lenlen, int exact)
+{
+ unsigned char octs[sizeof(int)];
+ int n = 0;
+ int lenpos, end;
+
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[len=%d]", len);
+#endif
+ if (len < 0) /* Indefinite */
+ {
+ if (odr_putc(o, 0x80) < 0)
+ return 0;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[indefinite]");
+#endif
+ return 0;
+ }
+ if (len <= 127 && (lenlen == 1 || !exact)) /* definite short form */
+ {
+ if (odr_putc(o, (unsigned char) len) < 0)
+ return 0;
+ return 1;
+ }
+ if (lenlen == 1)
+ {
+ if (odr_putc(o, 0x80) < 0)
+ return 0;
+ return 0;
+ }
+ /* definite long form */
+ do
+ {
+ octs[n++] = len;
+ len >>= 8;
+ }
+ while (len);
+ if (n >= lenlen)
+ return -1;
+ lenpos = odr_tell(o); /* remember length-of-length position */
+ if (odr_putc(o, 0) < 0) /* dummy */
+ return 0;
+ if (exact)
+ while (n < --lenlen) /* pad length octets */
+ if (odr_putc(o, 0) < 0)
+ return 0;
+ while (n--)
+ if (odr_putc(o, octs[n]) < 0)
+ return 0;
+ /* set length of length */
+ end = odr_tell(o);
+ odr_seek(o, ODR_S_SET, lenpos);
+ if (odr_putc(o, (end - lenpos - 1) | 0X80) < 0)
+ return 0;
+ odr_seek(o, ODR_S_END, 0);
+ return odr_tell(o) - lenpos;
+}
+
+/*
+ * Decode BER length octets. Returns
+ * > 0 : number of bytes read
+ * -1 : not enough room to read bytes within max bytes
+ * -2 : other error
+ *
+ * After return:
+ * len = -1 indefinite length.
+ * len >= 0 definite length
+ */
+int ber_declen(const unsigned char *buf, int *len, int max)
+{
+ const unsigned char *b = buf;
+ int n;
+
+ if (max < 1)
+ return -1;
+ if (*b == 0X80) /* Indefinite */
+ {
+ *len = -1;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[len=%d]", *len);
+#endif
+ return 1;
+ }
+ if (!(*b & 0X80)) /* Definite short form */
+ {
+ *len = (int) *b;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[len=%d]", *len);
+#endif
+ return 1;
+ }
+ if (*b == 0XFF) /* reserved value */
+ return -2;
+ /* indefinite long form */
+ n = *b & 0X7F;
+ if (n >= max)
+ return -1;
+ *len = 0;
+ b++;
+ while (--n >= 0)
+ {
+ *len <<= 8;
+ *len |= *(b++);
+ }
+ if (*len < 0)
+ return -2;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[len=%d]", *len);
+#endif
+ return (b - buf);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_null.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+/*
+ * BER-en/decoder for NULL type.
+ */
+int ber_null(ODR o)
+{
+ switch (o->direction)
+ {
+ case ODR_ENCODE:
+ if (odr_putc(o, 0X00) < 0)
+ return 0;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[NULL]\n");
+#endif
+ return 1;
+ case ODR_DECODE:
+ if (odr_max(o) < 1)
+ {
+ odr_seterror(o, OPROTO, 39);
+ return 0;
+ }
+ if (*(o->bp++) != 0X00)
+ {
+ odr_seterror(o, OPROTO, 12);
+ return 0;
+ }
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[NULL]\n");
+#endif
+ return 1;
+ case ODR_PRINT: return 1;
+ default: odr_seterror(o, OOTHER, 13); return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_oct.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int ber_octetstring(ODR o, Odr_oct *p, int cons)
+{
+ int res, len;
+ const unsigned char *base;
+ unsigned char *c;
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
+ {
+ odr_seterror(o, OPROTO, 14);
+ return 0;
+ }
+ o->bp += res;
+ if (cons) /* fetch component strings */
+ {
+ base = o->bp;
+ while (odp_more_chunks(o, base, len))
+ if (!odr_octetstring(o, &p, 0, 0))
+ return 0;
+ return 1;
+ }
+ /* primitive octetstring */
+ if (len < 0)
+ {
+ odr_seterror(o, OOTHER, 15);
+ return 0;
+ }
+ if (len > odr_max(o))
+ {
+ odr_seterror(o, OOTHER, 16);
+ return 0;
+ }
+ if (len + 1 > p->size - p->len)
+ {
+ c = (unsigned char *)odr_malloc(o, p->size += len + 1);
+ if (p->len)
+ memcpy(c, p->buf, p->len);
+ p->buf = c;
+ }
+ if (len)
+ memcpy(p->buf + p->len, o->bp, len);
+ p->len += len;
+ o->bp += len;
+ /* the final null is really not part of the buffer, but */
+ /* it helps somes applications that assumes C strings */
+ if (len)
+ p->buf[p->len] = '\0';
+ return 1;
+ case ODR_ENCODE:
+ if ((res = ber_enclen(o, p->len, 5, 0)) < 0)
+ return 0;
+ if (p->len == 0)
+ return 1;
+ if (odr_write(o, p->buf, p->len) < 0)
+ return 0;
+ return 1;
+ case ODR_PRINT: return 1;
+ default: odr_seterror(o, OOTHER, 17); return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_oid.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int ber_oidc(ODR o, Odr_oid *p)
+{
+ int len, lenp, end;
+ int pos, n, res, id;
+ unsigned char octs[8];
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if ((res = ber_declen(o->bp, &len, odr_max(o))) < 1)
+ {
+ odr_seterror(o, OPROTO, 18);
+ return 0;
+ }
+ if (len < 0)
+ {
+ odr_seterror(o, OPROTO, 19);
+ return 0;
+ }
+ o->bp += res;
+ if (len == 0)
+ {
+ *p = -1;
+ return 1;
+ }
+ if (len > odr_max(o))
+ {
+ odr_seterror(o, OPROTO, 20);
+ return 0;
+ }
+ p[0] = *o->bp / 40;
+ if (p[0] > 2)
+ p[0] = 2;
+ p[1] = *o->bp - p[0] * 40;
+ o->bp++;
+ pos = 2;
+ len--;
+ while (len)
+ {
+ p[pos] = 0;
+ do
+ {
+ if (!len)
+ {
+ odr_seterror(o, OPROTO, 21);
+ return 0;
+ }
+ p[pos] <<= 7;
+ p[pos] |= *o->bp & 0X7F;
+ len--;
+ }
+ while (*(o->bp++) & 0X80);
+ pos++;
+ }
+ p[pos] = -1;
+ return 1;
+ case ODR_ENCODE:
+ /* we'll allow ourselves the quiet luxury of only doing encodings
+ shorter than 127 */
+ lenp = odr_tell(o);
+ if (odr_putc(o, 0) < 0) /* dummy */
+ return 0;
+ if (p[0] < 0 && p[1] <= 0)
+ {
+ odr_seterror(o, ODATA, 23);
+ return 0;
+ }
+ for (pos = 1; p[pos] >= 0; pos++)
+ {
+ id = pos > 1 ? p[pos] : p[0] * 40 + p[1];
+ n = 0;
+ do
+ {
+ octs[n++] = id & 0X7F;
+ id >>= 7;
+ }
+ while (id);
+ while (n--)
+ {
+ unsigned char p;
+
+ p = octs[n] | ((n > 0) << 7);
+ if (odr_putc(o, p) < 0)
+ return 0;
+ }
+ }
+ end = odr_tell(o);
+ odr_seek(o, ODR_S_SET, lenp);
+ if (ber_enclen(o, (end - lenp) - 1, 1, 1) != 1)
+ {
+ odr_seterror(o, OOTHER, 52);
+ return 0;
+ }
+ odr_seek(o, ODR_S_END, 0);
+ return 1;
+ default:
+ odr_seterror(o, OOTHER, 22);
+ return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: ber_tag.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "odr-priv.h"
+
+/* ber_tag
+ * On encoding:
+ * if p: write tag. return 1 (success) or -1 (error).
+ * if !p: return 0.
+ * On decoding:
+ * if tag && zclass match up, advance pointer and return 1. set cons.
+ * else leave pointer unchanged. Return 0.
+ *
+ * Should perhaps be odr_tag?
+ */
+int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt,
+ const char *name)
+{
+ struct Odr_ber_tag *odr_ber_tag = &o->op->odr_ber_tag;
+ int rd;
+ char **pp = (char **)p;
+
+ if (o->direction == ODR_DECODE)
+ *pp = 0;
+ o->t_class = -1;
+ if (o->op->stackp < 0)
+ {
+ odr_seek(o, ODR_S_SET, 0);
+ o->top = 0;
+ o->bp = o->buf;
+ odr_ber_tag->lclass = -1;
+ }
+ switch (o->direction)
+ {
+ case ODR_ENCODE:
+ if (!*pp)
+ {
+ if (!opt)
+ {
+ odr_seterror(o, OREQUIRED, 24);
+ odr_setelement (o, name);
+ }
+ return 0;
+ }
+ if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0)
+ return -1;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "\n[class=%d,tag=%d,cons=%d,stackp=%d]", zclass, tag,
+ *constructed, o->stackp);
+#endif
+ return 1;
+
+ case ODR_DECODE:
+ if (o->op->stackp > -1 && !odr_constructed_more(o))
+ {
+ if (!opt)
+ {
+ odr_seterror(o, OREQUIRED, 25);
+ odr_setelement(o, name);
+ }
+ return 0;
+ }
+ if (odr_ber_tag->lclass < 0)
+ {
+ if ((odr_ber_tag->br =
+ ber_dectag(o->bp, &odr_ber_tag->lclass,
+ &odr_ber_tag->ltag, &odr_ber_tag->lcons,
+ odr_max(o))) <= 0)
+ {
+ odr_seterror(o, OPROTO, 26);
+ odr_setelement(o, name);
+ return 0;
+ }
+#ifdef ODR_DEBUG
+ fprintf(stderr,
+ "\n[class=%d,tag=%d,cons=%d,stackp=%d]",
+ odr_ber_tag->lclass, odr_ber_tag->ltag,
+ odr_ber_tag->lcons, o->stackp);
+#endif
+ }
+ if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag)
+ {
+ o->bp += odr_ber_tag->br;
+ *constructed = odr_ber_tag->lcons;
+ odr_ber_tag->lclass = -1;
+ return 1;
+ }
+ else
+ {
+ if (!opt)
+ {
+ odr_seterror(o, OREQUIRED, 27);
+ odr_setelement(o, name);
+ }
+ return 0;
+ }
+ case ODR_PRINT:
+ if (!*pp && !opt)
+ {
+ odr_seterror(o,OREQUIRED, 28);
+ odr_setelement(o, name);
+ }
+ return *pp != 0;
+ default:
+ odr_seterror(o, OOTHER, 29);
+ odr_setelement(o, name);
+ return 0;
+ }
+}
+
+/* ber_enctag
+ * BER-encode a zclass/tag/constructed package (identifier octets). Return
+ * number of bytes encoded, or -1 if out of bounds.
+ */
+int ber_enctag(ODR o, int zclass, int tag, int constructed)
+{
+ int cons = (constructed ? 1 : 0), n = 0;
+ unsigned char octs[sizeof(int)], b;
+
+ b = (zclass << 6) & 0XC0;
+ b |= (cons << 5) & 0X20;
+ if (tag <= 30)
+ {
+ b |= tag & 0X1F;
+ if (odr_putc(o, b) < 0)
+ return -1;
+ return 1;
+ }
+ else
+ {
+ b |= 0X1F;
+ if (odr_putc(o, b) < 0)
+ return -1;
+ do
+ {
+ octs[n++] = tag & 0X7F;
+ tag >>= 7;
+ }
+ while (tag);
+ while (n--)
+ {
+ unsigned char oo;
+
+ oo = octs[n] | ((n > 0) << 7);
+ if (odr_putc(o, oo) < 0)
+ return -1;
+ }
+ return 0;
+ }
+}
+
+/* ber_dectag
+ * Decode BER identifier octets. Return number of bytes read or -1 for error.
+ */
+int ber_dectag(const unsigned char *b, int *zclass, int *tag,
+ int *constructed, int max)
+{
+ int l = 1;
+
+ if (l > max)
+ return -1;
+
+ *zclass = *b >> 6;
+ *constructed = (*b >> 5) & 0X01;
+ if ((*tag = *b & 0x1F) <= 30)
+ return 1;
+ *tag = 0;
+ do
+ {
+ if (l >= max)
+ return -1;
+ *tag <<= 7;
+ *tag |= b[l] & 0X7F;
+ }
+ while (b[l++] & 0X80);
+ return l;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * Europagate, 1995
+ *
+ * $Id: cclerrms.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.8 1995/05/16 09:39:25 adam
+ * LICENSE.
+ *
+ * Revision 1.7 1995/04/17 09:31:40 adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.6 1995/02/23 08:31:59 adam
+ * Changed header.
+ *
+ * Revision 1.4 1995/02/14 16:20:54 adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.3 1995/02/14 10:25:56 adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2 1995/02/13 15:15:06 adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1 1995/02/13 12:35:20 adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <yaz/ccl.h>
+
+static char *err_msg_array[] = {
+ "Ok",
+ "Search word expected",
+ "')' expected",
+ "Set name expected",
+ "Operator expected",
+ "Unbalanced ')'",
+ "Unknown qualifier",
+ "Qualifiers applied twice",
+ "'=' expected",
+ "Bad relation",
+ "Left truncation not supported",
+ "Both left - and right truncation not supported",
+ "Right truncation not supported"
+};
+
+/*
+ * ccl_err_msg: return name of CCL error
+ * ccl_errno: Error no.
+ * return: Name of error.
+ */
+const char *ccl_err_msg (int ccl_errno)
+{
+ return err_msg_array[ccl_errno];
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL find (to rpn conversion)
+ * Europagate, 1995
+ *
+ * $Id: cclfind.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate log:
+ *
+ * Revision 1.16 1996/01/08 08:41:13 adam
+ * Removed unused function.
+ *
+ * Revision 1.15 1995/07/20 08:14:34 adam
+ * Qualifiers were observed too often. Instead tokens are treated as
+ * qualifiers only when separated by comma.
+ *
+ * Revision 1.14 1995/05/16 09:39:26 adam
+ * LICENSE.
+ *
+ * Revision 1.13 1995/04/17 09:31:42 adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.12 1995/03/20 15:27:43 adam
+ * Minor changes.
+ *
+ * Revision 1.11 1995/02/23 08:31:59 adam
+ * Changed header.
+ *
+ * Revision 1.9 1995/02/16 13:20:06 adam
+ * Spell fix.
+ *
+ * Revision 1.8 1995/02/14 19:59:42 adam
+ * Removed a syntax error.
+ *
+ * Revision 1.7 1995/02/14 19:55:10 adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.6 1995/02/14 16:20:55 adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.5 1995/02/14 14:12:41 adam
+ * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
+ *
+ * Revision 1.4 1995/02/14 13:16:29 adam
+ * Left and/or right truncation implemented.
+ *
+ * Revision 1.3 1995/02/14 10:25:56 adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2 1995/02/13 15:15:07 adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1 1995/02/13 12:35:20 adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+/* returns type of current lookahead */
+#define KIND (cclp->look_token->kind)
+
+/* move one token forward */
+#define ADVANCE cclp->look_token = cclp->look_token->next
+
+/*
+ * qual_val_type: test for existance of attribute type/value pair.
+ * qa: Attribute array
+ * type: Type of attribute to search for
+ * value: Value of attribute to seach for
+ * return: 1 if found; 0 otherwise.
+ */
+static int qual_val_type (struct ccl_rpn_attr **qa, int type, int value,
+ char **attset)
+{
+ int i;
+ struct ccl_rpn_attr *q;
+
+ if (!qa)
+ return 0;
+ for (i = 0; (q=qa[i]); i++)
+ while (q)
+ {
+ if (q->type == type && q->kind == CCL_RPN_ATTR_NUMERIC &&
+ q->value.numeric == value)
+ {
+ if (attset)
+ *attset = q->set;
+ return 1;
+ }
+ q = q->next;
+ }
+ return 0;
+}
+
+/*
+ * strxcat: concatenate strings.
+ * n: Null-terminated Destination string
+ * src: Source string to be appended (not null-terminated)
+ * len: Length of source string.
+ */
+static void strxcat (char *n, const char *src, int len)
+{
+ while (*n)
+ n++;
+ while (--len >= 0)
+ *n++ = *src++;
+ *n = '\0';
+}
+
+/*
+ * copy_token_name: Return copy of CCL token name
+ * tp: Pointer to token info.
+ * return: malloc(3) allocated copy of token name.
+ */
+static char *copy_token_name (struct ccl_token *tp)
+{
+ char *str = (char *)xmalloc (tp->len + 1);
+ ccl_assert (str);
+ memcpy (str, tp->name, tp->len);
+ str[tp->len] = '\0';
+ return str;
+}
+
+/*
+ * mk_node: Create RPN node.
+ * kind: Type of node.
+ * return: pointer to allocated node.
+ */
+static struct ccl_rpn_node *mk_node (int kind)
+{
+ struct ccl_rpn_node *p;
+ p = (struct ccl_rpn_node *)xmalloc (sizeof(*p));
+ ccl_assert (p);
+ p->kind = kind;
+ return p;
+}
+
+/*
+ * ccl_rpn_delete: Delete RPN tree.
+ * rpn: Pointer to tree.
+ */
+void ccl_rpn_delete (struct ccl_rpn_node *rpn)
+{
+ struct ccl_rpn_attr *attr, *attr1;
+ if (!rpn)
+ return;
+ switch (rpn->kind)
+ {
+ case CCL_RPN_AND:
+ case CCL_RPN_OR:
+ case CCL_RPN_NOT:
+ ccl_rpn_delete (rpn->u.p[0]);
+ ccl_rpn_delete (rpn->u.p[1]);
+ break;
+ case CCL_RPN_TERM:
+ xfree (rpn->u.t.term);
+ for (attr = rpn->u.t.attr_list; attr; attr = attr1)
+ {
+ attr1 = attr->next;
+ if (attr->kind == CCL_RPN_ATTR_STRING)
+ xfree(attr->value.str);
+ if (attr->set)
+ xfree (attr->set);
+ xfree (attr);
+ }
+ break;
+ case CCL_RPN_SET:
+ xfree (rpn->u.setname);
+ break;
+ case CCL_RPN_PROX:
+ ccl_rpn_delete (rpn->u.p[0]);
+ ccl_rpn_delete (rpn->u.p[1]);
+ break;
+ }
+ xfree (rpn);
+}
+
+static struct ccl_rpn_node *find_spec (CCL_parser cclp,
+ struct ccl_rpn_attr **qa);
+
+static int is_term_ok (int look, int *list)
+{
+ for (;*list >= 0; list++)
+ if (look == *list)
+ return 1;
+ return 0;
+}
+
+static struct ccl_rpn_node *search_terms (CCL_parser cclp,
+ struct ccl_rpn_attr **qa);
+
+static struct ccl_rpn_attr *add_attr_node (struct ccl_rpn_node *p,
+ const char *set, int type)
+{
+ struct ccl_rpn_attr *n;
+
+ n = (struct ccl_rpn_attr *)xmalloc (sizeof(*n));
+ ccl_assert (n);
+ if (set)
+ {
+ n->set = (char*) xmalloc (strlen(set)+1);
+ strcpy (n->set, set);
+ }
+ else
+ n->set = 0;
+ n->type = type;
+ n->next = p->u.t.attr_list;
+ p->u.t.attr_list = n;
+
+ n->kind = CCL_RPN_ATTR_NUMERIC;
+ n->value.numeric = 0;
+ return n;
+}
+
+/*
+ * add_attr_numeric: Add attribute (type/value) to RPN term node.
+ * p: RPN node of type term.
+ * type: Type of attribute
+ * value: Value of attribute
+ * set: Attribute set name
+ */
+static void add_attr_numeric (struct ccl_rpn_node *p, const char *set,
+ int type, int value)
+{
+ struct ccl_rpn_attr *n;
+
+ n = add_attr_node(p, set, type);
+ n->kind = CCL_RPN_ATTR_NUMERIC;
+ n->value.numeric = value;
+}
+
+static void add_attr_string (struct ccl_rpn_node *p, const char *set,
+ int type, char *value)
+{
+ struct ccl_rpn_attr *n;
+
+ n = add_attr_node(p, set, type);
+ n->kind = CCL_RPN_ATTR_STRING;
+ n->value.str = xstrdup(value);
+}
+
+
+/*
+ * search_term: Parse CCL search term.
+ * cclp: CCL Parser
+ * qa: Qualifier attributes already applied.
+ * term_list: tokens we accept as terms in context
+ * multi: whether we accept "multiple" tokens
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_term_x (CCL_parser cclp,
+ struct ccl_rpn_attr **qa,
+ int *term_list, int multi)
+{
+ struct ccl_rpn_node *p_top = 0;
+ struct ccl_token *lookahead = cclp->look_token;
+ int and_list = 0;
+ int or_list = 0;
+ char *attset;
+ const char *truncation_aliases;
+
+ truncation_aliases =
+ ccl_qual_search_special(cclp->bibset, "truncation");
+ if (!truncation_aliases)
+ truncation_aliases = "?";
+
+ if (qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_AND_LIST, 0))
+ and_list = 1;
+ if (qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_OR_LIST, 0))
+ or_list = 1;
+ while (1)
+ {
+ struct ccl_rpn_node *p;
+ size_t no, i;
+ int no_spaces = 0;
+ int left_trunc = 0;
+ int right_trunc = 0;
+ int mid_trunc = 0;
+ int relation_value = -1;
+ int position_value = -1;
+ int structure_value = -1;
+ int truncation_value = -1;
+ int completeness_value = -1;
+ int len = 0;
+ size_t max = 200;
+ if (and_list || or_list || !multi)
+ max = 1;
+
+ /* ignore commas when dealing with and-lists .. */
+ if (and_list && lookahead && lookahead->kind == CCL_TOK_COMMA)
+ {
+ lookahead = lookahead->next;
+ ADVANCE;
+ continue;
+ }
+ /* go through each TERM token. If no truncation attribute is yet
+ met, then look for left/right truncation markers (?) and
+ set left_trunc/right_trunc/mid_trunc accordingly */
+ for (no = 0; no < max && is_term_ok(lookahead->kind, term_list); no++)
+ {
+ for (i = 0; i<lookahead->len; i++)
+ if (lookahead->name[i] == ' ')
+ no_spaces++;
+ else if (strchr(truncation_aliases, lookahead->name[i]))
+ {
+ if (no == 0 && i == 0 && lookahead->len >= 1)
+ left_trunc = 1;
+ else if (!is_term_ok(lookahead->next->kind, term_list) &&
+ i == lookahead->len-1 && i >= 1)
+ right_trunc = 1;
+ else
+ mid_trunc = 1;
+ }
+ len += 1+lookahead->len;
+ lookahead = lookahead->next;
+ }
+
+ if (len == 0)
+ break; /* no more terms . stop . */
+
+
+ if (p_top)
+ {
+ if (or_list)
+ p = mk_node (CCL_RPN_OR);
+ else if (and_list)
+ p = mk_node (CCL_RPN_AND);
+ else
+ p = mk_node (CCL_RPN_AND);
+ p->u.p[0] = p_top;
+ p_top = p;
+ }
+
+ /* create the term node, but wait a moment before adding the term */
+ p = mk_node (CCL_RPN_TERM);
+ p->u.t.attr_list = NULL;
+ p->u.t.term = NULL;
+
+ /* make the top node point to us.. */
+ if (p_top)
+ p_top->u.p[1] = p;
+ else
+ p_top = p;
+
+
+ /* go through all attributes and add them to the attribute list */
+ for (i=0; qa && qa[i]; i++)
+ {
+ struct ccl_rpn_attr *attr;
+
+ for (attr = qa[i]; attr; attr = attr->next)
+ switch(attr->kind)
+ {
+ case CCL_RPN_ATTR_STRING:
+ add_attr_string(p, attr->set, attr->type,
+ attr->value.str);
+ break;
+ case CCL_RPN_ATTR_NUMERIC:
+ if (attr->value.numeric > 0)
+ { /* deal only with REAL attributes (positive) */
+ switch (attr->type)
+ {
+ case CCL_BIB1_REL:
+ if (relation_value != -1)
+ continue;
+ relation_value = attr->value.numeric;
+ break;
+ case CCL_BIB1_POS:
+ if (position_value != -1)
+ continue;
+ position_value = attr->value.numeric;
+ break;
+ case CCL_BIB1_STR:
+ if (structure_value != -1)
+ continue;
+ structure_value = attr->value.numeric;
+ break;
+ case CCL_BIB1_TRU:
+ if (truncation_value != -1)
+ continue;
+ truncation_value = attr->value.numeric;
+ left_trunc = right_trunc = mid_trunc = 0;
+ break;
+ case CCL_BIB1_COM:
+ if (completeness_value != -1)
+ continue;
+ completeness_value = attr->value.numeric;
+ break;
+ }
+ add_attr_numeric(p, attr->set, attr->type,
+ attr->value.numeric);
+ }
+ }
+ }
+ /* len now holds the number of characters in the RPN term */
+ /* no holds the number of CCL tokens (1 or more) */
+
+ if (structure_value == -1 &&
+ qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_WP, &attset))
+ { /* no structure attribute met. Apply either structure attribute
+ WORD or PHRASE depending on number of CCL tokens */
+ if (no == 1 && no_spaces == 0)
+ add_attr_numeric (p, attset, CCL_BIB1_STR, 2);
+ else
+ add_attr_numeric (p, attset, CCL_BIB1_STR, 1);
+ }
+
+ /* make the RPN token */
+ p->u.t.term = (char *)xmalloc (len);
+ ccl_assert (p->u.t.term);
+ p->u.t.term[0] = '\0';
+ for (i = 0; i<no; i++)
+ {
+ const char *src_str = cclp->look_token->name;
+ int src_len = cclp->look_token->len;
+
+ if (i == 0 && left_trunc)
+ {
+ src_len--;
+ src_str++;
+ }
+ else if (i == no-1 && right_trunc)
+ src_len--;
+ if (src_len)
+ {
+ int len = strlen(p->u.t.term);
+ if (len &&
+ !strchr("-+", *src_str) &&
+ !strchr("-+", p->u.t.term[len-1]))
+ {
+ strcat (p->u.t.term, " ");
+ }
+ }
+ strxcat (p->u.t.term, src_str, src_len);
+ ADVANCE;
+ }
+ if (left_trunc && right_trunc)
+ {
+ if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_BOTH;
+ ccl_rpn_delete (p);
+ return NULL;
+ }
+ add_attr_numeric (p, attset, CCL_BIB1_TRU, 3);
+ }
+ else if (right_trunc)
+ {
+ if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_RIGHT;
+ ccl_rpn_delete (p);
+ return NULL;
+ }
+ add_attr_numeric (p, attset, CCL_BIB1_TRU, 1);
+ }
+ else if (left_trunc)
+ {
+ if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_LEFT;
+ ccl_rpn_delete (p);
+ return NULL;
+ }
+ add_attr_numeric (p, attset, CCL_BIB1_TRU, 2);
+ }
+ else
+ {
+ if (qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_NONE,
+ &attset))
+ add_attr_numeric (p, attset, CCL_BIB1_TRU, 100);
+ }
+ if (!multi)
+ break;
+ }
+ if (!p_top)
+ cclp->error_code = CCL_ERR_TERM_EXPECTED;
+ return p_top;
+}
+
+static struct ccl_rpn_node *search_term (CCL_parser cclp,
+ struct ccl_rpn_attr **qa)
+{
+ static int list[] = {CCL_TOK_TERM, CCL_TOK_COMMA, -1};
+ return search_term_x(cclp, qa, list, 0);
+}
+
+static struct ccl_rpn_node *qualifiers2 (CCL_parser cclp,
+ struct ccl_rpn_attr **ap)
+{
+ char *attset;
+ int rel;
+
+ if (!qual_val_type(ap, CCL_BIB1_REL, CCL_BIB1_REL_ORDER, &attset))
+ {
+ /* unordered relation */
+ struct ccl_rpn_node *p;
+ if (KIND != CCL_TOK_EQ)
+ {
+ cclp->error_code = CCL_ERR_EQ_EXPECTED;
+ return NULL;
+ }
+ ADVANCE;
+ if (KIND == CCL_TOK_LP)
+ {
+ ADVANCE;
+ if (!(p = find_spec (cclp, ap)))
+ {
+ return NULL;
+ }
+ if (KIND != CCL_TOK_RP)
+ {
+ cclp->error_code = CCL_ERR_RP_EXPECTED;
+ ccl_rpn_delete (p);
+ return NULL;
+ }
+ ADVANCE;
+ }
+ else
+ p = search_terms (cclp, ap);
+ return p;
+ }
+ /* ordered relation ... */
+ rel = 0;
+ if (cclp->look_token->len == 1)
+ {
+ if (cclp->look_token->name[0] == '<')
+ rel = 1;
+ else if (cclp->look_token->name[0] == '=')
+ rel = 3;
+ else if (cclp->look_token->name[0] == '>')
+ rel = 5;
+ }
+ else if (cclp->look_token->len == 2)
+ {
+ if (!memcmp (cclp->look_token->name, "<=", 2))
+ rel = 2;
+ else if (!memcmp (cclp->look_token->name, ">=", 2))
+ rel = 4;
+ else if (!memcmp (cclp->look_token->name, "<>", 2))
+ rel = 6;
+ }
+ if (!rel)
+ cclp->error_code = CCL_ERR_BAD_RELATION;
+ else
+ {
+ struct ccl_rpn_node *p;
+
+ ADVANCE; /* skip relation */
+ if (KIND == CCL_TOK_TERM &&
+ cclp->look_token->next && cclp->look_token->next->len == 1 &&
+ cclp->look_token->next->name[0] == '-')
+ {
+ struct ccl_rpn_node *p1;
+ if (!(p1 = search_term (cclp, ap)))
+ return NULL;
+ ADVANCE; /* skip '-' */
+ if (KIND == CCL_TOK_TERM) /* = term - term ? */
+ {
+ struct ccl_rpn_node *p2;
+
+ if (!(p2 = search_term (cclp, ap)))
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ p = mk_node (CCL_RPN_AND);
+ p->u.p[0] = p1;
+ add_attr_numeric (p1, attset, CCL_BIB1_REL, 4);
+ p->u.p[1] = p2;
+ add_attr_numeric (p2, attset, CCL_BIB1_REL, 2);
+ return p;
+ }
+ else /* = term - */
+ {
+ add_attr_numeric (p1, attset, CCL_BIB1_REL, 4);
+ return p1;
+ }
+ }
+ else if (cclp->look_token->len == 1 &&
+ cclp->look_token->name[0] == '-') /* = - term ? */
+ {
+ ADVANCE;
+ if (!(p = search_term (cclp, ap)))
+ return NULL;
+ add_attr_numeric (p, attset, CCL_BIB1_REL, 2);
+ return p;
+ }
+ else if (KIND == CCL_TOK_LP)
+ {
+ ADVANCE;
+ if (!(p = find_spec (cclp, ap)))
+ return NULL;
+ if (KIND != CCL_TOK_RP)
+ {
+ cclp->error_code = CCL_ERR_RP_EXPECTED;
+ ccl_rpn_delete (p);
+ return NULL;
+ }
+ ADVANCE;
+ return p;
+ }
+ else
+ {
+ if (!(p = search_terms (cclp, ap)))
+ return NULL;
+ add_attr_numeric (p, attset, CCL_BIB1_REL, rel);
+ return p;
+ }
+ cclp->error_code = CCL_ERR_TERM_EXPECTED;
+ }
+ return NULL;
+}
+
+/*
+ * qualifiers1: Parse CCL qualifiers and search terms.
+ * cclp: CCL Parser
+ * la: Token pointer to RELATION token.
+ * qa: Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *qualifiers1 (CCL_parser cclp, struct ccl_token *la,
+ struct ccl_rpn_attr **qa)
+{
+ struct ccl_token *lookahead = cclp->look_token;
+ struct ccl_token *look_start = cclp->look_token;
+ struct ccl_rpn_attr **ap;
+ struct ccl_rpn_node *node = 0;
+ const char *field_str;
+ int no = 0;
+ int seq = 0;
+ int i;
+ int mode_merge = 1;
+#if 0
+ if (qa)
+ {
+ cclp->error_code = CCL_ERR_DOUBLE_QUAL;
+ return NULL;
+ }
+#endif
+ for (lookahead = cclp->look_token; lookahead != la;
+ lookahead=lookahead->next)
+ no++;
+ if (qa)
+ for (i=0; qa[i]; i++)
+ no++;
+ ap = (struct ccl_rpn_attr **)xmalloc ((no ? (no+1) : 2) * sizeof(*ap));
+ ccl_assert (ap);
+
+ field_str = ccl_qual_search_special(cclp->bibset, "field");
+ if (field_str)
+ {
+ if (!strcmp (field_str, "or"))
+ mode_merge = 0;
+ else if (!strcmp (field_str, "merge"))
+ mode_merge = 1;
+ }
+ if (!mode_merge)
+ {
+ /* consider each field separately and OR */
+ lookahead = look_start;
+ while (lookahead != la)
+ {
+ ap[1] = 0;
+ seq = 0;
+ while ((ap[0] = ccl_qual_search (cclp, lookahead->name,
+ lookahead->len, seq)) != 0)
+ {
+ struct ccl_rpn_node *node_sub;
+ cclp->look_token = la;
+
+ node_sub = qualifiers2(cclp, ap);
+ if (!node_sub)
+ {
+ ccl_rpn_delete (node);
+ xfree (ap);
+ return 0;
+ }
+ if (node)
+ {
+ struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
+ node_this->u.p[0] = node;
+ node_this->u.p[1] = node_sub;
+ node = node_this;
+ }
+ else
+ node = node_sub;
+ seq++;
+ }
+ if (seq == 0)
+ {
+ cclp->look_token = lookahead;
+ cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
+ xfree (ap);
+ return NULL;
+ }
+ lookahead = lookahead->next;
+ if (lookahead->kind == CCL_TOK_COMMA)
+ lookahead = lookahead->next;
+ }
+ }
+ else
+ {
+ /* merge attributes from ALL fields - including inherited ones */
+ while (1)
+ {
+ struct ccl_rpn_node *node_sub;
+ int found = 0;
+ lookahead = look_start;
+ for (i = 0; lookahead != la; i++)
+ {
+ ap[i] = ccl_qual_search (cclp, lookahead->name,
+ lookahead->len, seq);
+ if (ap[i])
+ found++;
+ if (!ap[i] && seq > 0)
+ ap[i] = ccl_qual_search (cclp, lookahead->name,
+ lookahead->len, 0);
+ if (!ap[i])
+ {
+ cclp->look_token = lookahead;
+ cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
+ xfree (ap);
+ return NULL;
+ }
+ lookahead = lookahead->next;
+ if (lookahead->kind == CCL_TOK_COMMA)
+ lookahead = lookahead->next;
+ }
+ if (qa)
+ {
+ struct ccl_rpn_attr **qa0 = qa;
+
+ while (*qa0)
+ ap[i++] = *qa0++;
+ }
+ ap[i] = NULL;
+
+ if (!found)
+ break;
+
+ cclp->look_token = lookahead;
+
+ node_sub = qualifiers2(cclp, ap);
+ if (!node_sub)
+ {
+ ccl_rpn_delete (node);
+ break;
+ }
+ if (node)
+ {
+ struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
+ node_this->u.p[0] = node;
+ node_this->u.p[1] = node_sub;
+ node = node_this;
+ }
+ else
+ node = node_sub;
+ seq++;
+ }
+ }
+ xfree (ap);
+ return node;
+}
+
+
+/*
+ * search_terms: Parse CCL search terms - including proximity.
+ * cclp: CCL Parser
+ * qa: Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_terms (CCL_parser cclp,
+ struct ccl_rpn_attr **qa)
+{
+ static int list[] = {
+ CCL_TOK_TERM, CCL_TOK_COMMA,CCL_TOK_EQ, CCL_TOK_REL, CCL_TOK_SET, -1};
+ struct ccl_rpn_node *p1, *p2, *pn;
+ p1 = search_term_x (cclp, qa, list, 1);
+ if (!p1)
+ return NULL;
+ while (1)
+ {
+ if (KIND == CCL_TOK_PROX)
+ {
+ struct ccl_rpn_node *p_prox = 0;
+ /* ! word order specified */
+ /* % word order not specified */
+ p_prox = mk_node(CCL_RPN_TERM);
+ p_prox->u.t.term = (char *) xmalloc(cclp->look_token->len);
+ memcpy(p_prox->u.t.term, cclp->look_token->name,
+ cclp->look_token->len);
+ p_prox->u.t.term[cclp->look_token->len] = 0;
+ p_prox->u.t.attr_list = 0;
+
+ ADVANCE;
+ p2 = search_term_x (cclp, qa, list, 1);
+ if (!p2)
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ pn = mk_node (CCL_RPN_PROX);
+ pn->u.p[0] = p1;
+ pn->u.p[1] = p2;
+ pn->u.p[2] = p_prox;
+ p1 = pn;
+ }
+ else if (is_term_ok(KIND, list))
+ {
+ p2 = search_term_x (cclp, qa, list, 1);
+ if (!p2)
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ pn = mk_node (CCL_RPN_PROX);
+ pn->u.p[0] = p1;
+ pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
+ p1 = pn;
+ }
+ else
+ break;
+ }
+ return p1;
+}
+
+/*
+ * search_elements: Parse CCL search elements
+ * cclp: CCL Parser
+ * qa: Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_elements (CCL_parser cclp,
+ struct ccl_rpn_attr **qa)
+{
+ struct ccl_rpn_node *p1;
+ struct ccl_token *lookahead;
+ if (KIND == CCL_TOK_LP)
+ {
+ ADVANCE;
+ p1 = find_spec (cclp, qa);
+ if (!p1)
+ return NULL;
+ if (KIND != CCL_TOK_RP)
+ {
+ cclp->error_code = CCL_ERR_RP_EXPECTED;
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ ADVANCE;
+ return p1;
+ }
+ else if (KIND == CCL_TOK_SET)
+ {
+ ADVANCE;
+ if (KIND == CCL_TOK_EQ)
+ ADVANCE;
+ if (KIND != CCL_TOK_TERM)
+ {
+ cclp->error_code = CCL_ERR_SETNAME_EXPECTED;
+ return NULL;
+ }
+ p1 = mk_node (CCL_RPN_SET);
+ p1->u.setname = copy_token_name (cclp->look_token);
+ ADVANCE;
+ return p1;
+ }
+ lookahead = cclp->look_token;
+
+ while (lookahead->kind==CCL_TOK_TERM)
+ {
+ lookahead = lookahead->next;
+ if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
+ return qualifiers1 (cclp, lookahead, qa);
+ if (lookahead->kind != CCL_TOK_COMMA)
+ break;
+ lookahead = lookahead->next;
+ }
+ if (qa)
+ return search_terms (cclp, qa);
+ else
+ {
+ struct ccl_rpn_attr *qa[2];
+ struct ccl_rpn_node *node = 0;
+ int seq;
+ lookahead = cclp->look_token;
+
+ qa[1] = 0;
+ for(seq = 0; ;seq++)
+ {
+ struct ccl_rpn_node *node_sub;
+ qa[0] = ccl_qual_search(cclp, "term", 4, seq);
+ if (!qa[0])
+ break;
+
+ cclp->look_token = lookahead;
+
+ node_sub = search_terms (cclp, qa);
+ if (!node_sub)
+ {
+ ccl_rpn_delete (node);
+ return 0;
+ }
+ if (node)
+ {
+ struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
+ node_this->u.p[0] = node;
+ node_this->u.p[1] = node_sub;
+ node_this->u.p[2] = 0;
+ node = node_this;
+ }
+ else
+ node = node_sub;
+ }
+ if (!node)
+ node = search_terms (cclp, 0);
+ return node;
+ }
+}
+
+/*
+ * find_spec: Parse CCL find specification
+ * cclp: CCL Parser
+ * qa: Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *find_spec (CCL_parser cclp,
+ struct ccl_rpn_attr **qa)
+{
+ struct ccl_rpn_node *p1, *p2, *pn;
+ if (!(p1 = search_elements (cclp, qa)))
+ return NULL;
+ while (1)
+ {
+ switch (KIND)
+ {
+ case CCL_TOK_AND:
+ ADVANCE;
+ p2 = search_elements (cclp, qa);
+ if (!p2)
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ pn = mk_node (CCL_RPN_AND);
+ pn->u.p[0] = p1;
+ pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
+ p1 = pn;
+ continue;
+ case CCL_TOK_OR:
+ ADVANCE;
+ p2 = search_elements (cclp, qa);
+ if (!p2)
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ pn = mk_node (CCL_RPN_OR);
+ pn->u.p[0] = p1;
+ pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
+ p1 = pn;
+ continue;
+ case CCL_TOK_NOT:
+ ADVANCE;
+ p2 = search_elements (cclp, qa);
+ if (!p2)
+ {
+ ccl_rpn_delete (p1);
+ return NULL;
+ }
+ pn = mk_node (CCL_RPN_NOT);
+ pn->u.p[0] = p1;
+ pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
+ p1 = pn;
+ continue;
+ }
+ break;
+ }
+ return p1;
+}
+
+struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list)
+{
+ struct ccl_rpn_node *p;
+
+
+
+ cclp->look_token = list;
+ p = find_spec (cclp, NULL);
+ if (p && KIND != CCL_TOK_EOL)
+ {
+ if (KIND == CCL_TOK_RP)
+ cclp->error_code = CCL_ERR_BAD_RP;
+ else
+ cclp->error_code = CCL_ERR_OP_EXPECTED;
+ ccl_rpn_delete (p);
+ p = NULL;
+ }
+ cclp->error_pos = cclp->look_token->name;
+ if (p)
+ cclp->error_code = CCL_ERR_OK;
+ else
+ cclp->error_code = cclp->error_code;
+ return p;
+}
+
+/*
+ * ccl_find: Parse CCL find - token representation
+ * bibset: Bibset to be used for the parsing
+ * list: List of tokens
+ * error: Pointer to integer. Holds error no. on completion.
+ * pos: Pointer to char position. Holds approximate error position.
+ * return: RPN tree on successful completion; NULL otherwise.
+ */
+struct ccl_rpn_node *ccl_find (CCL_bibset bibset, struct ccl_token *list,
+ int *error, const char **pos)
+{
+ struct ccl_rpn_node *p;
+ CCL_parser cclp = ccl_parser_create ();
+
+ cclp->bibset = bibset;
+
+ p = ccl_parser_find (cclp, list);
+
+ *error = cclp->error_code;
+ *pos = cclp->error_pos;
+
+ ccl_parser_destroy (cclp);
+
+ return p;
+}
+
+/*
+ * ccl_find_str: Parse CCL find - string representation
+ * bibset: Bibset to be used for the parsing
+ * str: String to be parsed
+ * error: Pointer to integer. Holds error no. on completion.
+ * pos: Pointer to char position. Holds approximate error position.
+ * return: RPN tree on successful completion; NULL otherwise.
+ */
+struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
+ int *error, int *pos)
+{
+ CCL_parser cclp = ccl_parser_create ();
+ struct ccl_token *list;
+ struct ccl_rpn_node *p;
+
+ cclp->bibset = bibset;
+
+ list = ccl_parser_tokenize (cclp, str);
+ p = ccl_parser_find (cclp, list);
+
+ *error = cclp->error_code;
+ if (*error)
+ *pos = cclp->error_pos - str;
+ ccl_parser_destroy (cclp);
+ ccl_token_del (list);
+ return p;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL print rpn tree - infix notation
+ * Europagate, 1995
+ *
+ * $Id: cclptree.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.6 1995/05/16 09:39:26 adam
+ * LICENSE.
+ *
+ * Revision 1.5 1995/02/23 08:31:59 adam
+ * Changed header.
+ *
+ * Revision 1.3 1995/02/15 17:42:16 adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.2 1995/02/14 19:55:11 adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.1 1995/02/14 10:25:56 adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/ccl.h>
+
+void fprintSpaces(int indent,FILE * fd_out)
+{
+ char buf[100];
+ sprintf(buf,"%%%d.s",indent);
+ fprintf(fd_out,buf," ");
+}
+
+void ccl_pr_tree_as_qrpn(struct ccl_rpn_node *rpn, FILE *fd_out, int indent)
+{
+ if(indent>0) fprintSpaces(indent,fd_out);
+ switch (rpn->kind)
+ {
+ case CCL_RPN_TERM:
+ if (rpn->u.t.attr_list)
+ {
+ struct ccl_rpn_attr *attr;
+ for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
+ {
+ if (attr->set)
+ fprintf(fd_out, "@attr %s", attr->set);
+ else
+ fprintf(fd_out, "@attr ");
+ switch(attr->kind)
+ {
+ case CCL_RPN_ATTR_NUMERIC:
+ fprintf (fd_out, "%d=%d ", attr->type,
+ attr->value.numeric);
+ break;
+ case CCL_RPN_ATTR_STRING:
+ fprintf (fd_out, "%d=%s ", attr->type,
+ attr->value.str);
+ }
+ }
+ }
+ fprintf (fd_out, "\"%s\"\n", rpn->u.t.term);
+ break;
+ case CCL_RPN_AND:
+ fprintf (fd_out, "@and \n");
+ ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
+ ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
+ break;
+ case CCL_RPN_OR:
+ fprintf (fd_out, "@or \n");
+ ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
+ ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
+ break;
+ case CCL_RPN_NOT:
+ fprintf (fd_out, "@not ");
+ ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
+ ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
+ break;
+ case CCL_RPN_SET:
+ fprintf (fd_out, "set=%s ", rpn->u.setname);
+ break;
+ case CCL_RPN_PROX:
+ if (rpn->u.p[2] && rpn->u.p[2]->kind == CCL_RPN_TERM)
+ {
+ const char *cp = rpn->u.p[2]->u.t.term;
+ /* exlusion distance ordered relation which-code unit-code */
+ if (*cp == '!')
+ {
+ /* word order specified */
+ if (isdigit(cp[1]))
+ fprintf(fd_out, "@prox 0 %s 1 2 known 2", cp+1);
+ else
+ fprintf(fd_out, "@prox 0 1 1 2 known 2");
+ }
+ else if (*cp == '%')
+ {
+ /* word order not specified */
+ if (isdigit(cp[1]))
+ fprintf(fd_out, "@prox 0 %s 0 2 known 2", cp+1);
+ else
+ fprintf(fd_out, "@prox 0 1 0 2 known 2");
+ }
+ }
+ ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2);
+ ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2);
+ break;
+ default:
+ fprintf(stderr,"Internal Error Unknown ccl_rpn node type %d\n",rpn->kind);
+ }
+}
+
+
+void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out)
+{
+ ccl_pr_tree_as_qrpn(rpn,fd_out,0);
+}
+
+
+static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
+{
+ switch (p->kind)
+ {
+ case CCL_RPN_AND:
+ wrbuf_puts(w, "@and ");
+ break;
+ case CCL_RPN_OR:
+ wrbuf_puts(w, "@or ");
+ break;
+ case CCL_RPN_NOT:
+ wrbuf_puts(w, "@not ");
+ break;
+ case CCL_RPN_PROX:
+ if (p->u.p[2] && p->u.p[2]->kind == CCL_RPN_TERM)
+ {
+ const char *cp = p->u.p[2]->u.t.term;
+ /* exlusion distance ordered relation which-code unit-code */
+ if (*cp == '!')
+ {
+ /* word order specified */
+ if (isdigit(cp[1]))
+ wrbuf_printf(w, "@prox 0 %s 1 2 k 2 ", cp+1);
+ else
+ wrbuf_printf(w, "@prox 0 1 1 2 k 2 ");
+ }
+ else if (*cp == '%')
+ {
+ /* word order not specified */
+ if (isdigit(cp[1]))
+ wrbuf_printf(w, "@prox 0 %s 0 2 k 2 ", cp+1);
+ else
+ wrbuf_printf(w, "@prox 0 1 0 2 k 2 ");
+ }
+ }
+ else
+ wrbuf_puts(w, "@prox 0 2 0 1 k 2 ");
+ break;
+ default:
+ wrbuf_puts(w, "@ bad op (unknown) ");
+ }
+ ccl_pquery(w, p->u.p[0]);
+ ccl_pquery(w, p->u.p[1]);
+}
+
+void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
+{
+ struct ccl_rpn_attr *att;
+ const char *cp;
+
+ switch (p->kind)
+ {
+ case CCL_RPN_AND:
+ case CCL_RPN_OR:
+ case CCL_RPN_NOT:
+ case CCL_RPN_PROX:
+ ccl_pquery_complex (w, p);
+ break;
+ case CCL_RPN_SET:
+ wrbuf_puts (w, "@set ");
+ wrbuf_puts (w, p->u.setname);
+ wrbuf_puts (w, " ");
+ break;
+ case CCL_RPN_TERM:
+ for (att = p->u.t.attr_list; att; att = att->next)
+ {
+ char tmpattr[128];
+ wrbuf_puts (w, "@attr ");
+ if (att->set)
+ {
+ wrbuf_puts (w, att->set);
+ wrbuf_puts (w, " ");
+ }
+ switch(att->kind)
+ {
+ case CCL_RPN_ATTR_NUMERIC:
+ sprintf(tmpattr, "%d=%d ", att->type, att->value.numeric);
+ wrbuf_puts (w, tmpattr);
+ break;
+ case CCL_RPN_ATTR_STRING:
+ sprintf(tmpattr, "%d=", att->type);
+ wrbuf_puts (w, tmpattr);
+ wrbuf_puts(w, att->value.str);
+ wrbuf_puts (w, " ");
+ break;
+ }
+ }
+ for (cp = p->u.t.term; *cp; cp++)
+ {
+ if (*cp == ' ' || *cp == '\\')
+ wrbuf_putc (w, '\\');
+ wrbuf_putc (w, *cp);
+ }
+ wrbuf_puts (w, " ");
+ break;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL qualifiers
+ * Europagate, 1995
+ *
+ * $Id: cclqfile.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.3 1995/05/16 09:39:26 adam
+ * LICENSE.
+ *
+ * Revision 1.2 1995/05/11 14:03:56 adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.1 1995/04/17 09:31:45 adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+void ccl_qual_field (CCL_bibset bibset, const char *cp, const char *qual_name)
+{
+ char qual_spec[128];
+ int type_ar[128];
+ int value_ar[128];
+ char *svalue_ar[128];
+ char *attsets[128];
+ int pair_no = 0;
+
+ while (pair_no < 128)
+ {
+ char *qual_value, *qual_type;
+ char *split, *setp;
+ int no_scan = 0;
+
+ if (sscanf (cp, "%100s%n", qual_spec, &no_scan) < 1)
+ break;
+
+ if (!(split = strchr (qual_spec, '=')))
+ {
+ /* alias specification .. */
+ if (pair_no == 0)
+ {
+ ccl_qual_add_combi (bibset, qual_name, cp);
+ return;
+ }
+ break;
+ }
+ /* [set,]type=value ... */
+ cp += no_scan;
+
+ *split++ = '\0';
+
+ setp = strchr (qual_spec, ',');
+ if (setp)
+ {
+ /* set,type=value ... */
+ *setp++ = '\0';
+ qual_type = setp;
+ }
+ else
+ {
+ /* type=value ... */
+ qual_type = qual_spec;
+ }
+ while (pair_no < 128)
+ {
+ int type, value;
+
+ qual_value = split;
+ if ((split = strchr (qual_value, ',')))
+ *split++ = '\0';
+
+ value = 0;
+ switch (qual_type[0])
+ {
+ case 'u':
+ case 'U':
+ type = CCL_BIB1_USE;
+ break;
+ case 'r':
+ case 'R':
+ type = CCL_BIB1_REL;
+ if (!ccl_stricmp (qual_value, "o"))
+ value = CCL_BIB1_REL_ORDER;
+ break;
+ case 'p':
+ case 'P':
+ type = CCL_BIB1_POS;
+ break;
+ case 's':
+ case 'S':
+ type = CCL_BIB1_STR;
+ if (!ccl_stricmp (qual_value, "pw"))
+ value = CCL_BIB1_STR_WP;
+ if (!ccl_stricmp (qual_value, "al"))
+ value = CCL_BIB1_STR_AND_LIST;
+ if (!ccl_stricmp (qual_value, "ol"))
+ value = CCL_BIB1_STR_OR_LIST;
+ break;
+ case 't':
+ case 'T':
+ type = CCL_BIB1_TRU;
+ if (!ccl_stricmp (qual_value, "l"))
+ value = CCL_BIB1_TRU_CAN_LEFT;
+ else if (!ccl_stricmp (qual_value, "r"))
+ value = CCL_BIB1_TRU_CAN_RIGHT;
+ else if (!ccl_stricmp (qual_value, "b"))
+ value = CCL_BIB1_TRU_CAN_BOTH;
+ else if (!ccl_stricmp (qual_value, "n"))
+ value = CCL_BIB1_TRU_CAN_NONE;
+ break;
+ case 'c':
+ case 'C':
+ type = CCL_BIB1_COM;
+ break;
+ default:
+ type = atoi (qual_type);
+ }
+
+ type_ar[pair_no] = type;
+
+ if (value)
+ {
+ value_ar[pair_no] = value;
+ svalue_ar[pair_no] = 0;
+ }
+ else if (*qual_value >= '0' && *qual_value <= '9')
+ {
+ value_ar[pair_no] = atoi (qual_value);
+ svalue_ar[pair_no] = 0;
+ }
+ else
+ {
+ size_t len;
+ if (split)
+ len = split - qual_value;
+ else
+ len = strlen(qual_value);
+ svalue_ar[pair_no] = xmalloc(len+1);
+ memcpy(svalue_ar[pair_no], qual_value, len);
+ svalue_ar[pair_no][len] = '\0';
+ }
+ if (setp)
+ {
+ attsets[pair_no] = (char*) xmalloc (strlen(qual_spec)+1);
+ strcpy (attsets[pair_no], qual_spec);
+ }
+ else
+ attsets[pair_no] = 0;
+ pair_no++;
+ if (!split)
+ break;
+ }
+ }
+ ccl_qual_add_set (bibset, qual_name, pair_no, type_ar, value_ar, svalue_ar,
+ attsets);
+}
+
+void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name)
+{
+ if (*qual_name == '@')
+ ccl_qual_add_special(bibset, qual_name+1, cp);
+ else
+ ccl_qual_field(bibset, cp, qual_name);
+}
+
+/*
+ * ccl_qual_file: Read bibset definition from file.
+ * bibset: Bibset
+ * inf: FILE pointer.
+ *
+ * Each line format is:
+ * <name> <t>=<v> <t>=<v> ....
+ * Where <name> is name of qualifier;
+ * <t>=<v> is a attribute definition pair where <t> is one of:
+ * u(use), r(relation), p(position), t(truncation), c(completeness)
+ * or plain integer.
+ * <v> is an integer or special pseudo-value.
+ */
+void ccl_qual_file (CCL_bibset bibset, FILE *inf)
+{
+ char line[256];
+ char *cp, *cp1;
+ char qual_name[128];
+
+ while (fgets (line, 255, inf))
+ {
+ int no_scan = 0;
+
+ cp = line;
+ if (*cp == '#')
+ continue; /* ignore lines starting with # */
+ if (sscanf (cp, "%100s%n", qual_name, &no_scan) < 1)
+ continue; /* also ignore empty lines */
+ cp += no_scan;
+ cp1 = strchr(cp, '#');
+ if (cp1)
+ *cp1 = '\0';
+ ccl_qual_fitem (bibset, cp, qual_name);
+ }
+}
+
+int ccl_qual_fname (CCL_bibset bibset, const char *fname)
+{
+ FILE *inf;
+ inf = fopen (fname, "r");
+ if (!inf)
+ return -1;
+ ccl_qual_file (bibset, inf);
+ fclose (inf);
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL qualifiers
+ * Europagate, 1995
+ *
+ * $Id: cclqual.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.9 1995/05/16 09:39:27 adam
+ * LICENSE.
+ *
+ * Revision 1.8 1995/05/11 14:03:57 adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.7 1995/04/17 09:31:46 adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.6 1995/02/23 08:32:00 adam
+ * Changed header.
+ *
+ * Revision 1.4 1995/02/14 19:55:12 adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.3 1995/02/14 16:20:56 adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.2 1995/02/14 10:25:56 adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.1 1995/02/13 15:15:07 adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+/* Definition of CCL_bibset pointer */
+struct ccl_qualifiers {
+ struct ccl_qualifier *list;
+ struct ccl_qualifier_special *special;
+};
+
+
+/* CCL Qualifier special */
+struct ccl_qualifier_special {
+ char *name;
+ char *value;
+ struct ccl_qualifier_special *next;
+};
+
+
+static struct ccl_qualifier *ccl_qual_lookup (CCL_bibset b,
+ const char *n, size_t len)
+{
+ struct ccl_qualifier *q;
+ for (q = b->list; q; q = q->next)
+ if (len == strlen(q->name) && !memcmp (q->name, n, len))
+ break;
+ return q;
+}
+
+
+void ccl_qual_add_special (CCL_bibset bibset, const char *n, const char *v)
+{
+ struct ccl_qualifier_special *p;
+ const char *pe;
+
+ for (p = bibset->special; p && strcmp(p->name, n); p = p->next)
+ ;
+ if (p)
+ xfree (p->value);
+ else
+ {
+ p = (struct ccl_qualifier_special *) xmalloc (sizeof(*p));
+ p->name = ccl_strdup (n);
+ p->value = 0;
+ p->next = bibset->special;
+ bibset->special = p;
+ }
+ while (strchr(" \t", *v))
+ ++v;
+ for (pe = v + strlen(v); pe != v; --pe)
+ if (!strchr(" \n\r\t", pe[-1]))
+ break;
+ p->value = (char*) xmalloc (pe - v + 1);
+ if (pe - v)
+ memcpy (p->value, v, pe - v);
+ p->value[pe - v] = '\0';
+}
+
+static int next_token(const char **cpp, const char **dst)
+{
+ int len = 0;
+ const char *cp = *cpp;
+ while (*cp && strchr(" \r\n\t\f", *cp))
+ cp++;
+ if (dst)
+ *dst = cp;
+ len = 0;
+ while (*cp && !strchr(" \r\n\t\f", *cp))
+ {
+ cp++;
+ len++;
+ }
+ *cpp = cp;
+ return len;
+}
+
+void ccl_qual_add_combi (CCL_bibset b, const char *n, const char *names)
+{
+ const char *cp, *cp1;
+ int i, len;
+ struct ccl_qualifier *q;
+ for (q = b->list; q && strcmp(q->name, n); q = q->next)
+ ;
+ if (q)
+ return ;
+ q = (struct ccl_qualifier *) xmalloc (sizeof(*q));
+ q->name = ccl_strdup (n);
+ q->attr_list = 0;
+ q->next = b->list;
+ b->list = q;
+
+ cp = names;
+ for (i = 0; next_token(&cp, 0); i++)
+ ;
+ q->no_sub = i;
+ q->sub = (struct ccl_qualifier **) xmalloc (sizeof(*q->sub) *
+ (1+q->no_sub));
+ cp = names;
+ for (i = 0; (len = next_token(&cp, &cp1)); i++)
+ {
+ q->sub[i] = ccl_qual_lookup (b, cp1, len);
+ }
+}
+
+/*
+ * ccl_qual_add: Add qualifier to Bibset. If qualifier already
+ * exists, then attributes are appendend to old
+ * definition.
+ * name: name of qualifier
+ * no: No of attribute type/value pairs.
+ * pairs: Attributes. pairs[0] first type, pair[1] first value,
+ * ... pair[2*no-2] last type, pair[2*no-1] last value.
+ */
+
+void ccl_qual_add_set (CCL_bibset b, const char *name, int no,
+ int *type_ar, int *value_ar, char **svalue_ar,
+ char **attsets)
+{
+ struct ccl_qualifier *q;
+ struct ccl_rpn_attr **attrp;
+
+ ccl_assert (b);
+ for (q = b->list; q; q = q->next)
+ if (!strcmp (name, q->name))
+ break;
+ if (!q)
+ {
+ struct ccl_qualifier *new_qual =
+ (struct ccl_qualifier *)xmalloc (sizeof(*new_qual));
+ ccl_assert (new_qual);
+
+ new_qual->next = b->list;
+ b->list = new_qual;
+
+ new_qual->name = ccl_strdup (name);
+ attrp = &new_qual->attr_list;
+
+ new_qual->no_sub = 0;
+ new_qual->sub = 0;
+ }
+ else
+ {
+ if (q->sub) /* suspect.. */
+ xfree (q->sub);
+ attrp = &q->attr_list;
+ while (*attrp)
+ attrp = &(*attrp)->next;
+ }
+ while (--no >= 0)
+ {
+ struct ccl_rpn_attr *attr;
+
+ attr = (struct ccl_rpn_attr *)xmalloc (sizeof(*attr));
+ ccl_assert (attr);
+ attr->set = *attsets++;
+ attr->type = *type_ar++;
+ if (*svalue_ar)
+ {
+ attr->kind = CCL_RPN_ATTR_STRING;
+ attr->value.str = *svalue_ar;
+ }
+ else
+ {
+ attr->kind = CCL_RPN_ATTR_NUMERIC;
+ attr->value.numeric = *value_ar;
+ }
+ svalue_ar++;
+ value_ar++;
+ *attrp = attr;
+ attrp = &attr->next;
+ }
+ *attrp = NULL;
+}
+
+/*
+ * ccl_qual_mk: Make new (empty) bibset.
+ * return: empty bibset.
+ */
+CCL_bibset ccl_qual_mk (void)
+{
+ CCL_bibset b = (CCL_bibset)xmalloc (sizeof(*b));
+ ccl_assert (b);
+ b->list = NULL;
+ b->special = NULL;
+ return b;
+}
+
+/*
+ * ccl_qual_rm: Delete bibset.
+ * b: pointer to bibset
+ */
+void ccl_qual_rm (CCL_bibset *b)
+{
+ struct ccl_qualifier *q, *q1;
+ struct ccl_qualifier_special *sp, *sp1;
+
+ if (!*b)
+ return;
+ for (q = (*b)->list; q; q = q1)
+ {
+ struct ccl_rpn_attr *attr, *attr1;
+
+ for (attr = q->attr_list; attr; attr = attr1)
+ {
+ attr1 = attr->next;
+ if (attr->set)
+ xfree(attr->set);
+ if (attr->kind == CCL_RPN_ATTR_STRING)
+ xfree(attr->value.str);
+ xfree (attr);
+ }
+ q1 = q->next;
+ xfree (q->name);
+ if (q->sub)
+ xfree (q->sub);
+ xfree (q);
+ }
+ for (sp = (*b)->special; sp; sp = sp1)
+ {
+ sp1 = sp->next;
+ xfree (sp->name);
+ xfree (sp->value);
+ xfree (sp);
+ }
+ xfree (*b);
+ *b = NULL;
+}
+
+/*
+ * ccl_qual_search: Search for qualifier in bibset.
+ * b: Bibset
+ * name: Name of qualifier to search for (need no null-termination)
+ * len: Length of name.
+ * return: Attribute info. NULL if not found.
+ */
+struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp,
+ const char *name, size_t len,
+ int seq)
+{
+ struct ccl_qualifier *q;
+ const char *aliases;
+ int case_sensitive = cclp->ccl_case_sensitive;
+
+ ccl_assert (cclp);
+ if (!cclp->bibset)
+ return NULL;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "case");
+ if (aliases)
+ case_sensitive = atoi(aliases);
+
+ for (q = cclp->bibset->list; q; q = q->next)
+ if (strlen(q->name) == len)
+ {
+ if (case_sensitive)
+ {
+ if (!memcmp (name, q->name, len))
+ break;
+ }
+ else
+ {
+ if (!ccl_memicmp (name, q->name, len))
+ break;
+ }
+ }
+ if (q)
+ {
+ if (q->attr_list && seq == 0)
+ return q->attr_list;
+ if (seq < q->no_sub && q->sub[seq])
+ {
+ return q->sub[seq]->attr_list;
+ }
+ }
+ return 0;
+}
+
+const char *ccl_qual_search_special (CCL_bibset b,
+ const char *name)
+{
+ struct ccl_qualifier_special *q;
+ if (!b)
+ return 0;
+ for (q = b->special; q && strcmp(q->name, name); q = q->next)
+ ;
+ if (q)
+ return q->value;
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL string compare utilities
+ * Europagate, 1995
+ *
+ * $Id: cclstr.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.3 1996/01/24 10:11:19 adam
+ * Added include of stdlib.h.
+ *
+ * Revision 1.2 1995/05/16 09:39:27 adam
+ * LICENSE.
+ *
+ * Revision 1.1 1995/05/11 14:03:57 adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ */
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/ccl.h>
+
+static int ccli_toupper (int c)
+{
+ return toupper (c);
+}
+
+int (*ccl_toupper)(int c) = NULL;
+
+int ccl_stricmp (const char *s1, const char *s2)
+{
+ if (!ccl_toupper)
+ ccl_toupper = ccli_toupper;
+ while (*s1 && *s2)
+ {
+ int c1, c2;
+ c1 = (*ccl_toupper)(*s1);
+ c2 = (*ccl_toupper)(*s2);
+ if (c1 != c2)
+ return c1 - c2;
+ s1++;
+ s2++;
+ }
+ return (*ccl_toupper)(*s1) - (*ccl_toupper)(*s2);
+}
+
+int ccl_memicmp (const char *s1, const char *s2, size_t n)
+{
+ if (!ccl_toupper)
+ ccl_toupper = ccli_toupper;
+ while (1)
+ {
+ int c1, c2;
+
+ c1 = (*ccl_toupper)(*s1);
+ c2 = (*ccl_toupper)(*s2);
+ if (n <= 1 || c1 != c2)
+ return c1 - c2;
+ s1++;
+ s2++;
+ --n;
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL - lexical analysis
+ * Europagate, 1995
+ *
+ * $Id: ccltoken.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.10 1995/07/11 12:28:31 adam
+ * New function: ccl_token_simple (split into simple tokens) and
+ * ccl_token_del (delete tokens).
+ *
+ * Revision 1.9 1995/05/16 09:39:28 adam
+ * LICENSE.
+ *
+ * Revision 1.8 1995/05/11 14:03:57 adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.7 1995/04/19 12:11:24 adam
+ * Minor change.
+ *
+ * Revision 1.6 1995/04/17 09:31:48 adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.5 1995/02/23 08:32:00 adam
+ * Changed header.
+ *
+ * Revision 1.3 1995/02/15 17:42:16 adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.2 1995/02/14 19:55:13 adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.1 1995/02/13 12:35:21 adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <yaz/ccl.h>
+
+/*
+ * token_cmp: Compare token with keyword(s)
+ * kw: Keyword list. Each keyword is separated by space.
+ * token: CCL token.
+ * return: 1 if token string matches one of the keywords in list;
+ * 0 otherwise.
+ */
+static int token_cmp (CCL_parser cclp, const char *kw, struct ccl_token *token)
+{
+ const char *cp1 = kw;
+ const char *cp2;
+ const char *aliases;
+ int case_sensitive = cclp->ccl_case_sensitive;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "case");
+ if (aliases)
+ case_sensitive = atoi(aliases);
+ if (!kw)
+ return 0;
+ while ((cp2 = strchr (cp1, ' ')))
+ {
+ if (token->len == (size_t) (cp2-cp1))
+ {
+ if (case_sensitive)
+ {
+ if (!memcmp (cp1, token->name, token->len))
+ return 1;
+ }
+ else
+ {
+ if (!ccl_memicmp (cp1, token->name, token->len))
+ return 1;
+ }
+ }
+ cp1 = cp2+1;
+ }
+ if (case_sensitive)
+ return token->len == strlen(cp1)
+ && !memcmp (cp1, token->name, token->len);
+ return token->len == strlen(cp1) &&
+ !ccl_memicmp (cp1, token->name, token->len);
+}
+
+/*
+ * ccl_token_simple: tokenize CCL raw tokens
+ */
+struct ccl_token *ccl_token_simple (const char *command)
+{
+ const char *cp = command;
+ struct ccl_token *first = NULL;
+ struct ccl_token *last = NULL;
+
+ while (1)
+ {
+ while (*cp && strchr (" \t\r\n", *cp))
+ {
+ cp++;
+ continue;
+ }
+ if (!first)
+ {
+ first = last = (struct ccl_token *)xmalloc (sizeof (*first));
+ ccl_assert (first);
+ last->prev = NULL;
+ }
+ else
+ {
+ last->next = (struct ccl_token *)xmalloc (sizeof(*first));
+ ccl_assert (last->next);
+ last->next->prev = last;
+ last = last->next;
+ }
+ last->next = NULL;
+ last->name = cp;
+ last->len = 1;
+ switch (*cp++)
+ {
+ case '\0':
+ last->kind = CCL_TOK_EOL;
+ return first;
+ case '\"':
+ last->kind = CCL_TOK_TERM;
+ last->name = cp;
+ last->len = 0;
+ while (*cp && *cp != '\"')
+ {
+ cp++;
+ ++ last->len;
+ }
+ if (*cp == '\"')
+ cp++;
+ break;
+ default:
+ while (*cp && !strchr (" \t\n\r", *cp))
+ {
+ cp++;
+ ++ last->len;
+ }
+ last->kind = CCL_TOK_TERM;
+ }
+ }
+ return first;
+}
+
+
+/*
+ * ccl_tokenize: tokenize CCL command string.
+ * return: CCL token list.
+ */
+struct ccl_token *ccl_parser_tokenize (CCL_parser cclp, const char *command)
+{
+ const char *aliases;
+ const char *cp = command;
+ struct ccl_token *first = NULL;
+ struct ccl_token *last = NULL;
+
+ while (1)
+ {
+ while (*cp && strchr (" \t\r\n", *cp))
+ {
+ cp++;
+ continue;
+ }
+ if (!first)
+ {
+ first = last = (struct ccl_token *)xmalloc (sizeof (*first));
+ ccl_assert (first);
+ last->prev = NULL;
+ }
+ else
+ {
+ last->next = (struct ccl_token *)xmalloc (sizeof(*first));
+ ccl_assert (last->next);
+ last->next->prev = last;
+ last = last->next;
+ }
+ last->next = NULL;
+ last->name = cp;
+ last->len = 1;
+ switch (*cp++)
+ {
+ case '\0':
+ last->kind = CCL_TOK_EOL;
+ return first;
+ case '(':
+ last->kind = CCL_TOK_LP;
+ break;
+ case ')':
+ last->kind = CCL_TOK_RP;
+ break;
+ case ',':
+ last->kind = CCL_TOK_COMMA;
+ break;
+ case '%':
+ case '!':
+ last->kind = CCL_TOK_PROX;
+ while (isdigit(*cp))
+ {
+ ++ last->len;
+ cp++;
+ }
+ break;
+ case '>':
+ case '<':
+ case '=':
+ if (*cp == '=' || *cp == '<' || *cp == '>')
+ {
+ cp++;
+ last->kind = CCL_TOK_REL;
+ ++ last->len;
+ }
+ else if (cp[-1] == '=')
+ last->kind = CCL_TOK_EQ;
+ else
+ last->kind = CCL_TOK_REL;
+ break;
+ case '\"':
+ last->kind = CCL_TOK_TERM;
+ last->name = cp;
+ last->len = 0;
+ while (*cp && *cp != '\"')
+ {
+ cp++;
+ ++ last->len;
+ }
+ if (*cp == '\"')
+ cp++;
+ break;
+ default:
+ if (!strchr ("(),%!><= \t\n\r", cp[-1]))
+ {
+ while (*cp && !strchr ("(),%!><= \t\n\r", *cp))
+ {
+ cp++;
+ ++ last->len;
+ }
+ }
+ last->kind = CCL_TOK_TERM;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "and");
+ if (!aliases)
+ aliases = cclp->ccl_token_and;
+ if (token_cmp (cclp, aliases, last))
+ last->kind = CCL_TOK_AND;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "or");
+ if (!aliases)
+ aliases = cclp->ccl_token_or;
+ if (token_cmp (cclp, aliases, last))
+ last->kind = CCL_TOK_OR;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "not");
+ if (!aliases)
+ aliases = cclp->ccl_token_not;
+ if (token_cmp (cclp, aliases, last))
+ last->kind = CCL_TOK_NOT;
+
+ aliases = ccl_qual_search_special(cclp->bibset, "set");
+ if (!aliases)
+ aliases = cclp->ccl_token_set;
+
+ if (token_cmp (cclp, aliases, last))
+ last->kind = CCL_TOK_SET;
+ }
+ }
+ return first;
+}
+
+struct ccl_token *ccl_tokenize (const char *command)
+{
+ CCL_parser cclp = ccl_parser_create ();
+ struct ccl_token *list;
+
+ list = ccl_parser_tokenize (cclp, command);
+
+ ccl_parser_destroy (cclp);
+ return list;
+}
+
+/*
+ * ccl_token_del: delete CCL tokens
+ */
+void ccl_token_del (struct ccl_token *list)
+{
+ struct ccl_token *list1;
+
+ while (list)
+ {
+ list1 = list->next;
+ xfree (list);
+ list = list1;
+ }
+}
+
+char *ccl_strdup (const char *str)
+{
+ int len = strlen(str);
+ char *p = (char*) xmalloc (len+1);
+ strcpy (p, str);
+ return p;
+}
+
+CCL_parser ccl_parser_create (void)
+{
+ CCL_parser p = (CCL_parser)xmalloc (sizeof(*p));
+ if (!p)
+ return p;
+ p->look_token = NULL;
+ p->error_code = 0;
+ p->error_pos = NULL;
+ p->bibset = NULL;
+
+ p->ccl_token_and = ccl_strdup("and");
+ p->ccl_token_or = ccl_strdup("or");
+ p->ccl_token_not = ccl_strdup("not andnot");
+ p->ccl_token_set = ccl_strdup("set");
+ p->ccl_case_sensitive = 1;
+
+ return p;
+}
+
+void ccl_parser_destroy (CCL_parser p)
+{
+ if (!p)
+ return;
+ xfree (p->ccl_token_and);
+ xfree (p->ccl_token_or);
+ xfree (p->ccl_token_not);
+ xfree (p->ccl_token_set);
+ xfree (p);
+}
+
+void ccl_parser_set_op_and (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_and)
+ xfree (p->ccl_token_and);
+ p->ccl_token_and = ccl_strdup (op);
+ }
+}
+
+void ccl_parser_set_op_or (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_or)
+ xfree (p->ccl_token_or);
+ p->ccl_token_or = ccl_strdup (op);
+ }
+}
+void ccl_parser_set_op_not (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_not)
+ xfree (p->ccl_token_not);
+ p->ccl_token_not = ccl_strdup (op);
+ }
+}
+void ccl_parser_set_op_set (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_set)
+ xfree (p->ccl_token_set);
+ p->ccl_token_set = ccl_strdup (op);
+ }
+}
+
+void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag)
+{
+ if (p)
+ p->ccl_case_sensitive = case_sensitivity_flag;
+}
--- /dev/null
+<!-- ============================================================= -->
+<!-- MODULE: Character to Entity Specification -->
+<!-- VERSION: 3.0 (Morgan Cundiff and Randll Barry) -->
+<!-- DATE: June 18, 2001 -->
+<!-- -->
+<!-- MULBERRY INTERNAL VERSION CONTROL: -->
+<!-- $Id: charconv.sgm,v 1.1 2003-10-27 12:21:30 adam Exp $ -->
+<!-- ============================================================= -->
+
+<!-- ============================================================= -->
+<!-- SYSTEM: MARC <-> SGML <-> XML Conversion -->
+<!-- -->
+<!-- PURPOSE: Define relationships between MARC Extended Latin -->
+<!-- character set, character numbers, SGML entities -->
+<!-- and XML entities. -->
+<!-- -->
+<!-- CONTAINS: SGML Document conforming to the Character-Entity -->
+<!-- Map File DTD -->
+<!-- -->
+<!-- MODULES REQUIRED: -->
+<!-- None -->
+<!-- -->
+<!-- CREATED FOR: -->
+<!-- MARC Standards Office -->
+<!-- -->
+<!-- ORIGINAL CREATION DATE: -->
+<!-- October 1997 -->
+<!-- -->
+<!-- CREATED BY: -->
+<!-- Mulberry Technologies, Inc. (TKG) -->
+<!-- 17 West Jefferson Street, Suite 207 -->
+<!-- Rockville, MD 20850 USA -->
+<!-- Phone: +1 301/315-9631 -->
+<!-- Fax: +1 301/315-8285 -->
+<!-- e-mail: info@mulberrytech.com -->
+<!-- WWW: http://www.mulberrytech.com -->
+<!-- ============================================================= -->
+<entitymap>
+<character hex="E2 41" dec="226 065"><isoentity>Aacute</isoentity><desc>latin capital letter a with acute</desc><unientity>00C1</unientity></character>
+<character hex="E2 61" dec="226 097"><isoentity>aacute</isoentity><desc>latin small letter a with acute</desc><unientity>00E1</unientity></character>
+<character hex="E2 E6 41" dec="226 230 065"><isoentity>Abreveac</isoentity><desc>latin capital letter a with breve and acute</desc><unientity>1EAE</unientity></character>
+<character hex="E2 E6 61" dec="226 230 096"><isoentity>abreveac</isoentity><desc>latin small letter a with breve and acute</desc><unientity>1EAF</unientity></character>
+<character hex="E6 F2 41" dec="230 242 065"><isoentity>Abrevedb</isoentity><desc>latin capital letter a with breve and dot below</desc><unientity>1EB6</unientity></character>
+<character hex="E6 F2 61" dec="230 242 097"><isoentity>abrevedb</isoentity><desc>latin small letter a with breve and dot below</desc><unientity>1EB7</unientity></character>
+<character hex="E1 E6 41" dec="225 230 065"><isoentity>Abrevegr</isoentity><desc>latin capital letter a with breve and grave</desc><unientity>1EB0</unientity></character>
+<character hex="E1 E6 61" dec="225 230 097"><isoentity>abrevegr</isoentity><desc>latin small letter a with breve and grave</desc><unientity>1EB1</unientity></character>
+<character hex="E0 E6 41" dec="224 230 065"><isoentity>Abreveha</isoentity><desc>latin capital letter a with breve and hook above</desc><unientity>1EB2</unientity></character>
+<character hex="E0 E6 61" dec="224 230 097"><isoentity>abreveha</isoentity><desc>latin small letter a with breve and hook above</desc><unientity>1EB3</unientity></character>
+<character hex="E4 E6 41" dec="228 230 065"><isoentity>Abreveti</isoentity><desc>latin capital letter a with breve and tilde</desc><unientity>1EB4</unientity></character>
+<character hex="E4 E6 61" dec="228 230 097"><isoentity>abreveti</isoentity><desc>latin small letter a with breve and tilde</desc><unientity>1EB5</unientity></character>
+<character hex="E6 41" dec="230 065"><isoentity>Abreve</isoentity><desc>latin capital letter a with breve</desc><unientity>0102</unientity></character>
+<character hex="E6 61" dec="230 097"><isoentity>abreve</isoentity><desc>latin small letter a with breve</desc><unientity>0103</unientity></character>
+<character hex="E9 41" dec="233 065"><isoentity>Acaron</isoentity><desc>latin capital letter a with caron</desc><unientity>01CD</unientity></character>
+<character hex="E9 61" dec="233 097"><isoentity>acaron</isoentity><desc>latin small letter a with caron</desc><unientity>01CE</unientity></character>
+<character hex="E3 E2 41" dec="227 226 065"><isoentity>Acircac</isoentity><desc>latin capital letter a with circumflex and acute</desc><unientity>1EA4</unientity></character>
+<character hex="E3 E2 61" dec="227 226 097"><isoentity>acircac</isoentity><desc>latin small letter a with circumflex and acute</desc><unientity>1EA5</unientity></character>
+<character hex="E3 F2 41" dec="227 242 065"><isoentity>Acircdb</isoentity><desc>latin capital letter a with circumflex and dot below</desc><unientity>1EAC</unientity></character>
+<character hex="E3 F2 61" dec="227 242 097"><isoentity>acircdb</isoentity><desc>latin small letter a with circumflex and dot below</desc><unientity>1EAD</unientity></character>
+<character hex="E3 E1 41" dec="227 225 065"><isoentity>acircgr</isoentity><desc>latin capital letter a with circumflex and grave</desc><unientity>1EA6</unientity></character>
+<character hex="E3 E1 61" dec="227 225 097"><isoentity>acircgr</isoentity><desc>latin small letter a with circumflex and grave</desc><unientity>1EA7</unientity></character>
+<character hex="E3 E0 41" dec="227 224 064"><isoentity>Acircha</isoentity><desc>latin capital letter a with circumflex and hook above</desc><unientity>1EA8</unientity></character>
+<character hex="E3 E0 61" dec="227 224 097"><isoentity>acircha</isoentity><desc>latin small letter a with circumflex and hook above</desc><unientity>1EA9</unientity></character>
+<character hex="E4 E3 41" dec="228 227 065"><isoentity>Acircti</isoentity><desc>latin capital letter a with circumflex and tilde</desc><unientity>1EAA</unientity></character>
+<character hex="E4 E3 61" dec="228 227 097"><isoentity>acircti</isoentity><desc>latin small letter a with circumflex and tilde</desc><unientity>1EAB</unientity></character>
+<character hex="E3 41" dec="227 065"><isoentity>Acirc</isoentity><desc>latin capital letter a with circumflex</desc><unientity>00C2</unientity></character>
+<character hex="E3 61" dec="227 097"><isoentity>acirc</isoentity><desc>latin small letter a with circumflex</desc><unientity>00E2</unientity></character>
+<character hex="E2" dec="226"><isoentity>acute</isoentity><desc>combining acute accent</desc><unientity>0301</unientity></character>
+<character hex="E5 E7 41" dec="229 231 065"><isoentity>Adotama</isoentity><desc>latin capital letter a with dot above and macron</desc><unientity>01E0</unientity></character>
+<character hex="E5 E7 61" dec="229 231 097"><isoentity>adotama</isoentity><desc>latin small letter a with dot above and macron</desc><unientity>01E1</unientity></character>
+<character hex="F2 41" dec="242 065"><isoentity>Adotb</isoentity><desc>latin capital letter a with dot below</desc><unientity>1EA0</unientity></character>
+<character hex="F2 61" dec="242 097"><isoentity>adotb</isoentity><desc>latin small letter a with dot below</desc><unientity>1EA1</unientity></character>
+<character hex="E7 41" dec="231 065"><isoentity>Adot</isoentity><desc>latin capital letter a with dot above</desc><unientity>0226</unientity></character>
+<character hex="E7 61" dec="231 097"><isoentity>adot</isoentity><desc>latin small letter a with dot above</desc><unientity>0227</unientity></character>
+<character hex="E2 A5" dec="226 165"><isoentity>Aeacute</isoentity><desc>latin capital letter ae with acute</desc><unientity>01FC</unientity></character>
+<character hex="E2 B5" dec="226 181"><isoentity>aeacute</isoentity><desc>latin small letter ae with acute</desc><unientity>01FD</unientity></character>
+<character hex="A5" dec="165"><isoentity>AElig</isoentity><desc>latin capital letter ae</desc><unientity>00C6</unientity></character>
+<character hex="B5" dec="181"><isoentity>aelig</isoentity><desc>latin small letter ae</desc><unientity>00E6</unientity></character>
+<character hex="E5 A5" dec="229 065"><isoentity>Aemacr</isoentity><desc>latin capital letter ae with macron</desc><unientity>01E2</unientity></character>
+<character hex="E5 B5" dec="229 097"><isoentity>aemacr</isoentity><desc>latin small letter ae with macron</desc><unientity>01E3</unientity></character>
+<character hex="E1 41" dec="225 065"><isoentity>Agrave</isoentity><desc>latin capital letter a with grave</desc><unientity>00C0</unientity></character>
+<character hex="E1 61" dec="225 097"><isoentity>agrave</isoentity><desc>latin small letter a with grave</desc><unientity>00E0</unientity></character>
+<character hex="E0 41" dec="224 065"><isoentity>Ahooka</isoentity><desc>latin capital letter a with hook above</desc><unientity>1EA2</unientity></character>
+<character hex="E0 61" dec="224 097"><isoentity>ahooka</isoentity><desc>latin small letter a with hook above</desc><unientity>1EA3</unientity></character>
+<character hex="1B 67 61 1B 73" dec="027 103 097 027 115"><isoentity>alpha</isoentity><desc>greek small letter alpha</desc><unientity>03B1</unientity></character>
+<character hex="E5 41" dec="229 065"><isoentity>Amacr</isoentity><desc>latin capital letter a with macron</desc><unientity>0100</unientity></character>
+<character hex="E5 61" dec="229 097"><isoentity>amacr</isoentity><desc>latin small letter a with macron</desc><unientity>0101</unientity></character>
+<character hex="F1 41" dec="241 065"><isoentity>Aogon</isoentity><desc>latin capital letter a with ogonek</desc><unientity>0104</unientity></character>
+<character hex="F1 61" dec="241 097"><isoentity>aogon</isoentity><desc>latin small letter a with ogonek</desc><unientity>0105</unientity></character>
+<character hex="E2 EA 41" dec="226 234 065"><isoentity>Aringac</isoentity><desc>latin capital letter a with ring above and acute</desc><unientity>01FA</unientity></character>
+<character hex="E2 EA 61" dec="226 234 096"><isoentity>aringac</isoentity><desc>latin small letter a with ring above and acute</desc><unientity>01FB</unientity></character>
+<character hex="EA 41" dec="234 065"><isoentity>Aring</isoentity><desc>latin capital letter a with ring</desc><unientity>00C5</unientity></character>
+<character hex="EA 61" dec="234 097"><isoentity>aring</isoentity><desc>latin small letter a with ring</desc><unientity>00E5</unientity></character>
+<character hex="E4 41" dec="228 065"><isoentity>Atilde</isoentity><desc>latin capital letter a with tilde</desc><unientity>00C3</unientity></character>
+<character hex="E4 61" dec="228 097"><isoentity>atilde</isoentity><desc>latin small letter a with tilde</desc><unientity>00E3</unientity></character>
+<character hex="E5 E8 41" dec="229 232 065"><isoentity>Aumlma</isoentity><desc>latin capital letter a with diaeresis and macron</desc><unientity>01DE</unientity></character>
+<character hex="E5 E8 61" dec="229 232 097"><isoentity>aumlma</isoentity><desc>latin small letter a with diaeresis and macron</desc><unientity>01DF</unientity></character>
+<character hex="E8 41" dec="232 065"><isoentity>Auml</isoentity><desc>latin capital letter a with umlaut</desc><unientity>00C4</unientity></character>
+<character hex="E8 61" dec="232 097"><isoentity>auml</isoentity><desc>latin small letter a with umlaut</desc><unientity>00E4</unientity></character>
+<character hex="E7 42" dec="231 066"><isoentity>Bdota</isoentity><desc>latin capital letter b with dot above</desc><unientity>1E02</unientity></character>
+<character hex="E7 62" dec="231 098"><isoentity>bdota</isoentity><desc>latin small letter b with dot above</desc><unientity>1E03</unientity></character>
+<character hex="F2 42" dec="242 066"><isoentity>Bdotb</isoentity><desc>latin capital letter b with dot below</desc><unientity>1E04</unientity></character>
+<character hex="F2 62" dec="242 098"><isoentity>bdotb</isoentity><desc>latin small letter b with dot below</desc><unientity>1E05</unientity></character>
+<character hex="1B 67 62 1B 73" dec="027 103 098 027 115"><isoentity>beta</isoentity><desc>greek small letter beta</desc><unientity>03B2</unientity></character>
+<character hex="F6 42" dec="246 066"><isoentity>Bmacrb</isoentity><desc>latin capital letter b with line below</desc><unientity>1E06</unientity></character>
+<character hex="F6 62" dec="246 098"><isoentity>bmacrb</isoentity><desc>latin small letter b with line below</desc><unientity>1E07</unientity></character>
+<character hex="F9" dec="249"><isoentity>breveb</isoentity><desc>combining breve below</desc><unientity>032E</unientity></character>
+<character hex="E6" dec="230"><isoentity>breve</isoentity><desc>combining breve</desc><unientity>0306</unientity></character>
+<character hex="E2 43" dec="226 067"><isoentity>Cacute</isoentity><desc>latin capital letter c with acute</desc><unientity>0106</unientity></character>
+<character hex="E2 63" dec="226 099"><isoentity>cacute</isoentity><desc>latin small letter c with acute</desc><unientity>0107</unientity></character>
+<character hex="EF" dec="239"><isoentity>candra</isoentity><desc>combining candrabindu</desc><unientity>0310</unientity></character>
+<character hex="E9" dec="233"><isoentity>caron</isoentity><desc>combining caron</desc><unientity>030C</unientity></character>
+<character hex="E9 43" dec="233 067"><isoentity>Ccaron</isoentity><desc>latin capital letter c with caron</desc><unientity>010C</unientity></character>
+<character hex="E9 63" dec="233 099"><isoentity>ccaron</isoentity><desc>latin small letter c with caron</desc><unientity>010D</unientity></character>
+<character hex="E2 F0 43" dec="226 240 067"><isoentity>Ccedilac</isoentity><desc>latin capital letter c with cedilla and acute</desc><unientity>1E08</unientity></character>
+<character hex="E2 F0 63" dec="226 240 099"><isoentity>ccedilac</isoentity><desc>latin small letter c with cedilla and acute</desc><unientity>1E09</unientity></character>
+<character hex="F0 43" dec="240 067"><isoentity>Ccedil</isoentity><desc>latin capital letter c with cedilla</desc><unientity>00C7</unientity></character>
+<character hex="F0 63" dec="240 099"><isoentity>ccedil</isoentity><desc>latin small letter c with cedilla</desc><unientity>00E7</unientity></character>
+<character hex="E3 43" dec="227 067"><isoentity>Ccirc</isoentity><desc>latin capital letter c with circumflex</desc><unientity>0108</unientity></character>
+<character hex="E3 63" dec="227 099"><isoentity>ccirc</isoentity><desc>latin small letter c with circumflex</desc><unientity>0109</unientity></character>
+<character hex="E7 43" dec="231 067"><isoentity>Cdot</isoentity><desc>latin capital letter c with dot above</desc><unientity>010A</unientity></character>
+<character hex="E7 63" dec="231 099"><isoentity>cdot</isoentity><desc>latin small letter c with dot above</desc><unientity>010B</unientity></character>
+<character hex="F0" dec="240"><isoentity>cedil</isoentity><desc>combining cedilla</desc><unientity>0327</unientity></character>
+<character hex="E3" dec="227"><isoentity>circ</isoentity><desc>combining circumflex</desc><unientity>0302</unientity></character>
+<character hex="FE" dec="254"><isoentity>commaa</isoentity><desc>combining comma above</desc><unientity>0313</unientity></character>
+<character hex="F7" dec="247"><isoentity>commab</isoentity><desc>combining comma below</desc><unientity>0326</unientity></character>
+<character hex="C2" dec="194"><isoentity>copysr</isoentity><desc>sound recording copyright</desc><unientity>2117</unientity></character>
+<character hex="C3" dec="195"><isoentity>copy</isoentity><desc>copyright sign</desc><unientity>00A9</unientity></character>
+<character hex="EE" dec="238"><isoentity>dblac</isoentity><desc>combining double acute accent</desc><unientity>030B</unientity></character>
+<character hex="F3" dec="243"><isoentity>dbldotb</isoentity><desc>combining double dot below</desc><unientity>0324</unientity></character>
+<character hex="F5" dec="245"><isoentity>dblunder</isoentity><desc>combining double low line</desc><unientity>0333</unientity></character>
+<character hex="E9 44" dec="233 068"><isoentity>Dcaron</isoentity><desc>latin capital letter d with caron</desc><unientity>010E</unientity></character>
+<character hex="E9 64" dec="233 100"><isoentity>dcaron</isoentity><desc>latin small letter d with caron</desc><unientity>010F</unientity></character>
+<character hex="F7 44" dec="247 068"><isoentity>Dcommab</isoentity><desc>latin capital letter d with comma below</desc><unientity>1E10</unientity></character>
+<character hex="F7 64" dec="247 100"><isoentity>dcommab</isoentity><desc>latin small letter d with comma below</desc><unientity>1E11</unientity></character>
+<character hex="E7 44" dec="231 068"><isoentity>Ddota</isoentity><desc>latin capital letter d with dot above</desc><unientity>1E0A</unientity></character>
+<character hex="E7 64" dec="231 100"><isoentity>ddota</isoentity><desc>latin small letter d with dot above</desc><unientity>1E0B</unientity></character>
+<character hex="F2 44" dec="242 068"><isoentity>Ddotb</isoentity><desc>latin capital letter d with dot below</desc><unientity>1E0C</unientity></character>
+<character hex="F2 64" dec="242 100"><isoentity>ddotb</isoentity><desc>latin small letter d with dot below</desc><unientity>1E0D</unientity></character>
+<character hex="C0" dec="192"><isoentity>deg</isoentity><desc>degree sign</desc><unientity>00B0</unientity></character>
+<character hex="F6 44" dec="246 068"><isoentity>Dmacrb</isoentity><desc>latin capital letter d with line below</desc><unientity>1E0E</unientity></character>
+<character hex="F6 64" dec="246 100"><isoentity>dmacrb</isoentity><desc>latin small letter d with line below</desc><unientity>1E0F</unientity></character>
+<character hex="F2" dec="242"><isoentity>dotb</isoentity><desc>combining dot below</desc><unientity>0323</unientity></character>
+<character hex="E7" dec="231"><isoentity>dot</isoentity><desc>combining dot above</desc><unientity>0307</unientity></character>
+<character hex="A3" dec="163"><isoentity>Dstrok</isoentity><desc>latin capital letter d with stroke</desc><unientity>0110</unientity></character>
+<character hex="B3" dec="179"><isoentity>dstrok</isoentity><desc>latin small letter d with stroke</desc><unientity>0111</unientity></character>
+<character hex="E2 45" dec="226 069"><isoentity>Eacute</isoentity><desc>latin capital letter e with acute</desc><unientity>00C9</unientity></character>
+<character hex="E2 65" dec="226 101"><isoentity>eacute</isoentity><desc>latin small letter e with acute</desc><unientity>00E9</unientity></character>
+<character hex="E6 45" dec="230 069"><isoentity>Ebreve</isoentity><desc>latin capital letter e with breve</desc><unientity>0114</unientity></character>
+<character hex="E6 65" dec="230 101"><isoentity>ebreve</isoentity><desc>latin small letter e with breve</desc><unientity>0115</unientity></character>
+<character hex="E9 45" dec="233 069"><isoentity>Ecaron</isoentity><desc>latin capital letter e with caron</desc><unientity>011A</unientity></character>
+<character hex="E9 65" dec="233 101"><isoentity>ecaron</isoentity><desc>latin small letter e with caron</desc><unientity>011B</unientity></character>
+<character hex="E6 F0 45" dec="230 240 069"><isoentity>Ecedilbr</isoentity><desc>latin capital letter e with cedilla and breve</desc><unientity>1E1C</unientity></character>
+<character hex="E6 F0 65" dec="230 240 101"><isoentity>ecedilbr</isoentity><desc>latin small letter e with cedilla and breve</desc><unientity>1E1D</unientity></character>
+<character hex="F0 45" dec="240 069"><isoentity>Ecedil</isoentity><desc>latin capital letter e with cedilla</desc><unientity>0228</unientity></character>
+<character hex="F0 65" dec="240 101"><isoentity>ecedil</isoentity><desc>latin small letter e with cedilla</desc><unientity>0229</unientity></character>
+<character hex="E3 E2 45" dec="227 226 069"><isoentity>Ecircac</isoentity><desc>latin capital letter e with circumflex and acute</desc><unientity>1EBE</unientity></character>
+<character hex="E3 E2 65" dec="227 226 101"><isoentity>ecircac</isoentity><desc>latin small letter e with circumflex and acute</desc><unientity>1EBF</unientity></character>
+<character hex="E3 F2 45" dec="227 242 069"><isoentity>Ecircdb</isoentity><desc>latin capital letter e with circumflex and dot below</desc><unientity>1EC6</unientity></character>
+<character hex="E3 F2 65" dec="227 242 101"><isoentity>ecircdb</isoentity><desc>latin small letter e with circumflex and dot below</desc><unientity>1EC7</unientity></character>
+<character hex="E1 E3 45" dec="225 227 069"><isoentity>Ecircgr</isoentity><desc>latin capital letter e with circumflex and grave</desc><unientity>1EC0</unientity></character>
+<character hex="E1 E3 65" dec="225 227 101"><isoentity>ecircgr</isoentity><desc>latin small letter e with circumflex and grave</desc><unientity>1EC1</unientity></character>
+<character hex="E3 E0 45" dec="227 224 069"><isoentity>Ecircha</isoentity><desc>latin capital letter e with circumflex and hook above</desc><unientity>1EC2</unientity></character>
+<character hex="E3 E0 65" dec="227 224 101"><isoentity>ecircha</isoentity><desc>latin small letter e with circumflex and hook above</desc><unientity>1EC3</unientity></character>
+<character hex="E4 E3 45" dec="228 227 069"><isoentity>Ecircti</isoentity><desc>latin capital letter e with circumflex and tilde</desc><unientity>1EC4</unientity></character>
+<character hex="E3 45" dec="227 069"><isoentity>Ecirc</isoentity><desc>latin capital letter e with circumflex</desc><unientity>00CA</unientity></character>
+<character hex="E3 65" dec="227 101"><isoentity>ecirc</isoentity><desc>latin small letter e with circumflex</desc><unientity>00EA</unientity></character>
+<character hex="F2 45" dec="242 069"><isoentity>Edotb</isoentity><desc>latin capital letter e with dot below</desc><unientity>1EB8</unientity></character>
+<character hex="F2 65" dec="242 101"><isoentity>edotb</isoentity><desc>latin small letter e with dot below</desc><unientity>1EB9</unientity></character>
+<character hex="E7 45" dec="231 069"><isoentity>Edot</isoentity><desc>latin capital letter e with dot above</desc><unientity>0116</unientity></character>
+<character hex="E7 65" dec="231 101"><isoentity>edot</isoentity><desc>latin small letter e with dot above</desc><unientity>0117</unientity></character>
+<character hex="E1 45" dec="225 069"><isoentity>Egrave</isoentity><desc>latin capital letter e with grave</desc><unientity>00C8</unientity></character>
+<character hex="E1 65" dec="225 101"><isoentity>egrave</isoentity><desc>latin small letter e with grave</desc><unientity>00E8</unientity></character>
+<character hex="E0 45" dec="224 069"><isoentity>Ehooka</isoentity><desc>latin capital letter e with hook above</desc><unientity>1EBA</unientity></character>
+<character hex="E0 65" dec="224 101"><isoentity>ehooka</isoentity><desc>latin small letter e with hook above</desc><unientity>1EBB</unientity></character>
+<character hex="E2 E5 45" dec="226 229 069"><isoentity>Emacrac</isoentity><desc>latin capital letter e with macron and acute</desc><unientity>1E16</unientity></character>
+<character hex="E2 E5 65" dec="226 229 101"><isoentity>emacrac</isoentity><desc>latin small letter e with macron and acute</desc><unientity>1E17</unientity></character>
+<character hex="E1 E5 45" dec="225 229 069"><isoentity>Emacrgr</isoentity><desc>latin capital letter e with macron and grave</desc><unientity>1E14</unientity></character>
+<character hex="E1 E5 65" dec="225 229 101"><isoentity>emacrgr</isoentity><desc>latin small letter e with macron and grave</desc><unientity>1E15</unientity></character>
+<character hex="E5 45" dec="229 069"><isoentity>Emacr</isoentity><desc>latin capital letter e with macron</desc><unientity>0112</unientity></character>
+<character hex="E5 65" dec="229 101"><isoentity>emacr</isoentity><desc>latin small letter e with macron</desc><unientity>0113</unientity></character>
+<character hex="F1 45" dec="241 069"><isoentity>Eogon</isoentity><desc>latin capital letter e with ogon</desc><unientity>0118</unientity></character>
+<character hex="F1 65" dec="241 101"><isoentity>eogon</isoentity><desc>latin small letter e with ogon</desc><unientity>0119</unientity></character>
+<character hex="BA" dec="186"><isoentity>eth</isoentity><desc>latin small letter eth</desc><unientity>00F0</unientity></character>
+<character hex="E4 45" dec="228 069"><isoentity>Etilde</isoentity><desc>latin capital letter e with tilde</desc><unientity>1EBC</unientity></character>
+<character hex="E4 65" dec="228 101"><isoentity>etilde</isoentity><desc>latin small letter e with tilde</desc><unientity>1EBD</unientity></character>
+<character hex="E8 45" dec="232 069"><isoentity>Euml</isoentity><desc>latin capital letter e with umlaut</desc><unientity>00CB</unientity></character>
+<character hex="E8 65" dec="232 101"><isoentity>euml</isoentity><desc>latin small letter e with umlaut</desc><unientity>00EB</unientity></character>
+<character hex="E7 46" dec="231 070"><isoentity>Fdot</isoentity><desc>latin capital letter f with dot above</desc><unientity>1E1E</unientity></character>
+<character hex="E7 66" dec="231 102"><isoentity>fdot</isoentity><desc>latin small letter f with dot above</desc><unientity>1E1F</unientity></character>
+<character hex="A9" dec="169"><isoentity>flat</isoentity><desc>musical flat sign</desc><unientity>266D</unientity></character>
+<character hex="E2 47" dec="226 071"><isoentity>Gacute</isoentity><desc>latin capital letter g with acute</desc><unientity>01F4</unientity></character>
+<character hex="E2 67" dec="226 103"><isoentity>gacute</isoentity><desc>latin small letter g with acute</desc><unientity>01F5</unientity></character>
+<character hex="1B 67 63 1B 73" dec="027 103 099 027 115"><isoentity>gamma</isoentity><desc>greek small letter gamma</desc><unientity>03B3</unientity></character>
+<character hex="E6 47" dec="230 071"><isoentity>Gbreve</isoentity><desc>latin capital letter g with breve</desc><unientity>011E</unientity></character>
+<character hex="E6 67" dec="230 103"><isoentity>gbreve</isoentity><desc>latin small letter g with breve</desc><unientity>011F</unientity></character>
+<character hex="E9 47" dec="233 071"><isoentity>Gcaron</isoentity><desc>latin capital letter g with caron</desc><unientity>01E6</unientity></character>
+<character hex="E9 67" dec="233 103"><isoentity>gcaron</isoentity><desc>latin small letter g with caron</desc><unientity>01E7</unientity></character>
+<character hex="F0 47" dec="240 071"><isoentity>Gcedil</isoentity><desc>latin capital letter g with cedilla</desc><unientity>0122</unientity></character>
+<character hex="F0 67" dec="240 103"><isoentity>gcedil</isoentity><desc>latin small letter g with cedilla</desc><unientity>0123</unientity></character>
+<character hex="E3 47" dec="227 071"><isoentity>Gcirc</isoentity><desc>latin capital letter g with circumflex</desc><unientity>011C</unientity></character>
+<character hex="E3 67" dec="227 103"><isoentity>gcirc</isoentity><desc>latin small letter g with circumflex</desc><unientity>011D</unientity></character>
+<character hex="E7 47" dec="231 071"><isoentity>Gdot</isoentity><desc>latin capital letter g with dot above</desc><unientity>0120</unientity></character>
+<character hex="E7 67" dec="231 103"><isoentity>gdot</isoentity><desc>latin small letter g with dot above</desc><unientity>0121</unientity></character>
+<character hex="E5 47" dec="229 071"><isoentity>Gmacr</isoentity><desc>latin capital letter g with macron</desc><unientity>1E20</unientity></character>
+<character hex="E5 67" dec="229 103"><isoentity>gmacr</isoentity><desc>latin small letter g with macron</desc><unientity>1E21</unientity></character>
+<character hex="E1" dec="225"><isoentity>grave</isoentity><desc>combining grave accent</desc><unientity>0300</unientity></character>
+<character hex="F5 47" dec="245 071"><isoentity>Gstrok</isoentity><desc>latin capital letter g with stroke</desc><unientity>01E4</unientity></character>
+<character hex="F5 67" dec="245 103"><isoentity>gstrok</isoentity><desc>latin small letter g with stroke</desc><unientity>01E5</unientity></character>
+<character hex="B7" dec="183"><isoentity>hardsign</isoentity><desc>modifier letter double prime</desc><unientity>02BA</unientity></character>
+<character hex="F9 48" dec="249 072"><isoentity>Hbreveb</isoentity><desc>latin capital letter h with breve below</desc><unientity>1E2A</unientity></character>
+<character hex="F9 68" dec="249 104"><isoentity>hbreveb</isoentity><desc>latin small letter h with breve below</desc><unientity>1E2B</unientity></character>
+<character hex="E9 48" dec="233 072"><isoentity>Hcaron</isoentity><desc>latin capital letter h with caron</desc><unientity>021E</unientity></character>
+<character hex="E9 68" dec="233 104"><isoentity>hcaron</isoentity><desc>latin small letter h with caron</desc><unientity>021F</unientity></character>
+<character hex="F0 48" dec="240 072"><isoentity>Hcedil</isoentity><desc>latin capital letter h with cedilla</desc><unientity>1E28</unientity></character>
+<character hex="F0 68" dec="240 104"><isoentity>hcedil</isoentity><desc>latin small letter h with cedilla</desc><unientity>1E29</unientity></character>
+<character hex="E3 48" dec="227 072"><isoentity>Hcirc</isoentity><desc>latin capital letter h with circumflex</desc><unientity>0124</unientity></character>
+<character hex="E3 68" dec="227 104"><isoentity>hcirc</isoentity><desc>latin small letter h with circumflex</desc><unientity>0125</unientity></character>
+<character hex="F2 48" dec="242 072"><isoentity>Hdotb</isoentity><desc>latin capital letter h with dot below</desc><unientity>1E24</unientity></character>
+<character hex="F2 68" dec="242 104"><isoentity>hdotb</isoentity><desc>latin small letter h with dot below</desc><unientity>1E25</unientity></character>
+<character hex="E7 48" dec="231 072"><isoentity>Hdot</isoentity><desc>latin capital letter h with dot above</desc><unientity>1E22</unientity></character>
+<character hex="E7 68" dec="231 104"><isoentity>hdot</isoentity><desc>latin small letter h with dot above</desc><unientity>1E23</unientity></character>
+<character hex="F6 68" dec="246 104"><isoentity>hlowline</isoentity><desc>latin small letter h with low line</desc><unientity>1E96</unientity></character>
+<character hex="E0" dec="224"><isoentity>hooka</isoentity><desc>combining hook above</desc><unientity>0309</unientity></character>
+<character hex="F5 48" dec="245 072"><isoentity>Hstroke</isoentity><desc>latin capital letter h with stroke</desc><unientity>0126</unientity></character>
+<character hex="F5 68" dec="245 104"><isoentity>hstroke</isoentity><desc>latin small letter h with stroke</desc><unientity>0127</unientity></character>
+<character hex="E8 48" dec="232 072"><isoentity>Huml</isoentity><desc>latin capital letter h with diaeresis</desc><unientity>1E26</unientity></character>
+<character hex="E8 68" dec="232 104"><isoentity>huml</isoentity><desc>latin small letter h with diaeresis</desc><unientity>1E27</unientity></character>
+<character hex="E2 49" dec="226 073"><isoentity>Iacute</isoentity><desc>latin capital letter i with acute</desc><unientity>00CD</unientity></character>
+<character hex="E2 69" dec="226 105"><isoentity>iacute</isoentity><desc>latin small letter i with acute</desc><unientity>00ED</unientity></character>
+<character hex="E6 49" dec="230 073"><isoentity>Ibreve</isoentity><desc>latin capital letter i with breve</desc><unientity>012C</unientity></character>
+<character hex="E6 69" dec="230 105"><isoentity>ibreve</isoentity><desc>latin small letter i with breve</desc><unientity>012D</unientity></character>
+<character hex="E9 49" dec="233 073"><isoentity>Icaron</isoentity><desc>latin capital letter i with caron</desc><unientity>01CF</unientity></character>
+<character hex="E9 69" dec="233 105"><isoentity>icaron</isoentity><desc>latin small letter i with caron</desc><unientity>01D0</unientity></character>
+<character hex="E3 49" dec="227 073"><isoentity>Icirc</isoentity><desc>latin capital letter i with circumflex</desc><unientity>00CE</unientity></character>
+<character hex="E3 69" dec="227 105"><isoentity>icirc</isoentity><desc>latin small letter i with circumflex</desc><unientity>00EE</unientity></character>
+<character hex="F2 49" dec="242 073"><isoentity>Idotb</isoentity><desc>latin capital letter i with dot below</desc><unientity>1ECA</unientity></character>
+<character hex="F2 69" dec="242 105"><isoentity>idotb</isoentity><desc>latin small letter i with dot below</desc><unientity>1ECB</unientity></character>
+<character hex="E7 49" dec="231 073"><isoentity>Idot</isoentity><desc>latin capital letter i with dot above</desc><unientity>0130</unientity></character>
+<character hex="C6" dec="198"><isoentity>iexcl</isoentity><desc>inverted exclamation mark</desc><unientity>00A1</unientity></character>
+<character hex="E1 49" dec="225 073"><isoentity>Igrave</isoentity><desc>latin capital letter i with grave</desc><unientity>00CC</unientity></character>
+<character hex="E1 69" dec="225 105"><isoentity>igrave</isoentity><desc>latin small letter i with grave</desc><unientity>00EC</unientity></character>
+<character hex="E0 49" dec="224 073"><isoentity>Ihooka</isoentity><desc>latin capital letter i with hook above</desc><unientity>1EC8</unientity></character>
+<character hex="E0 69" dec="224 105"><isoentity>ihooka</isoentity><desc>latin small letter i with hook above</desc><unientity>1EC9</unientity></character>
+<character hex="E5 49" dec="229 073"><isoentity>Imacr</isoentity><desc>latin capital letter i with macron</desc><unientity>012A</unientity></character>
+<character hex="E5 69" dec="229 105"><isoentity>imacr</isoentity><desc>latin small letter i with macron</desc><unientity>012B</unientity></character>
+<character hex="B8" dec="184"><isoentity>inodot</isoentity><desc>latin small letter dotless i</desc><unientity>0131</unientity></character>
+<character hex="F1 49" dec="241 073"><isoentity>Iogon</isoentity><desc>latin capital letter i with ogon</desc><unientity>012E</unientity></character>
+<character hex="F1 69" dec="241 105"><isoentity>iogon</isoentity><desc>latin small letter i with ogon</desc><unientity>012F</unientity></character>
+<character hex="C5" dec="197"><isoentity>iquest</isoentity><desc>inverted question mark</desc><unientity>00BF</unientity></character>
+<character hex="E4 49" dec="228 073"><isoentity>Itilde</isoentity><desc>latin capital letter i with tilde</desc><unientity>0128</unientity></character>
+<character hex="E4 69" dec="228 105"><isoentity>itilde</isoentity><desc>latin small letter i with tilde</desc><unientity>0129</unientity></character>
+<character hex="E2 E8 49" dec="226 232 073"><isoentity>Iumlac</isoentity><desc>latin capital letter i with diaeresis and acute</desc><unientity>1E2E</unientity></character>
+<character hex="E2 E8 69" dec="226 232 105"><isoentity>iumlac</isoentity><desc>latin small letter i with diaeresis and acute</desc><unientity>1E2F</unientity></character>
+<character hex="E8 49" dec="232 073"><isoentity>Iuml</isoentity><desc>latin capital letter i with umlaut</desc><unientity>00CF</unientity></character>
+<character hex="E8 69" dec="232 105"><isoentity>iuml</isoentity><desc>latin small letter i with umlaut</desc><unientity>00EF</unientity></character>
+<character hex="E9 6A" dec="233 106"><isoentity>jcaron</isoentity><desc>latin small letter j with caron</desc><unientity>01F0</unientity></character>
+<character hex="E3 4A" dec="227 074"><isoentity>Jcirc</isoentity><desc>latin capital letter j with circumflex</desc><unientity>0134</unientity></character>
+<character hex="E3 6A" dec="227 106"><isoentity>jcirc</isoentity><desc>latin small letter j with circumflex</desc><unientity>0135</unientity></character>
+<character hex="E2 4B" dec="226 075"><isoentity>Kacute</isoentity><desc>latin capital letter k with acute</desc><unientity>1E30</unientity></character>
+<character hex="E2 6B" dec="226 107"><isoentity>kacute</isoentity><desc>latin small letter k with acute</desc><unientity>1E31</unientity></character>
+<character hex="F0 4B" dec="240 075"><isoentity>Kcedil</isoentity><desc>latin capital letter k with cedilla</desc><unientity>0136</unientity></character>
+<character hex="F0 6B" dec="240 107"><isoentity>kcedil</isoentity><desc>latin small letter k with cedilla</desc><unientity>0137</unientity></character>
+<character hex="E3 4B" dec="227 075"><isoentity>Kcirc</isoentity><desc>latin capital letter k with circumflex</desc><unientity>01E8</unientity></character>
+<character hex="E3 6B" dec="227 107"><isoentity>kcirc</isoentity><desc>latin small letter k with circumflex</desc><unientity>01E9</unientity></character>
+<character hex="F2 4B" dec="242 075"><isoentity>Kdotb</isoentity><desc>latin capital letter k with dot below</desc><unientity>1E32</unientity></character>
+<character hex="F2 6B" dec="242 107"><isoentity>kdotb</isoentity><desc>latin small letter k with dot below</desc><unientity>1E33</unientity></character>
+<character hex="F6 4B" dec="246 075"><isoentity>Kmacrb</isoentity><desc>latin capital letter k with line below</desc><unientity>1E34</unientity></character>
+<character hex="F6 6B" dec="246 107"><isoentity>kmacrb</isoentity><desc>latin small letter k with line below</desc><unientity>1E35</unientity></character>
+<character hex="E2 4C" dec="226 076"><isoentity>Lacute</isoentity><desc>latin capital letter l with acute</desc><unientity>0139</unientity></character>
+<character hex="E2 6C" dec="226 108"><isoentity>lacute</isoentity><desc>latin small letter l with acute</desc><unientity>013A</unientity></character>
+<character hex="E9 4C" dec="233 076"><isoentity>Lcaron</isoentity><desc>latin capital letter l with caron</desc><unientity>013D</unientity></character>
+<character hex="E9 6C" dec="233 108"><isoentity>lcaron</isoentity><desc>latin small letter l with caron</desc><unientity>013E</unientity></character>
+<character hex="F0 4C" dec="240 076"><isoentity>Lcedil</isoentity><desc>latin capital letter l with cedilla</desc><unientity>013B</unientity></character>
+<character hex="F0 6C" dec="240 108"><isoentity>lcedil</isoentity><desc>latin small letter l with cedilla</desc><unientity>013C</unientity></character>
+<character hex="E3 4C" dec="227 076"><isoentity>Lcirc</isoentity><desc>latin capital letter l with circumflex</desc><unientity>1E3C</unientity></character>
+<character hex="E3 6C" dec="227 108"><isoentity>lcirc</isoentity><desc>latin small letter l with circumflex</desc><unientity>1E3D</unientity></character>
+<character hex="FA" dec="250"><isoentity>ldbltil</isoentity><desc>combining double tilde left half</desc><unientity>FE22</unientity></character>
+<character hex="E5 F2 4C" dec="229 242 079"><isoentity>Ldotbma</isoentity><desc>latin capital letter l with dot below and macron</desc><unientity>1E38</unientity></character>
+<character hex="E5 F2 6C" dec="229 242 111"><isoentity>ldotbma</isoentity><desc>latin small letter l with dot below and macron</desc><unientity>1E39</unientity></character>
+<character hex="F2 4C" dec="242 076"><isoentity>Ldotb</isoentity><desc>latin capital letter l with dot below</desc><unientity>1E36</unientity></character>
+<character hex="F2 6C" dec="242 108"><isoentity>ldotb</isoentity><desc>latin small letter l with dot below</desc><unientity>1E37</unientity></character>
+<character hex="EB" dec="235"><isoentity>llig</isoentity><desc>combining ligature left half</desc><unientity>FE20</unientity></character>
+<character hex="F6 4C" dec="246 076"><isoentity>Lmacrb</isoentity><desc>latin capital letter l with line below</desc><unientity>1E3A</unientity></character>
+<character hex="F6 6C" dec="246 108"><isoentity>lmacrb</isoentity><desc>latin small letter l with line below</desc><unientity>1E3B</unientity></character>
+<character hex="4C A8" dec="076 168"><isoentity>Lmidot</isoentity><desc>latin capital letter l with middle dot</desc><unientity>013F</unientity></character>
+<character hex="6C A8" dec="108 168"><isoentity>lmidot</isoentity><desc>latin small letter l with middle dot</desc><unientity>0140</unientity></character>
+<character hex="A1" dec="161"><isoentity>Lstrok</isoentity><desc>latin capital letter l with stroke</desc><unientity>0141</unientity></character>
+<character hex="B1" dec="177"><isoentity>lstrok</isoentity><desc>latin small letter l with stroke</desc><unientity>0142</unientity></character>
+<character hex="E5" dec="229"><isoentity>macr</isoentity><desc>combining macron</desc><unientity>0304</unientity></character>
+<character hex="E2 4D" dec="226 077"><isoentity>Macute</isoentity><desc>latin capital letter m with acute</desc><unientity>1E3E</unientity></character>
+<character hex="E2 6D" dec="226 109"><isoentity>macute</isoentity><desc>latin small letter m with acute</desc><unientity>1E3F</unientity></character>
+<character hex="F2 4D" dec="242 077"><isoentity>Mdotb</isoentity><desc>latin capital letter m with dot below</desc><unientity>1E42</unientity></character>
+<character hex="F2 6D" dec="242 109"><isoentity>mdotb</isoentity><desc>latin small letter m with dot below</desc><unientity>1E43</unientity></character>
+<character hex="E7 4D" dec="231 077"><isoentity>Mdot</isoentity><desc>latin capital letter m with dot above</desc><unientity>1E40</unientity></character>
+<character hex="E7 6D" dec="231 109"><isoentity>mdot</isoentity><desc>latin small letter m with dot above</desc><unientity>1E41</unientity></character>
+<character hex="A8" dec="168"><isoentity>middot</isoentity><desc>middle dot</desc><unientity>00B7</unientity></character>
+<character hex="B0" dec="176"><isoentity>mllhring</isoentity><desc>modifier letter left half ring</desc><unientity>02BF</unientity></character>
+<character hex="AE" dec="174"><isoentity>mlrhring</isoentity><desc>modifier letter right half ring</desc><unientity>02BE</unientity></character>
+<character hex="E2 4E" dec="226 078"><isoentity>Nacute</isoentity><desc>latin capital letter n with acute</desc><unientity>0143</unientity></character>
+<character hex="E2 6E" dec="226 110"><isoentity>nacute</isoentity><desc>latin small letter n with acute</desc><unientity>0144</unientity></character>
+<character hex="ED 6E" dec="237 110"><isoentity>napos</isoentity><desc>latin small letter n with apostrophe</desc><unientity>0149</unientity></character>
+<character hex="E9 4E" dec="233 078"><isoentity>Ncaron</isoentity><desc>latin capital letter n with caron</desc><unientity>0147</unientity></character>
+<character hex="E9 6E" dec="233 110"><isoentity>ncaron</isoentity><desc>latin small letter n with caron</desc><unientity>0148</unientity></character>
+<character hex="F0 4E" dec="240 078"><isoentity>Ncedil</isoentity><desc>latin capital letter n with cedilla</desc><unientity>0145</unientity></character>
+<character hex="F0 6E" dec="240 110"><isoentity>ncedil</isoentity><desc>latin small letter n with cedilla</desc><unientity>0146</unientity></character>
+<character hex="F2 4E" dec="242 078"><isoentity>Ndotb</isoentity><desc>latin capital letter n with dot below</desc><unientity>1E46</unientity></character>
+<character hex="F2 6E" dec="242 110"><isoentity>ndotb</isoentity><desc>latin small letter n with dot below</desc><unientity>1E47</unientity></character>
+<character hex="E7 4E" dec="231 078"><isoentity>Ndot</isoentity><desc>latin capital letter n with dot above</desc><unientity>1E44</unientity></character>
+<character hex="E7 6E" dec="231 110"><isoentity>ndot</isoentity><desc>latin small letter n with dot above</desc><unientity>1E45</unientity></character>
+<character hex="E1 4E" dec="225 078"><isoentity>Ngrave</isoentity><desc>latin capital letter n with grave</desc><unientity>01F8</unientity></character>
+<character hex="E1 6E" dec="225 110"><isoentity>ngrave</isoentity><desc>latin small letter n with grave</desc><unientity>01F9</unientity></character>
+<character hex="F6 4E" dec="246 078"><isoentity>Nmacrb</isoentity><desc>latin capital letter n with line below</desc><unientity>1E48</unientity></character>
+<character hex="F6 6E" dec="246 110"><isoentity>nmacrb</isoentity><desc>latin small letter n with line below</desc><unientity>1E49</unientity></character>
+<character hex="E4 4E" dec="228 078"><isoentity>Ntilde</isoentity><desc>latin capital letter n with tilde</desc><unientity>00D1</unientity></character>
+<character hex="E4 6E" dec="228 110"><isoentity>ntilde</isoentity><desc>latin small letter n with tilde</desc><unientity>00F1</unientity></character>
+<character hex="E2 4F" dec="226 079"><isoentity>Oacute</isoentity><desc>latin capital letter o with acute</desc><unientity>00D3</unientity></character>
+<character hex="E2 6F" dec="226 111"><isoentity>oacute</isoentity><desc>latin small letter o with acute</desc><unientity>00F3</unientity></character>
+<character hex="E6 4F" dec="230 079"><isoentity>Obreve</isoentity><desc>latin capital letter o with breve</desc><unientity>014E</unientity></character>
+<character hex="E6 6F" dec="230 111"><isoentity>obreve</isoentity><desc>latin small letter o with breve</desc><unientity>014F</unientity></character>
+<character hex="E9 4F" dec="233 079"><isoentity>Ocaron</isoentity><desc>latin capital letter o with caron</desc><unientity>01D1</unientity></character>
+<character hex="E9 6F" dec="233 111"><isoentity>ocaron</isoentity><desc>latin small letter o with caron</desc><unientity>01D2</unientity></character>
+<character hex="E3 E2 4F" dec="227 226 079"><isoentity>Ocircac</isoentity><desc>latin capital letter o with circumflex and acute</desc><unientity>1ED0</unientity></character>
+<character hex="E3 E2 6F" dec="227 226 111"><isoentity>ocircac</isoentity><desc>latin small letter o with circumflex and acute</desc><unientity>1ED1</unientity></character>
+<character hex="E3 F2 4F" dec="227 242 079"><isoentity>Ocircdb</isoentity><desc>latin capital letter o with circumflex and dot below</desc><unientity>1ED8</unientity></character>
+<character hex="E3 F2 6F" dec="227 242 111"><isoentity>ocircdb</isoentity><desc>latin small letter o with circumflex and dot below</desc><unientity>1ED9</unientity></character>
+<character hex="E1 E3 4F" dec="225 227 079"><isoentity>Ocircgr</isoentity><desc>latin capital letter o with circumflex and grave</desc><unientity>1ED2</unientity></character>
+<character hex="E1 E3 6F" dec="225 227 111"><isoentity>ocircgr</isoentity><desc>latin small letter o with circumflex and grave</desc><unientity>1ED3</unientity></character>
+<character hex="E3 E0 4F" dec="227 224 079"><isoentity>Ocircha</isoentity><desc>latin capital letter o with circumflex and hook above</desc><unientity>1ED4</unientity></character>
+<character hex="E3 E0 6F" dec="227 224 111"><isoentity>ocircha</isoentity><desc>latin small letter o with circumflex and hook above</desc><unientity>1ED5</unientity></character>
+<character hex="E4 E3 4F" dec="228 227 079"><isoentity>Ocircti</isoentity><desc>latin capital letter o with circumflex and tilde</desc><unientity>1ED6</unientity></character>
+<character hex="E4 E3 6F" dec="228 227 111"><isoentity>ocircti</isoentity><desc>latin small letter o with circumflex and tilde</desc><unientity>1ED7</unientity></character>
+<character hex="E3 4F" dec="227 079"><isoentity>Ocirc</isoentity><desc>latin capital letter o with circumflex</desc><unientity>00D4</unientity></character>
+<character hex="E3 6F" dec="227 111"><isoentity>ocirc</isoentity><desc>latin small letter o with circumflex</desc><unientity>00F4</unientity></character>
+<character hex="EE 4F" dec="238 079"><isoentity>Odblac</isoentity><desc>latin capital letter o with double acute</desc><unientity>0150</unientity></character>
+<character hex="EE 6F" dec="238 111"><isoentity>odblac</isoentity><desc>latin small letter o with double acute</desc><unientity>0151</unientity></character>
+<character hex="E5 E7 4F" dec="229 231 079"><isoentity>Odotama</isoentity><desc>latin capital letter o with dot above and macron</desc><unientity>0230</unientity></character>
+<character hex="E5 E7 6F" dec="229 231 111"><isoentity>odotama</isoentity><desc>latin small letter o with dot above and macron</desc><unientity>0231</unientity></character>
+<character hex="E7 4F" dec="231 079"><isoentity>Odota</isoentity><desc>latin capital letter o with dot above</desc><unientity>022E</unientity></character>
+<character hex="E7 6F" dec="231 111"><isoentity>odota</isoentity><desc>latin small letter o with dot above</desc><unientity>022F</unientity></character>
+<character hex="F2 4F" dec="242 079"><isoentity>Odotb</isoentity><desc>latin capital letter o with dot below</desc><unientity>1ECC</unientity></character>
+<character hex="F2 6F" dec="242 111"><isoentity>odotb</isoentity><desc>latin small letter o with dot below</desc><unientity>1ECD</unientity></character>
+<character hex="A6" dec="166"><isoentity>OElig</isoentity><desc>latin capital letter oe</desc><unientity>0152</unientity></character>
+<character hex="B6" dec="182"><isoentity>oelig</isoentity><desc>latin small letter oe</desc><unientity>0153</unientity></character>
+<character hex="F1" dec="241"><isoentity>ogon</isoentity><desc>combining ogonek</desc><unientity>0328</unientity></character>
+<character hex="E1 4F" dec="225 079"><isoentity>Ograve</isoentity><desc>latin capital letter o with grave</desc><unientity>00D2</unientity></character>
+<character hex="E1 6F" dec="225 111"><isoentity>ograve</isoentity><desc>latin small letter o with grave</desc><unientity>00F2</unientity></character>
+<character hex="E0 4F" dec="224 079"><isoentity>Ohooka</isoentity><desc>latin capital letter o with hook above</desc><unientity>1ECE</unientity></character>
+<character hex="E0 6F" dec="224 111"><isoentity>ohooka</isoentity><desc>latin small letter o with hook above</desc><unientity>1ECF</unientity></character>
+<character hex="E2 AC" dec="226 172"><isoentity>Ohornac</isoentity><desc>latin capital letter o with horn and acute</desc><unientity>1EDA</unientity></character>
+<character hex="E2 AD" dec="226 173"><isoentity>Ohornac</isoentity><desc>latin capital letter u with horn and acute</desc><unientity>1EE8</unientity></character>
+<character hex="E2 BC" dec="226 188"><isoentity>ohornac</isoentity><desc>latin small letter o with horn and acute</desc><unientity>1EDB</unientity></character>
+<character hex="F2 AC" dec="242 172"><isoentity>Ohorndb</isoentity><desc>latin capital letter o with horn and dot below</desc><unientity>1EE2</unientity></character>
+<character hex="F2 BC" dec="242 188"><isoentity>ohorndb</isoentity><desc>latin small letter o with horn and dot below</desc><unientity>1EE3</unientity></character>
+<character hex="E1 AC" dec="225 172"><isoentity>Ohorngr</isoentity><desc>latin capital letter o with horn and grave</desc><unientity>1EDC</unientity></character>
+<character hex="E1 BC" dec="225 188"><isoentity>ohorngr</isoentity><desc>latin small letter o with horn and grave</desc><unientity>1EDD</unientity></character>
+<character hex="E0 AC" dec="224 172"><isoentity>Ohornha</isoentity><desc>latin capital letter o with horn and hook above</desc><unientity>1EDE</unientity></character>
+<character hex="E0 BC" dec="224 188"><isoentity>ohornha</isoentity><desc>latin small letter o with horn and hook above</desc><unientity>1EDF</unientity></character>
+<character hex="E4 AC" dec="228 172"><isoentity>Ohornti</isoentity><desc>latin capital letter o with horn and tilde</desc><unientity>1EE0</unientity></character>
+<character hex="E4 BC" dec="228 188"><isoentity>ohornti</isoentity><desc>latin small letter o with horn and tilde</desc><unientity>1EE1</unientity></character>
+<character hex="AC" dec="172"><isoentity>Ohorn</isoentity><desc>latin capital letter o with horn</desc><unientity>01A0</unientity></character>
+<character hex="BC" dec="188"><isoentity>ohorn</isoentity><desc>latin small letter o with horn</desc><unientity>01A1</unientity></character>
+<character hex="E2 E5 4F" dec="226 229 079"><isoentity>Omacrac</isoentity><desc>latin capital letter o with macron and acute</desc><unientity>1E52</unientity></character>
+<character hex="E2 E5 6F" dec="226 229 111"><isoentity>omacrac</isoentity><desc>latin small letter o with macron and acute</desc><unientity>1E53</unientity></character>
+<character hex="E1 E5 4F" dec="225 229 079"><isoentity>Omacrgr</isoentity><desc>latin capital letter o with macron and grave</desc><unientity>1E50</unientity></character>
+<character hex="E1 E5 6F" dec="225 229 111"><isoentity>omacrgr</isoentity><desc>latin small letter o with macron and grave</desc><unientity>1E51</unientity></character>
+<character hex="E5 4F" dec="229 079"><isoentity>Omacr</isoentity><desc>latin capital letter o with macron</desc><unientity>014C</unientity></character>
+<character hex="E5 6F" dec="229 111"><isoentity>omacr</isoentity><desc>latin small letter o with macron</desc><unientity>014D</unientity></character>
+<character hex="E5 F1 4F" dec="229 241 079"><isoentity>Oogonma</isoentity><desc>latin capital letter o with ogonek and macron</desc><unientity>01EC</unientity></character>
+<character hex="E5 F1 6F" dec="229 241 111"><isoentity>oogonma</isoentity><desc>latin small letter o with ogonek and macron</desc><unientity>01ED</unientity></character>
+<character hex="F1 4F" dec="241 111"><isoentity>Oogon</isoentity><desc>latin capital letter o with ogonek</desc><unientity>01EA</unientity></character>
+<character hex="F1 6F" dec="241 111"><isoentity>oogon</isoentity><desc>latin small letter o with ogonek</desc><unientity>01EB</unientity></character>
+<character hex="E2 A2" dec="226 162"><isoentity>Oslasha</isoentity><desc>latin capital letter o with stroke and acute</desc><unientity>01FE</unientity></character>
+<character hex="E2 B2" dec="226 178"><isoentity>oslasha</isoentity><desc>latin small letter o with stroke and acute</desc><unientity>01FF</unientity></character>
+<character hex="A2" dec="162"><isoentity>Oslash</isoentity><desc>latin capital letter o with stroke</desc><unientity>00D8</unientity></character>
+<character hex="B2" dec="178"><isoentity>oslash</isoentity><desc>latin small letter o with stroke</desc><unientity>00F8</unientity></character>
+<character hex="E2 E4 4F" dec="226 228 079"><isoentity>Otildeac</isoentity><desc>latin capital letter o with tilde and acute</desc><unientity>1E4C</unientity></character>
+<character hex="E2 E4 6F" dec="226 228 111"><isoentity>otildeac</isoentity><desc>latin small letter o with tilde and acute</desc><unientity>1E4D</unientity></character>
+<character hex="E5 E4 4F" dec="229 228 079"><isoentity>Otildema</isoentity><desc>latin capital letter o with tilde and macron</desc><unientity>022C</unientity></character>
+<character hex="E5 E4 6F" dec="229 228 111"><isoentity>otildema</isoentity><desc>latin small letter o with tilde and macron</desc><unientity>022D</unientity></character>
+<character hex="E8 E4 4F" dec="232 228 079"><isoentity>Otildeum</isoentity><desc>latin capital letter o with tilde and diaeresis</desc><unientity>1E4E</unientity></character>
+<character hex="E8 E4 6F" dec="232 228 111"><isoentity>otildeum</isoentity><desc>latin small letter o with tilde and diaeresis</desc><unientity>1E4F</unientity></character>
+<character hex="E4 4F" dec="228 079"><isoentity>Otilde</isoentity><desc>latin capital letter o with tilde</desc><unientity>00D5</unientity></character>
+<character hex="E4 6F" dec="228 111"><isoentity>otilde</isoentity><desc>latin small letter o with tilde</desc><unientity>00F5</unientity></character>
+<character hex="E5 E8 4F" dec="229 232 079"><isoentity>Oumlma</isoentity><desc>latin capital letter o with diaeresis and macron</desc><unientity>022A</unientity></character>
+<character hex="E5 E8 6F" dec="229 232 111"><isoentity>oumlma</isoentity><desc>latin small letter o with diaeresis and macron</desc><unientity>022B</unientity></character>
+<character hex="E8 4F" dec="232 079"><isoentity>Ouml</isoentity><desc>latin capital letter o with umlaut</desc><unientity>00D6</unientity></character>
+<character hex="E8 6F" dec="232 111"><isoentity>ouml</isoentity><desc>latin small letter o with umlaut</desc><unientity>00F6</unientity></character>
+<character hex="E2 50" dec="226 080"><isoentity>Pacute</isoentity><desc>latin capital letter p with acute</desc><unientity>1E54</unientity></character>
+<character hex="E2 70" dec="226 112"><isoentity>pacute</isoentity><desc>latin small letter p with acute</desc><unientity>1E55</unientity></character>
+<character hex="E7 50" dec="231 080"><isoentity>Pdota</isoentity><desc>latin capital letter p with dot above</desc><unientity>1E56</unientity></character>
+<character hex="E7 70" dec="231 112"><isoentity>pdota</isoentity><desc>latin small letter p with dot above</desc><unientity>1E57</unientity></character>
+<character hex="AB" dec="171"><isoentity>plusmn</isoentity><desc>plus-minus sign</desc><unientity>00B1</unientity></character>
+<character hex="B9" dec="185"><isoentity>pound</isoentity><desc>pound sign</desc><unientity>00A3</unientity></character>
+<character hex="E2 52" dec="226 082"><isoentity>Racute</isoentity><desc>latin capital letter r with acute</desc><unientity>0154</unientity></character>
+<character hex="E2 72" dec="226 114"><isoentity>racute</isoentity><desc>latin small letter r with acute</desc><unientity>0155</unientity></character>
+<character hex="E9 52" dec="233 082"><isoentity>Rcaron</isoentity><desc>latin capital letter r with caron</desc><unientity>0158</unientity></character>
+<character hex="E9 72" dec="233 114"><isoentity>rcaron</isoentity><desc>latin small letter r with caron</desc><unientity>0159</unientity></character>
+<character hex="F8" dec="248"><isoentity>rcedil</isoentity><desc>combining left half ring below</desc><unientity>031C</unientity></character>
+<character hex="F8 52" dec="240 082"><isoentity>Rcedil</isoentity><desc>latin capital letter r with cedilla</desc><unientity>0156</unientity></character>
+<character hex="F0 72" dec="240 114"><isoentity>rcedil</isoentity><desc>latin small letter r with cedilla</desc><unientity>0157</unientity></character>
+<character hex="ED" dec="237"><isoentity>rcommaa</isoentity><desc>combining comma above right</desc><unientity>0315</unientity></character>
+<character hex="FB" dec="251"><isoentity>rdbltil</isoentity><desc>combining double tilde right half</desc><unientity>FE23</unientity></character>
+<character hex="E7 52" dec="231 082"><isoentity>Rdota</isoentity><desc>latin capital letter r with dot above</desc><unientity>1E58</unientity></character>
+<character hex="E7 72" dec="231 114"><isoentity>rdota</isoentity><desc>latin small letter r with dot above</desc><unientity>1E59</unientity></character>
+<character hex="F2 52" dec="242 082"><isoentity>Rdotb</isoentity><desc>latin capital letter r with dot below</desc><unientity>1E5A</unientity></character>
+<character hex="F2 72" dec="242 114"><isoentity>rdotb</isoentity><desc>latin small letter r with dot below</desc><unientity>1E5B</unientity></character>
+<character hex="AA" dec="170"><isoentity>reg</isoentity><desc>registered sign</desc><unientity>00AE</unientity></character>
+<character hex="F4" dec="244"><isoentity>ringb</isoentity><desc>combining ring below</desc><unientity>0325</unientity></character>
+<character hex="EA" dec="234"><isoentity>ring</isoentity><desc>combining ring above</desc><unientity>030A</unientity></character>
+<character hex="EC" dec="236"><isoentity>rlig</isoentity><desc>combining ligature right half</desc><unientity>FE21</unientity></character>
+<character hex="F6 52" dec="246 082"><isoentity>Rmacrb</isoentity><desc>latin capital letter r with line below</desc><unientity>1E5E</unientity></character>
+<character hex="F6 72" dec="246 114"><isoentity>rmacrb</isoentity><desc>latin small letter r with line below</desc><unientity>1E5F</unientity></character>
+<character hex="E7 E2 53" dec="231 226 083"><isoentity>Sacuteda</isoentity><desc>latin capital letter s with acute and dot above</desc><unientity>1E64</unientity></character>
+<character hex="E7 E2 73" dec="231 226 115"><isoentity>sacuteda</isoentity><desc>latin small letter s with acute and dot above</desc><unientity>1E65</unientity></character>
+<character hex="E2 53" dec="226 083"><isoentity>Sacute</isoentity><desc>latin capital letter s with acute</desc><unientity>015A</unientity></character>
+<character hex="E2 73" dec="226 115"><isoentity>sacute</isoentity><desc>latin small letter s with acute</desc><unientity>015B</unientity></character>
+<character hex="E7 E9 53" dec="231 233 083"><isoentity>Scaronda</isoentity><desc>latin capital letter s with caron and dot above</desc><unientity>1E66</unientity></character>
+<character hex="E7 E9 73" dec="231 233 115"><isoentity>scaronda</isoentity><desc>latin small letter s with caron and dot above</desc><unientity>1E67</unientity></character>
+<character hex="E9 53" dec="233 083"><isoentity>Scaron</isoentity><desc>latin capital letter s with caron</desc><unientity>0160</unientity></character>
+<character hex="E9 73" dec="233 115"><isoentity>scaron</isoentity><desc>latin small letter s with caron</desc><unientity>0161</unientity></character>
+<character hex="F0 53" dec="240 083"><isoentity>Scedil</isoentity><desc>latin capital letter s with cedil</desc><unientity>015E</unientity></character>
+<character hex="F0 73" dec="240 115"><isoentity>scedil</isoentity><desc>latin small letter s with cedil</desc><unientity>015F</unientity></character>
+<character hex="E3 53" dec="227 083"><isoentity>Scirc</isoentity><desc>latin capital letter s with circumflex</desc><unientity>015C</unientity></character>
+<character hex="E3 73" dec="227 115"><isoentity>scirc</isoentity><desc>latin small letter s with circumflex</desc><unientity>015D</unientity></character>
+<character hex="F7 53" dec="247 083"><isoentity>scommab</isoentity><desc>latin capital letter s with comma below</desc><unientity>0218</unientity></character>
+<character hex="F7 73" dec="247 115"><isoentity>scommab</isoentity><desc>latin small letter s with comma below</desc><unientity>0219</unientity></character>
+<character hex="C1" dec="193"><isoentity>scriptl</isoentity><desc>script small l</desc><unientity>2113</unientity></character>
+<character hex="E7 53" dec="231 083"><isoentity>Sdota</isoentity><desc>latin capital letter s with dot above</desc><unientity>1E60</unientity></character>
+<character hex="E7 73" dec="231 115"><isoentity>sdota</isoentity><desc>latin small letter s with dot above</desc><unientity>1E61</unientity></character>
+<character hex="E7 F2 53" dec="231 242 083"><isoentity>Sdotbda</isoentity><desc>latin capital letter s with dot below and dot above</desc><unientity>1E68</unientity></character>
+<character hex="E7 F2 73" dec="231 242 115"><isoentity>sdotbda</isoentity><desc>latin small letter s with dot below and dot above</desc><unientity>1E69</unientity></character>
+<character hex="F2 53" dec="242 083"><isoentity>Sdotb</isoentity><desc>latin capital letter s with dot below</desc><unientity>1E62</unientity></character>
+<character hex="F2 73" dec="242 115"><isoentity>sdotb</isoentity><desc>latin small letter s with dot below</desc><unientity>1E63</unientity></character>
+<character hex="C4" dec="196"><isoentity>sharp</isoentity><desc>sharp</desc><unientity>266F</unientity></character>
+<character hex="A7" dec="167"><isoentity>softsign</isoentity><desc>modifier letter prime</desc><unientity>02B9</unientity></character>
+<character hex="1B 62 30 1B 73" dec="027 098 048 027 115"><isoentity>sub0</isoentity><desc>subscript zero</desc><unientity>2080</unientity></character>
+<character hex="1B 62 31 1B 73" dec="027 098 049 027 115"><isoentity>sub1</isoentity><desc>subscript one</desc><unientity>2081</unientity></character>
+<character hex="1B 62 32 1B 73" dec="027 098 050 027 115"><isoentity>sub2</isoentity><desc>subscript two</desc><unientity>2082</unientity></character>
+<character hex="1B 62 33 1B 73" dec="027 098 051 027 115"><isoentity>sub3</isoentity><desc>subscript three</desc><unientity>2083</unientity></character>
+<character hex="1B 62 34 1B 73" dec="027 098 052 027 115"><isoentity>sub4</isoentity><desc>subscript four</desc><unientity>2084</unientity></character>
+<character hex="1B 62 35 1B 73" dec="027 098 053 027 115"><isoentity>sub5</isoentity><desc>subscript five</desc><unientity>2085</unientity></character>
+<character hex="1B 62 36 1B 73" dec="027 098 054 027 115"><isoentity>sub6</isoentity><desc>subscript six</desc><unientity>2086</unientity></character>
+<character hex="1B 62 37 1B 73" dec="027 098 055 027 115"><isoentity>sub7</isoentity><desc>subscript seven</desc><unientity>2087</unientity></character>
+<character hex="1B 62 38 1B 73" dec="027 098 056 027 115"><isoentity>sub8</isoentity><desc>subscript eight</desc><unientity>2088</unientity></character>
+<character hex="1B 62 39 1B 73" dec="027 098 057 027 115"><isoentity>sub9</isoentity><desc>subscript nine</desc><unientity>2089</unientity></character>
+<character hex="1B 62 28 1B 73" dec="027 098 040 027 115"><isoentity>sublpar</isoentity><desc>subscript left parenthesis</desc><unientity>208D</unientity></character>
+<character hex="1B 62 2D 1B 73" dec="027 098 045 027 115"><isoentity>subminus</isoentity><desc>subscript minus</desc><unientity>208B</unientity></character>
+<character hex="1B 62 2B 1B 73" dec="027 098 043 027 115"><isoentity>subplus</isoentity><desc>subscript plus sign</desc><unientity>208A</unientity></character>
+<character hex="1B 62 29 1B 73" dec="027 098 041 027 115"><isoentity>subrpar</isoentity><desc>subscript right parenthesis</desc><unientity>208E</unientity></character>
+<character hex="1B 70 30 1B 73" dec="027 112 048 027 115"><isoentity>sup0</isoentity><desc>superscript zero</desc><unientity>2070</unientity></character>
+<character hex="1B 70 31 1B 73" dec="027 112 049 027 115"><isoentity>sup1</isoentity><desc>superscript one</desc><unientity>00B9</unientity></character>
+<character hex="1B 70 32 1B 73" dec="027 112 050 027 115"><isoentity>sup2</isoentity><desc>superscript two</desc><unientity>00B2</unientity></character>
+<character hex="1B 70 33 1B 73" dec="027 112 051 027 115"><isoentity>sup3</isoentity><desc>superscript three</desc><unientity>00B3</unientity></character>
+<character hex="1B 70 34 1B 73" dec="027 112 052 027 115"><isoentity>sup4</isoentity><desc>superscript four</desc><unientity>2074</unientity></character>
+<character hex="1B 70 35 1B 73" dec="027 112 053 027 115"><isoentity>sup5</isoentity><desc>superscript five</desc><unientity>2075</unientity></character>
+<character hex="1B 70 36 1B 73" dec="027 112 054 027 115"><isoentity>sup6</isoentity><desc>superscript six</desc><unientity>2076</unientity></character>
+<character hex="1B 70 37 1B 73" dec="027 112 055 027 115"><isoentity>sup7</isoentity><desc>superscript seven</desc><unientity>2077</unientity></character>
+<character hex="1B 70 38 1B 73" dec="027 112 056 027 115"><isoentity>sup8</isoentity><desc>superscript eight</desc><unientity>2078</unientity></character>
+<character hex="1B 70 39 1B 73" dec="027 112 056 027 115"><isoentity>sup9</isoentity><desc>superscript nine</desc><unientity>2079</unientity></character>
+<character hex="1B 70 28 1B 73" dec="027 112 040 027 115"><isoentity>suplpar</isoentity><desc>superscript left parenthesis</desc><unientity>207D</unientity></character>
+<character hex="1B 70 2D 1B 73" dec="027 112 045 027 115"><isoentity>supminus</isoentity><desc>superscript minus</desc><unientity>207B</unientity></character>
+<character hex="1B 70 2B 1B 73" dec="027 112 043 027 115"><isoentity>supplus</isoentity><desc>superscript plus sign</desc><unientity>207A</unientity></character>
+<character hex="1B 70 29 1B 73" dec="027 112 041 027 115"><isoentity>suprpar</isoentity><desc>superscript right parenthesis</desc><unientity>207E</unientity></character>
+<character hex="E9 54" dec="233 084"><isoentity>Tcaron</isoentity><desc>latin capital letter t with caron</desc><unientity>0164</unientity></character>
+<character hex="E9 74" dec="233 116"><isoentity>tcaron</isoentity><desc>latin small letter t with caron</desc><unientity>0165</unientity></character>
+<character hex="F0 54" dec="240 084"><isoentity>Tcedil</isoentity><desc>latin capital letter t with cedilla</desc><unientity>0162</unientity></character>
+<character hex="F0 74" dec="240 116"><isoentity>tcedil</isoentity><desc>latin small letter t with cedilla</desc><unientity>0163</unientity></character>
+<character hex="E4 E3 65" dec="228 227 101"><isoentity>tcircti</isoentity><desc>latin small letter e with circumflex and tilde</desc><unientity>1EC5</unientity></character>
+<character hex="F7 54" dec="247 084"><isoentity>Tcommab</isoentity><desc>latin capital letter t with comma below</desc><unientity>021A</unientity></character>
+<character hex="F7 74" dec="247 116"><isoentity>tcommab</isoentity><desc>latin small letter t with comma below</desc><unientity>021B</unientity></character>
+<character hex="F2 54" dec="242 084"><isoentity>Tdotb</isoentity><desc>latin capital letter t with dot below</desc><unientity>1E6C</unientity></character>
+<character hex="F2 74" dec="242 116"><isoentity>tdotb</isoentity><desc>latin small letter t with dot below</desc><unientity>1E6D</unientity></character>
+<character hex="E7 54" dec="231 084"><isoentity>Tdot</isoentity><desc>latin capital letter t with dot above</desc><unientity>1E6A</unientity></character>
+<character hex="E7 74" dec="231 116"><isoentity>tdot</isoentity><desc>latin small letter t with dot above</desc><unientity>1E6B</unientity></character>
+<character hex="A4" dec="164"><isoentity>THORN</isoentity><desc>latin capital letter thorn</desc><unientity>00DE</unientity></character>
+<character hex="B4" dec="180"><isoentity>thorn</isoentity><desc>latin small letter thorn</desc><unientity>00FE</unientity></character>
+<character hex="E4" dec="228"><isoentity>tilde</isoentity><desc>combining tilde</desc><unientity>0303</unientity></character>
+<character hex="F6 54" dec="246 084"><isoentity>Tmacrb</isoentity><desc>latin capital letter t with line below</desc><unientity>1E6E</unientity></character>
+<character hex="F6 74" dec="246 116"><isoentity>tmacrb</isoentity><desc>latin small letter t with line below</desc><unientity>1E6F</unientity></character>
+<character hex="E8 74" dec="232 116"><isoentity>tuml</isoentity><desc>latin small letter t with diaeresis</desc><unientity>1E97</unientity></character>
+<character hex="E2 55" dec="226 085"><isoentity>Uacute</isoentity><desc>latin capital letter u with acute</desc><unientity>00DA</unientity></character>
+<character hex="E2 75" dec="226 117"><isoentity>uacute</isoentity><desc>latin small letter u with acute</desc><unientity>00FA</unientity></character>
+<character hex="E6 55" dec="230 085"><isoentity>Ubreve</isoentity><desc>latin capital letter u with breve</desc><unientity>016C</unientity></character>
+<character hex="E6 75" dec="230 117"><isoentity>ubreve</isoentity><desc>latin small letter u with breve</desc><unientity>016D</unientity></character>
+<character hex="E9 55" dec="233 085"><isoentity>ucaron</isoentity><desc>latin capital letter u with caron</desc><unientity>01D3</unientity></character>
+<character hex="E9 75" dec="233 117"><isoentity>ucaron</isoentity><desc>latin small letter u with caron</desc><unientity>01D4</unientity></character>
+<character hex="E3 55" dec="227 085"><isoentity>Ucirc</isoentity><desc>latin capital letter u with circumflex</desc><unientity>00DB</unientity></character>
+<character hex="E3 75" dec="227 117"><isoentity>ucirc</isoentity><desc>latin small letter u with circumflex</desc><unientity>00FB</unientity></character>
+<character hex="EE 55" dec="238 085"><isoentity>Udblac</isoentity><desc>latin capital letter u with double acute</desc><unientity>0170</unientity></character>
+<character hex="EE 75" dec="238 117"><isoentity>udblac</isoentity><desc>latin small letter u with double acute</desc><unientity>0171</unientity></character>
+<character hex="F3 75" dec="243 117"><isoentity>udbldb</isoentity><desc>latin small letter u with double dot below</desc><unientity>1E73</unientity></character>
+<character hex="F3 55" dec="243 084"><isoentity>Udlbdb</isoentity><desc>latin capital letter u with double dot below</desc><unientity>1E72</unientity></character>
+<character hex="F2 55" dec="242 085"><isoentity>Udotb</isoentity><desc>latin capital letter u with dot below</desc><unientity>1EE4</unientity></character>
+<character hex="F2 75" dec="242 117"><isoentity>udotb</isoentity><desc>latin small letter u with dot below</desc><unientity>1EE5</unientity></character>
+<character hex="E1 55" dec="225 085"><isoentity>Ugrave</isoentity><desc>latin capital letter u with grave</desc><unientity>00D9</unientity></character>
+<character hex="E1 75" dec="225 117"><isoentity>ugrave</isoentity><desc>latin small letter u with grave</desc><unientity>00F9</unientity></character>
+<character hex="E0 55" dec="224 085"><isoentity>uhooka</isoentity><desc>latin capital letter u with hook above</desc><unientity>1EE6</unientity></character>
+<character hex="E0 75" dec="224 117"><isoentity>uhooka</isoentity><desc>latin small letter u with hook above</desc><unientity>1EE7</unientity></character>
+<character hex="E2 BD" dec="226 189"><isoentity>uhornac</isoentity><desc>latin small letter u with horn and acute</desc><unientity>1EE9</unientity></character>
+<character hex="F2 AD" dec="242 173"><isoentity>Uhorndb</isoentity><desc>latin capital letter u with horn and dot below</desc><unientity>1EF0</unientity></character>
+<character hex="F2 BD" dec="242 189"><isoentity>uhorndb</isoentity><desc>latin small letter u with horn and dot below</desc><unientity>1EF1</unientity></character>
+<character hex="E1 AD" dec="225 173"><isoentity>Uhorngr</isoentity><desc>latin capital letter u with horn and grave</desc><unientity>1EEA</unientity></character>
+<character hex="E1 BD" dec="225 189"><isoentity>uhorngr</isoentity><desc>latin small letter u with horn and grave</desc><unientity>1EEB</unientity></character>
+<character hex="E0 AD" dec="224 173"><isoentity>Uhornha</isoentity><desc>latin capital letter u with horn and hook above</desc><unientity>1EEC</unientity></character>
+<character hex="E0 BD" dec="224 189"><isoentity>uhornha</isoentity><desc>latin small letter u with horn and hook above</desc><unientity>1EED</unientity></character>
+<character hex="E4 AD" dec="228 173"><isoentity>Uhornti</isoentity><desc>latin capital letter u with horn and tilde</desc><unientity>1EEE</unientity></character>
+<character hex="E4 BD" dec="228 189"><isoentity>uhornti</isoentity><desc>latin small letter u with horn and tilde</desc><unientity>1EEF</unientity></character>
+<character hex="AD" dec="173"><isoentity>Uhorn</isoentity><desc>latin capital letter u with horn</desc><unientity>01AF</unientity></character>
+<character hex="BD" dec="189"><isoentity>uhorn</isoentity><desc>latin small letter u with horn</desc><unientity>01B0</unientity></character>
+<character hex="E8 E5 55" dec="232 229 085"><isoentity>Umacrum</isoentity><desc>latin capital letter u with macron and diaeresis</desc><unientity>1E7A</unientity></character>
+<character hex="E8 E5 75" dec="232 229 117"><isoentity>umacrum</isoentity><desc>latin small letter u with macron and diaeresis</desc><unientity>1E7B</unientity></character>
+<character hex="E5 55" dec="229 085"><isoentity>Umacr</isoentity><desc>latin capital letter u with macron</desc><unientity>016A</unientity></character>
+<character hex="E5 75" dec="229 117"><isoentity>umacr</isoentity><desc>latin small letter u with macron</desc><unientity>016B</unientity></character>
+<character hex="E8" dec="232"><isoentity>uml</isoentity><desc>combining diaeresis</desc><unientity>0308</unientity></character>
+<character hex="F6" dec="246"><isoentity>under</isoentity><desc>combining low line</desc><unientity>0332</unientity></character>
+<character hex="F1 55" dec="241 085"><isoentity>Uogon</isoentity><desc>latin capital letter u with ogon</desc><unientity>0172</unientity></character>
+<character hex="F1 75" dec="241 117"><isoentity>uogon</isoentity><desc>latin small letter u with ogon</desc><unientity>0173</unientity></character>
+<character hex="EA 55" dec="234 085"><isoentity>Uring</isoentity><desc>latin capital letter u with ring</desc><unientity>016E</unientity></character>
+<character hex="EA 75" dec="234 117"><isoentity>uring</isoentity><desc>latin small letter u with ring</desc><unientity>016F</unientity></character>
+<character hex="E2 E4 55" dec="226 228 085"><isoentity>utildeac</isoentity><desc>latin capital letter u with tilde and acute</desc><unientity>1E78</unientity></character>
+<character hex="E2 E4 75" dec="226 228 117"><isoentity>utildeac</isoentity><desc>latin small letter u with tilde and acute</desc><unientity>1E79</unientity></character>
+<character hex="E4 55" dec="228 085"><isoentity>Utilde</isoentity><desc>latin capital letter u with tilde</desc><unientity>0168</unientity></character>
+<character hex="E4 75" dec="228 117"><isoentity>utilde</isoentity><desc>latin small letter u with tilde</desc><unientity>0169</unientity></character>
+<character hex="E2 E8 55" dec="226 232 085"><isoentity>Uumlac</isoentity><desc>latin capital letter u with diaeresis and acute</desc><unientity>01D7</unientity></character>
+<character hex="E2 E8 75" dec="226 232 117"><isoentity>uumlac</isoentity><desc>latin small letter u with diaeresis and acute</desc><unientity>01D8</unientity></character>
+<character hex="E9 E8 55" dec="233 232 085"><isoentity>Uumlca</isoentity><desc>latin capital letter u with diaeresis and caron</desc><unientity>01D9</unientity></character>
+<character hex="E9 E8 75" dec="233 232 117"><isoentity>uumlca</isoentity><desc>latin small letter u with diaresis and caron</desc><unientity>01DA</unientity></character>
+<character hex="E1 E8 55" dec="225 230 085"><isoentity>Uumlgr</isoentity><desc>latin capital letter u with diaeresis and grave</desc><unientity>01DB</unientity></character>
+<character hex="E1 E8 75" dec="225 230 117"><isoentity>uumlgr</isoentity><desc>latin small letter u with diaeresis and grave</desc><unientity>01DC</unientity></character>
+<character hex="E5 E8 55" dec="229 232 085"><isoentity>Uumlma</isoentity><desc>latin capital letter u with diaeresis and macron</desc><unientity>01D5</unientity></character>
+<character hex="E5 E8 75" dec="229 232 117"><isoentity>uumlma</isoentity><desc>latin small letter u with diaeresis and macron</desc><unientity>01D6</unientity></character>
+<character hex="E8 55" dec="232 085"><isoentity>Uuml</isoentity><desc>latin capital letter u with umlaut</desc><unientity>00DC</unientity></character>
+<character hex="E8 75" dec="232 117"><isoentity>uuml</isoentity><desc>latin small letter u with umlaut</desc><unientity>00FC</unientity></character>
+<character hex="F2 56" dec="242 086"><isoentity>Vdotb</isoentity><desc>latin capital letter v with dot below</desc><unientity>1E7E</unientity></character>
+<character hex="F2 76" dec="242 118"><isoentity>vdotb</isoentity><desc>latin small letter v with dot below</desc><unientity>1E7F</unientity></character>
+<character hex="E4 56" dec="228 086"><isoentity>Vtilde</isoentity><desc>latin capital letter v with tilde</desc><unientity>1E7C</unientity></character>
+<character hex="E4 76" dec="228 118"><isoentity>vtilde</isoentity><desc>latin small letter v with tilde</desc><unientity>1E7D</unientity></character>
+<character hex="E2 57" dec="226 087"><isoentity>Wacute</isoentity><desc>latin capital letter w with acute</desc><unientity>1E82</unientity></character>
+<character hex="E2 77" dec="226 119"><isoentity>wacute</isoentity><desc>latin small letter w with acute</desc><unientity>1E83</unientity></character>
+<character hex="E3 57" dec="227 087"><isoentity>Wcirc</isoentity><desc>latin capital letter w with circumflex</desc><unientity>0174</unientity></character>
+<character hex="E3 77" dec="227 119"><isoentity>wcirc</isoentity><desc>latin small letter w with circumflex</desc><unientity>0175</unientity></character>
+<character hex="F2 57" dec="242 087"><isoentity>wdotb</isoentity><desc>latin capital letter w with dot below</desc><unientity>1E88</unientity></character>
+<character hex="F2 77" dec="242 119"><isoentity>wdotb</isoentity><desc>latin small letter w with dot below</desc><unientity>1E89</unientity></character>
+<character hex="E7 57" dec="231 087"><isoentity>Wdot</isoentity><desc>latin capital letter w with dot above</desc><unientity>1E86</unientity></character>
+<character hex="E7 77" dec="231 119"><isoentity>wdot</isoentity><desc>latin small letter w with dot above</desc><unientity>1E87</unientity></character>
+<character hex="E1 57" dec="225 087"><isoentity>Wgrave</isoentity><desc>latin capital letter w with grave</desc><unientity>1E80</unientity></character>
+<character hex="E1 77" dec="225 119"><isoentity>wgrave</isoentity><desc>latin small letter w with grave</desc><unientity>1E81</unientity></character>
+<character hex="EA 77" dec="234 119"><isoentity>wring</isoentity><desc>latin small letter w with ring</desc><unientity>1E98</unientity></character>
+<character hex="E8 57" dec="232 087"><isoentity>Wuml</isoentity><desc>latin capital letter w with diaeresis</desc><unientity>1E84</unientity></character>
+<character hex="E8 77" dec="232 119"><isoentity>wuml</isoentity><desc>latin small letter w with diaeresis</desc><unientity>1E85</unientity></character>
+<character hex="E7 58" dec="231 088"><isoentity>Xdot</isoentity><desc>latin capital letter x with dot</desc><unientity>1E8A</unientity></character>
+<character hex="E7 78" dec="231 120"><isoentity>xdot</isoentity><desc>latin small letter x with dot</desc><unientity>1E8B</unientity></character>
+<character hex="E8 58" dec="232 088"><isoentity>Xuml</isoentity><desc>latin capital letter x with diaeresis</desc><unientity>1E8C</unientity></character>
+<character hex="E8 78" dec="232 120"><isoentity>xuml</isoentity><desc>latin small letter x with diaeresis</desc><unientity>1E8D</unientity></character>
+<character hex="E2 59" dec="226 089"><isoentity>Yacute</isoentity><desc>latin capital letter y with acute</desc><unientity>00DD</unientity></character>
+<character hex="E2 79" dec="226 121"><isoentity>yacute</isoentity><desc>latin small letter y with acute</desc><unientity>00FD</unientity></character>
+<character hex="E3 59" dec="227 089"><isoentity>Ycirc</isoentity><desc>latin capital letter y with circumflex</desc><unientity>0176</unientity></character>
+<character hex="E3 79" dec="227 121"><isoentity>ycirc</isoentity><desc>latin small letter y with circumflex</desc><unientity>0177</unientity></character>
+<character hex="F2 59" dec="242 089"><isoentity>Ydotb</isoentity><desc>latin capital letter y with dot below</desc><unientity>1EF4</unientity></character>
+<character hex="F2 79" dec="242 121"><isoentity>ydotb</isoentity><desc>latin small letter y with dot below</desc><unientity>1EF5</unientity></character>
+<character hex="E7 59" dec="231 089"><isoentity>Ydot</isoentity><desc>latin capital letter y with dot</desc><unientity>1E8E</unientity></character>
+<character hex="E7 79" dec="231 121"><isoentity>ydot</isoentity><desc>latin small letter y with dot</desc><unientity>1E8F</unientity></character>
+<character hex="E1 59" dec="225 089"><isoentity>Ygrave</isoentity><desc>latin capital letter y with grave</desc><unientity>1EF2</unientity></character>
+<character hex="E1 79" dec="225 121"><isoentity>ygrave</isoentity><desc>latin small letter y with grave</desc><unientity>1EF3</unientity></character>
+<character hex="E0 59" dec="224 089"><isoentity>Yhooka</isoentity><desc>latin capital letter y with hook above</desc><unientity>1EF6</unientity></character>
+<character hex="E0 79" dec="224 121"><isoentity>yhooka</isoentity><desc>latin small letter y with hook above</desc><unientity>1EF7</unientity></character>
+<character hex="E5 59" dec="229 089"><isoentity>Ymacr</isoentity><desc>latin capital letter y with macron</desc><unientity>0232</unientity></character>
+<character hex="E5 79" dec="229 121"><isoentity>ymacr</isoentity><desc>latin small letter y with macron</desc><unientity>0233</unientity></character>
+<character hex="EA 79" dec="234 121"><isoentity>yring</isoentity><desc>latin small letter y with ring</desc><unientity>1E99</unientity></character>
+<character hex="E4 59" dec="228 089"><isoentity>Ytilde</isoentity><desc>latin capital letter y with tilde</desc><unientity>1EF8</unientity></character>
+<character hex="E4 79" dec="228 121"><isoentity>ytilde</isoentity><desc>latin small letter y with tilde</desc><unientity>1EF9</unientity></character>
+<character hex="E8 59" dec="232 089"><isoentity>Yuml</isoentity><desc>latin capital letter y with umlaut</desc><unientity>0178</unientity></character>
+<character hex="E8 79" dec="232 121"><isoentity>yuml</isoentity><desc>latin small letter y with umlaut</desc><unientity>00FF</unientity></character>
+<character hex="E2 5A" dec="226 090"><isoentity>Zacute</isoentity><desc>latin capital letter z with acute</desc><unientity>0179</unientity></character>
+<character hex="E2 7A" dec="226 122"><isoentity>zacute</isoentity><desc>latin small letter z with acute</desc><unientity>017A</unientity></character>
+<character hex="E9 5A" dec="233 090"><isoentity>Zcaron</isoentity><desc>latin capital letter z with caron</desc><unientity>017D</unientity></character>
+<character hex="E9 7A" dec="233 122"><isoentity>zcaron</isoentity><desc>latin small letter z with caron</desc><unientity>017E</unientity></character>
+<character hex="E3 5A" dec="227 090"><isoentity>Zcirc</isoentity><desc>latin capital letter z with circumflex</desc><unientity>1E90</unientity></character>
+<character hex="E3 7A" dec="227 122"><isoentity>zcirc</isoentity><desc>latin small letter z with circumflex</desc><unientity>1E91</unientity></character>
+<character hex="F2 5A" dec="242 090"><isoentity>Zdotb</isoentity><desc>latin capital letter z with dot below</desc><unientity>1E92</unientity></character>
+<character hex="F2 7A" dec="242 122"><isoentity>zdotb</isoentity><desc>latin small letter z with dot below</desc><unientity>1E93</unientity></character>
+<character hex="E7 5A" dec="231 090"><isoentity>Zdot</isoentity><desc>latin capital letter z with dot above</desc><unientity>017B</unientity></character>
+<character hex="E7 7A" dec="231 122"><isoentity>zdot</isoentity><desc>latin small letter z with dot above</desc><unientity>017C</unientity></character>
+<character hex="F6 5A" dec="246 090"><isoentity>Zlowline</isoentity><desc>latin capital letter z with low line</desc><unientity>1E94</unientity></character>
+<character hex="F6 7A" dec="246 122"><isoentity>zlowline</isoentity><desc>latin small letter z with low line</desc><unientity>1E95</unientity></character>
+ </entitymap>
--- /dev/null
+#!/bin/sh
+# the next line restats using tclsh \
+exec tclsh "$0" "$@"
+#
+# $Id: charconv.tcl,v 1.1 2003-10-27 12:21:30 adam Exp $
+
+proc usage {} {
+ puts {charconv.tcl: [-p prefix] [-s split] [-o ofile] file ... }
+ exit 1
+}
+
+proc ins_trie {from to} {
+ global trie
+ if {![info exists trie(no)]} {
+ set trie(no) 1
+ set trie(size) 0
+ }
+ incr trie(size)
+ ins_trie_r [split $from] $to 0
+}
+
+proc split_trie {this} {
+ global trie
+ set trie($this,type) d
+ foreach e $trie($this,content) {
+ set from [lindex $e 0]
+ set to [lindex $e 1]
+
+ set ch [lindex $from 0]
+ set rest [lrange $from 1 end]
+
+ if {[llength $rest]} {
+ if {![info exist trie($this,ptr,$ch)]} {
+ set trie($this,ptr,$ch) $trie(no)
+ incr trie(no)
+ }
+ ins_trie_r $rest $to $trie($this,ptr,$ch)
+ } else {
+ set trie($this,to,$ch) $to
+ }
+ }
+ set trie($this,content) missing
+}
+
+proc ins_trie_r {from to this} {
+ global trie
+
+ if {![info exist trie($this,type)]} {
+ set trie($this,type) f
+ }
+ if {$trie($this,type) == "f"} {
+ lappend trie($this,content) [list $from $to]
+
+ # split ?
+ if {[llength $trie($this,content)] > $trie(split)} {
+ split_trie $this
+ return [ins_trie_r $from $to $this]
+ }
+ } else {
+ set ch [lindex $from 0]
+ set rest [lrange $from 1 end]
+
+ if {[llength $rest]} {
+ if {![info exist trie($this,ptr,$ch)]} {
+ set trie($this,ptr,$ch) $trie(no)
+ incr trie(no)
+ }
+ ins_trie_r $rest $to $trie($this,ptr,$ch)
+ } else {
+ set trie($this,to,$ch) $to
+ }
+ }
+}
+
+proc dump_trie {ofile} {
+ global trie
+
+ set f [open $ofile w]
+
+ puts $f "/* TRIE: size $trie(size) */"
+ puts $f "\#include <string.h>"
+ puts $f {
+ struct yaz_iconv_trie_flat {
+ char *from;
+ int to;
+ };
+ struct yaz_iconv_trie_dir {
+ struct yaz_iconv_trie *ptr;
+ int to;
+ };
+
+ struct yaz_iconv_trie {
+ struct yaz_iconv_trie_flat *flat;
+ struct yaz_iconv_trie_dir *dir;
+ };
+ }
+
+ set this $trie(no)
+ while { [incr this -1] >= 0 } {
+ puts $f "/* PAGE $this */"
+ if {$trie($this,type) == "f"} {
+ puts $f "struct yaz_iconv_trie_flat $trie(prefix)page${this}_flat\[\] = \{"
+ foreach m $trie($this,content) {
+ puts -nonewline $f " \{\""
+ foreach d [lindex $m 0] {
+ puts -nonewline $f "\\x$d"
+ }
+ puts -nonewline $f "\", 0x[lindex $m 1]"
+ puts $f "\},"
+ }
+ puts $f " \{0, 0\}"
+ puts $f "\};"
+ puts $f "struct yaz_iconv_trie $trie(prefix)page${this} = \{"
+ puts $f " $trie(prefix)page${this}_flat, 0"
+ puts $f "\};"
+ } else {
+ puts $f "struct yaz_iconv_trie_dir $trie(prefix)page${this}_dir\[256\] = \{"
+ for {set i 0} {$i < 256} {incr i} {
+ puts -nonewline $f " \{"
+ set ch [format %02X $i]
+ set null 1
+ if {[info exist trie($this,ptr,$ch)]} {
+ puts -nonewline $f "&$trie(prefix)page$trie($this,ptr,$ch), "
+ set null 0
+ } else {
+ puts -nonewline $f "0, "
+ }
+ if {[info exist trie($this,to,$ch)]} {
+ puts -nonewline $f "0x$trie($this,to,$ch)\}"
+ set null 0
+ } else {
+ puts -nonewline $f "0\}"
+ }
+ if {!$null} {
+ puts -nonewline $f " /* $ch */"
+ }
+ if {$i < 255} {
+ puts $f ","
+ } else {
+ puts $f ""
+ }
+ }
+ puts $f "\};"
+ puts $f "struct yaz_iconv_trie $trie(prefix)page${this} = \{"
+ puts $f " 0, $trie(prefix)page${this}_dir"
+ puts $f "\};"
+ }
+ }
+ puts $f {
+ static unsigned long lookup(struct yaz_iconv_trie *t, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+ {
+ if (!t || inbytesleft < 1)
+ return 0;
+ if (t->dir)
+ {
+ size_t ch = inp[0] & 0xff;
+ unsigned long code =
+ lookup(t->dir[ch].ptr, inp+1, inbytesleft-1, no_read);
+ if (code)
+ {
+ (*no_read)++;
+ return code;
+ }
+ if (t->dir[ch].to)
+ {
+ code = t->dir[ch].to;
+ *no_read = 1;
+ return code;
+ }
+ }
+ else
+ {
+ struct yaz_iconv_trie_flat *flat = t->flat;
+ while (flat->from)
+ {
+ size_t len = strlen(flat->from);
+ if (len <= inbytesleft)
+ {
+ if (memcmp(flat->from, inp, len) == 0)
+ {
+ *no_read = len;
+ return flat->to;
+ }
+ }
+ flat++;
+ }
+ }
+ return 0;
+ }
+
+ }
+ puts $f "unsigned long yaz_$trie(prefix)_conv
+ (unsigned char *inp, size_t inbytesleft, size_t *no_read)
+ {
+ unsigned long code;
+
+ code = lookup(&$trie(prefix)page0, inp, inbytesleft, no_read);
+ if (!code)
+ {
+ *no_read = 1;
+ code = *inp;
+ }
+ return code;
+ }
+ "
+ close $f
+}
+
+proc readfile {fname} {
+ set lineno 0
+ set f [open $fname r]
+ while {1} {
+ incr lineno
+ set cnt [gets $f line]
+ if {$cnt < 0} {
+ break
+ }
+ set hex {}
+ set uni {}
+ regexp {<character hex="([^\"]*)".*<unientity>([0-9A-Z]*)</unientity>} $line s hex uni
+ # puts "$lineno hex=$hex uni=$uni $line"
+ if {[string length $uni]} {
+ ins_trie $hex $uni
+ }
+ }
+ close $f
+}
+
+set verbose 0
+set ifile {}
+set ofile out.c
+set trie(split) 40
+set trie(prefix) {}
+# Parse command line
+set l [llength $argv]
+set i 0
+while {$i < $l} {
+ set arg [lindex $argv $i]
+ switch -glob -- $arg {
+ -v {
+ incr verbose
+ }
+ -s {
+ if {[string length $arg]} {
+ set arg [lindex $argv [incr i]]
+ }
+ set trie(split) $arg
+ }
+ -p {
+ if {[string length $arg]} {
+ set arg [lindex $argv [incr i]]
+ }
+ set trie(prefix) $arg
+ }
+ -o {
+ if {[string length $arg]} {
+ set arg [lindex $argv [incr i]]
+ }
+ set ofile $arg
+ }
+ default {
+ lappend ifiles $arg
+ }
+ }
+ incr i
+}
+if {![info exists ifiles]} {
+ puts "charconv.tcl: missing input file(s)"
+ usage
+}
+foreach ifile $ifiles {
+ readfile $ifile
+}
+dump_trie $ofile
--- /dev/null
+<entitymap>
+<character hex="21 23 20"><unientity>3000</unientity><desc>CJK space in some implementations</desc></character>
+<character hex="21 23 21"><unientity>3000</unientity><desc>CJK space per ANSI Z39.64</desc></character>
+<character hex="21 23 28"><unientity>FF08</unientity><desc>Ideographic left parenthesis</desc></character>
+<character hex="21 23 29"><unientity>FF09</unientity><desc>Ideographic right parenthesis</desc></character>
+<character hex="21 23 2D"><unientity>FF0D</unientity><desc>Ideographic hyphen minus</desc></character>
+<character hex="21 2A 21"><unientity>E8D0</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 22"><unientity>E8D1</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 23"><unientity>E8D2</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 24"><unientity>E8D3</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 25"><unientity>E8D4</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 26"><unientity>E8D5</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 28"><unientity>E8D6</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 29"><unientity>E8D7</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2A"><unientity>E8D8</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2B"><unientity>E8D9</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2C"><unientity>E8DA</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2D"><unientity>E8DB</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2E"><unientity>E8DC</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 2F"><unientity>E8DD</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 30"><unientity>E8DE</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 32"><unientity>E8DF</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 33"><unientity>E8E0</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 34"><unientity>E8E1</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 35"><unientity>E8E2</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 36"><unientity>E8E3</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 37"><unientity>E8E4</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 38"><unientity>E8E5</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 39"><unientity>E8E6</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3A"><unientity>E8E7</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3B"><unientity>E8E8</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3C"><unientity>E8E9</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3D"><unientity>E8EA</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3E"><unientity>E8EB</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 3F"><unientity>E8EC</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 40"><unientity>E8ED</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 41"><unientity>E8EE</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 42"><unientity>E8EF</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 43"><unientity>E8F0</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 44"><unientity>E8F1</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 45"><unientity>E8F2</unientity><desc>EACC component character</desc></character>
+<character hex="21 2A 46"><unientity>3013</unientity><desc>Ideographic geta symbol</desc></character>
+<character hex="21 2B 25"><unientity>300C</unientity><desc>Ideographic left corner bracket</desc></character>
+<character hex="21 2B 26"><unientity>300D</unientity><desc>Ideographic right corner bracket</desc></character>
+<character hex="21 2B 31"><unientity>FF3B</unientity><desc>Ideographic left square bracket</desc></character>
+<character hex="21 2B 32"><unientity>FF3D</unientity><desc>Ideographic right square bracket</desc></character>
+<character hex="21 2B 33"><unientity>3002</unientity><desc>Ideographic full stop</desc></character>
+<character hex="21 2B 34"><unientity>FF0E</unientity><desc>Ideographic variant full stop</desc></character>
+<character hex="21 2B 35"><unientity>3001</unientity><desc>Ideographic comma</desc></character>
+<character hex="21 2B 38"><unientity>FF0C</unientity><desc>Ideographic variant comma</desc></character>
+<character hex="21 2B 39"><unientity>FF1B</unientity><desc>Ideographic semicolon</desc></character>
+<character hex="21 2B 3A"><unientity>FF1A</unientity><desc>Ideographic colon</desc></character>
+<character hex="21 2B 3B"><unientity>FF1F</unientity><desc>Ideographic question mark</desc></character>
+<character hex="21 2B 3D"><unientity>FF01</unientity><desc>Ideographic exclamation point</desc></character>
+<character hex="21 2B 59"><unientity>FF0F</unientity><desc>Ideographic solidus</desc></character>
+<character hex="21 2F 30"><unientity>3007</unientity><desc>Ideographic number zero</desc></character>
+<character hex="21 30 21"><unientity>4E00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 22"><unientity>4E01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 23"><unientity>4E03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 24"><unientity>4E09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 25"><unientity>4E0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 26"><unientity>4E0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 27"><unientity>4E08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 29"><unientity>4E10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2A"><unientity>4E0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2B"><unientity>4E14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2C"><unientity>4E19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2D"><unientity>4E16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2E"><unientity>4E15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 2F"><unientity>4E18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 30"><unientity>4E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 31"><unientity>4E1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 32"><unientity>4E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 34"><unientity>4E2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 35"><unientity>4E32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 36"><unientity>51E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 37"><unientity>4E38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 38"><unientity>4E39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 39"><unientity>4E3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 3A"><unientity>4E43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 3B"><unientity>4E45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 3D"><unientity>4E4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 3E"><unientity>5C39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 3F"><unientity>4E4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 40"><unientity>4E4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 41"><unientity>4E4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 42"><unientity>4E52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 43"><unientity>4E53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 44"><unientity>4E56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 45"><unientity>4E58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 46"><unientity>4E59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 47"><unientity>4E5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 48"><unientity>4E5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 49"><unientity>4E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 4B"><unientity>4E73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 4C"><unientity>4E7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 4D"><unientity>4E82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 50"><unientity>4E8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 51"><unientity>4E8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 52"><unientity>4E8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 53"><unientity>4E95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 54"><unientity>4E94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 55"><unientity>4E92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 57"><unientity>E930</unientity><unientityalt>4E99</unientityalt><desc>Variant of 4B3057 which maps to 4E99</desc></character>
+<character hex="21 30 58"><unientity>4E9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 59"><unientity>4E9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5A"><unientity>4E9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5B"><unientity>4EA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5C"><unientity>4EA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5D"><unientity>4EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5E"><unientity>4EA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 5F"><unientity>4EA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 60"><unientity>4EAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 61"><unientity>4EAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 62"><unientity>4EAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 63"><unientity>4EAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 64"><unientity>4EBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 65"><unientity>4ECA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 66"><unientity>4EC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 68"><unientity>4EC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 69"><unientity>4EC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 6B"><unientity>4ECD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 6C"><unientity>4EC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 6D"><unientity>4ECB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 6E"><unientity>4EE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 6F"><unientity>4ED8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 70"><unientity>4ED5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 71"><unientity>4ED6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 72"><unientity>4EDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 73"><unientity>4EE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 74"><unientity>4ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 75"><unientity>4ED7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 76"><unientity>4ED9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 77"><unientity>4EE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 78"><unientity>4EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 79"><unientity>4F09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 7C"><unientity>4EFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 7D"><unientity>4F0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 30 7E"><unientity>4F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 21"><unientity>4F11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 22"><unientity>4F10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 23"><unientity>4F0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 24"><unientity>4EF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 25"><unientity>4F01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 26"><unientity>4EF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 27"><unientity>4EF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 28"><unientity>4EF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2A"><unientity>4F4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2B"><unientity>4F4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2C"><unientity>4F34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2D"><unientity>4F47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2E"><unientity>4F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 2F"><unientity>4F3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 30"><unientity>4F5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 32"><unientity>4F5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 33"><unientity>4F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 34"><unientity>4F30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 35"><unientity>4F50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 36"><unientity>4F51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 37"><unientity>4F3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 38"><unientity>4F48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 39"><unientity>4F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3A"><unientity>4F38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3B"><unientity>4F43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3C"><unientity>4F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3D"><unientity>4F3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3E"><unientity>4F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 3F"><unientity>4F5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 40"><unientity>4F60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 41"><unientity>4F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 42"><unientity>4F4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 43"><unientity>4F5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 44"><unientity>4F36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 45"><unientity>4F9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 46"><unientity>4F6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 47"><unientity>4F75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 48"><unientity>4F8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 49"><unientity>4F73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4A"><unientity>4F7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4B"><unientity>4F9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4C"><unientity>4F86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4D"><unientity>4F6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4E"><unientity>4F8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 4F"><unientity>4F96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 51"><unientity>4F83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 52"><unientity>4F7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 53"><unientity>4F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 54"><unientity>4F69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 55"><unientity>4F8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 56"><unientity>4F7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 57"><unientity>4FE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 58"><unientity>4FD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 59"><unientity>4FB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5A"><unientity>4FAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5B"><unientity>4FBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5C"><unientity>4FDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5D"><unientity>4FE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5E"><unientity>4FCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 5F"><unientity>4FB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 60"><unientity>4FDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 61"><unientity>4FDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 62"><unientity>4FC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 63"><unientity>4FD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 64"><unientity>4FDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 65"><unientity>4FCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 66"><unientity>4FAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 67"><unientity>4FD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 68"><unientity>4FC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 69"><unientity>4FC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 6A"><unientity>4FCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 6B"><unientity>4FD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 6C"><unientity>5009</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 6E"><unientity>500D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 6F"><unientity>4FEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 70"><unientity>5026</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 71"><unientity>500C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 72"><unientity>5025</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 73"><unientity>5011</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 74"><unientity>4FF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 75"><unientity>5028</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 76"><unientity>5014</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 77"><unientity>5016</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 78"><unientity>5029</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 79"><unientity>5006</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 7B"><unientity>5012</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 7C"><unientity>503C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 7D"><unientity>501A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 31 7E"><unientity>4FFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 21"><unientity>5018</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 22"><unientity>4FF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 23"><unientity>5021</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 24"><unientity>500B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 25"><unientity>5019</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 26"><unientity>5000</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 27"><unientity>4FEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 28"><unientity>4FF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 29"><unientity>502D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2A"><unientity>5003</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2B"><unientity>4FFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2C"><unientity>502A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2D"><unientity>502B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2E"><unientity>505C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 2F"><unientity>504F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 30"><unientity>5065</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 31"><unientity>5047</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 32"><unientity>505A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 33"><unientity>5049</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 34"><unientity>5043</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 35"><unientity>5074</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 36"><unientity>5076</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 37"><unientity>504E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 38"><unientity>5075</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 39"><unientity>504C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3A"><unientity>5055</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3B"><unientity>500F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3C"><unientity>5077</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3D"><unientity>508D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3E"><unientity>50A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 3F"><unientity>5085</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 40"><unientity>5099</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 41"><unientity>5091</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 42"><unientity>5080</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 43"><unientity>5096</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 44"><unientity>5098</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 45"><unientity>50AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 46"><unientity>50B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 47"><unientity>50B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 48"><unientity>50B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 49"><unientity>50C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4A"><unientity>50BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4B"><unientity>50AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4C"><unientity>50B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4D"><unientity>50AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4E"><unientity>50E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 4F"><unientity>50EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 50"><unientity>50F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 51"><unientity>50E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 52"><unientity>50D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 53"><unientity>50ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 54"><unientity>50DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 55"><unientity>50D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 56"><unientity>507D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 57"><unientity>50CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 58"><unientity>50D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 59"><unientity>5100</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5A"><unientity>5104</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5B"><unientity>50FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5C"><unientity>50F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5D"><unientity>50F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5E"><unientity>5102</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 5F"><unientity>510D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 60"><unientity>5108</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 61"><unientity>5109</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 62"><unientity>5110</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 63"><unientity>5118</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 64"><unientity>5112</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 65"><unientity>5114</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 66"><unientity>512A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 67"><unientity>511F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 68"><unientity>5121</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 69"><unientity>5132</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6A"><unientity>5137</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6B"><unientity>513C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6C"><unientity>5140</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6D"><unientity>5143</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6E"><unientity>5141</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 6F"><unientity>5145</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 70"><unientity>5144</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 71"><unientity>5146</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 72"><unientity>5149</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 73"><unientity>5147</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 74"><unientity>5148</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 75"><unientity>514C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 77"><unientity>514D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 78"><unientity>5155</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 79"><unientity>5154</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 7A"><unientity>5152</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 7B"><unientity>5157</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 7C"><unientity>515C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 7D"><unientity>5162</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 32 7E"><unientity>5165</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 21"><unientity>5167</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 22"><unientity>5168</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 23"><unientity>5169</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 24"><unientity>516B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 25"><unientity>516D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 26"><unientity>516E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 27"><unientity>516C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 28"><unientity>5171</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 29"><unientity>5175</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2A"><unientity>5176</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2B"><unientity>5177</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2C"><unientity>5178</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2D"><unientity>517C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2E"><unientity>5180</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 2F"><unientity>5189</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 30"><unientity>518C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 31"><unientity>518D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 32"><unientity>5192</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 33"><unientity>5191</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 34"><unientity>5195</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 35"><unientity>6700</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 36"><unientity>5197</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 37"><unientity>51A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 39"><unientity>51A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 3C"><unientity>51B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 3D"><unientity>51B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 3E"><unientity>51B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 40"><unientity>51CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 41"><unientity>51CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 44"><unientity>51DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 45"><unientity>51DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 47"><unientity>51F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 48"><unientity>51F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 49"><unientity>51F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 4B"><unientity>51FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 4C"><unientity>51F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 4D"><unientity>51F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 4E"><unientity>51FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 4F"><unientity>5200</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 50"><unientity>5201</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 51"><unientity>5203</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 52"><unientity>5207</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 53"><unientity>5206</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 54"><unientity>5208</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 55"><unientity>520A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 56"><unientity>5211</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 57"><unientity>5217</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 59"><unientity>520E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5A"><unientity>5224</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5B"><unientity>5225</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5C"><unientity>5220</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5D"><unientity>5228</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5E"><unientity>5229</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 5F"><unientity>5238</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 60"><unientity>523B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 61"><unientity>5237</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 62"><unientity>5230</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 63"><unientity>523A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 66"><unientity>5241</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 67"><unientity>5239</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 68"><unientity>5243</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 69"><unientity>524D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6A"><unientity>524C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6B"><unientity>524B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6C"><unientity>524A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6D"><unientity>5247</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6E"><unientity>525C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 6F"><unientity>5256</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 70"><unientity>525B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 71"><unientity>5254</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 72"><unientity>525D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 73"><unientity>526A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 74"><unientity>526F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 75"><unientity>5272</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 76"><unientity>5274</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 77"><unientity>5269</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 78"><unientity>5275</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 7A"><unientity>527D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 7B"><unientity>527F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 7C"><unientity>5283</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 7D"><unientity>5288</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 33 7E"><unientity>5287</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 21"><unientity>528D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 22"><unientity>5289</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 23"><unientity>5291</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 24"><unientity>529B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 25"><unientity>529F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 26"><unientity>52A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 27"><unientity>52A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 28"><unientity>52AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 29"><unientity>52A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2A"><unientity>52AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2B"><unientity>52AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2C"><unientity>52BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2D"><unientity>52C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2E"><unientity>52C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 2F"><unientity>52C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 30"><unientity>52C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 31"><unientity>52D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 32"><unientity>52D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 33"><unientity>52D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 34"><unientity>52D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 35"><unientity>52DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 36"><unientity>52DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 37"><unientity>52DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 38"><unientity>52E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 39"><unientity>52E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 3A"><unientity>52DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 3C"><unientity>52F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 3D"><unientity>52F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 3E"><unientity>52FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 40"><unientity>52FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 41"><unientity>5305</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 42"><unientity>5306</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 43"><unientity>5308</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 44"><unientity>530D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 45"><unientity>5310</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 46"><unientity>530F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 47"><unientity>5315</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 48"><unientity>5316</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 49"><unientity>5317</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4A"><unientity>5319</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4B"><unientity>53F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4C"><unientity>531D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4D"><unientity>5321</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4E"><unientity>5320</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 4F"><unientity>5323</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 50"><unientity>532A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 51"><unientity>532F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 52"><unientity>5331</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 53"><unientity>5339</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 54"><unientity>533E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 55"><unientity>5340</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 56"><unientity>533F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 57"><unientity>5341</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 58"><unientity>5343</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 59"><unientity>5345</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 5A"><unientity>5348</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 5B"><unientity>5347</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 5C"><unientity>534A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 5D"><unientity>E931</unientity><unientityalt>5349</unientityalt><desc>Variant of 2D345D which maps to 5349</desc></character>
+<character hex="21 34 5F"><unientity>5352</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 60"><unientity>5354</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 61"><unientity>5353</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 62"><unientity>5351</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 63"><unientity>5357</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 64"><unientity>535A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 66"><unientity>535E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 67"><unientity>5361</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 69"><unientity>5366</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6A"><unientity>536F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6B"><unientity>536E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6C"><unientity>5370</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6D"><unientity>5371</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6E"><unientity>537D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 6F"><unientity>5375</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 71"><unientity>5378</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 73"><unientity>537B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 74"><unientity>537F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 75"><unientity>5384</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 76"><unientity>539A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 77"><unientity>539D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 78"><unientity>539F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 79"><unientity>53A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 7A"><unientity>53AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 7B"><unientity>53B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 7C"><unientity>53BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 7D"><unientity>53C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 34 7E"><unientity>53C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 21"><unientity>53C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 22"><unientity>53CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 23"><unientity>53CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 24"><unientity>53CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 25"><unientity>53D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 26"><unientity>53D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 27"><unientity>53D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 28"><unientity>53DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 29"><unientity>53DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2A"><unientity>66FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2B"><unientity>53E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2C"><unientity>53E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2D"><unientity>53F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2E"><unientity>53E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 2F"><unientity>53EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 30"><unientity>53EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 31"><unientity>53E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 32"><unientity>53F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 33"><unientity>53FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 34"><unientity>53E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 35"><unientity>53E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 36"><unientity>53EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 37"><unientity>53EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 38"><unientity>E900</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="21 35 39"><unientity>53E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 3A"><unientity>53F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 3B"><unientity>53ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 3C"><unientity>53EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 3D"><unientity>53F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 3F"><unientity>540B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 40"><unientity>5409</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 41"><unientity>5410</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 42"><unientity>540F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 43"><unientity>540C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 44"><unientity>540A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 45"><unientity>540D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 46"><unientity>5404</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 47"><unientity>5403</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 48"><unientity>5412</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 4A"><unientity>E9E0</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 35 4D"><unientity>542D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 4E"><unientity>541D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 4F"><unientity>541E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 50"><unientity>541B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 51"><unientity>544E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 52"><unientity>543E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 53"><unientity>5427</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 54"><unientity>5440</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 55"><unientity>5431</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 56"><unientity>5446</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 57"><unientity>543C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 58"><unientity>5443</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 59"><unientity>5426</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5A"><unientity>5420</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5B"><unientity>5436</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5C"><unientity>5433</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5D"><unientity>5435</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5E"><unientity>542E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 5F"><unientity>544A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 60"><unientity>5448</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 61"><unientity>543B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 62"><unientity>5438</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 63"><unientity>5439</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 64"><unientity>5442</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 65"><unientity>542B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 66"><unientity>541F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 67"><unientity>5429</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 68"><unientity>5473</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 69"><unientity>5462</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6A"><unientity>5475</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6B"><unientity>5495</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6C"><unientity>5478</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6D"><unientity>5496</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6E"><unientity>5477</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 6F"><unientity>547B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 71"><unientity>5492</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 72"><unientity>5484</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 73"><unientity>547C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 74"><unientity>5468</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 75"><unientity>5486</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 76"><unientity>548B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 77"><unientity>548C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 78"><unientity>5490</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 79"><unientity>547D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 7A"><unientity>5476</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 7B"><unientity>5471</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 7C"><unientity>549A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 7D"><unientity>548E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 35 7E"><unientity>54A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 21"><unientity>54AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 22"><unientity>54A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 23"><unientity>54AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 24"><unientity>54C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 25"><unientity>54B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 26"><unientity>54A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 27"><unientity>54AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 28"><unientity>54C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 29"><unientity>54C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 2A"><unientity>54C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 2B"><unientity>54C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 2D"><unientity>54C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 2F"><unientity>54CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 30"><unientity>54B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 31"><unientity>54BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 32"><unientity>54AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 33"><unientity>54C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 34"><unientity>5501</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 35"><unientity>54FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 36"><unientity>5510</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 37"><unientity>54EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 38"><unientity>5514</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 39"><unientity>54FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3A"><unientity>54E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3B"><unientity>54EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3C"><unientity>54F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3D"><unientity>54E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3E"><unientity>54E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 3F"><unientity>54E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 40"><unientity>54ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 41"><unientity>5506</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 42"><unientity>5509</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 43"><unientity>54E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 44"><unientity>5556</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 45"><unientity>5533</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 46"><unientity>5546</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 48"><unientity>554F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 49"><unientity>555E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4A"><unientity>5566</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4B"><unientity>556A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4C"><unientity>554A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4D"><unientity>5544</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4E"><unientity>555C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 4F"><unientity>5531</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 50"><unientity>5543</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 51"><unientity>552C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 52"><unientity>5561</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 53"><unientity>553E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 54"><unientity>5563</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 55"><unientity>5555</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 56"><unientity>552F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 57"><unientity>552E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 58"><unientity>5564</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 59"><unientity>5538</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5A"><unientity>55A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5B"><unientity>5580</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5C"><unientity>557B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5D"><unientity>557C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5E"><unientity>5527</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 5F"><unientity>5594</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 60"><unientity>5587</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 61"><unientity>559C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 62"><unientity>558B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 63"><unientity>55AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 64"><unientity>55B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 65"><unientity>558A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 66"><unientity>5583</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 67"><unientity>55B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 68"><unientity>55AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 69"><unientity>5582</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6A"><unientity>559F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6B"><unientity>559D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6C"><unientity>5598</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6D"><unientity>559A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6E"><unientity>557E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 6F"><unientity>55AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 70"><unientity>5589</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 71"><unientity>55B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 72"><unientity>55BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 73"><unientity>55E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 74"><unientity>55DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 75"><unientity>55D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 76"><unientity>55DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 77"><unientity>55E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 78"><unientity>55C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 79"><unientity>55D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 7A"><unientity>55CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 7B"><unientity>55E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 7C"><unientity>55EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 7D"><unientity>55E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 36 7E"><unientity>55C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 21"><unientity>55DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 22"><unientity>55C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 23"><unientity>55E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 24"><unientity>5600</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 25"><unientity>561B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 26"><unientity>55FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 27"><unientity>5616</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 28"><unientity>55F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 29"><unientity>5608</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 2A"><unientity>561F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 2B"><unientity>55FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 2C"><unientity>E932</unientity><unientityalt>5606</unientityalt><desc>Variant of 4B372C which maps to 5606</desc></character>
+<character hex="21 37 2D"><unientity>5609</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 2E"><unientity>5614</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 2F"><unientity>560E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 30"><unientity>5617</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 31"><unientity>560D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 32"><unientity>562E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 33"><unientity>562F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 34"><unientity>564E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 35"><unientity>5636</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 36"><unientity>5632</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 37"><unientity>563B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 38"><unientity>5639</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 39"><unientity>5657</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 3B"><unientity>5653</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 3C"><unientity>563F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 3D"><unientity>5634</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 3E"><unientity>5637</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 3F"><unientity>5659</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 40"><unientity>5630</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 41"><unientity>566B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 42"><unientity>5664</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 43"><unientity>5669</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 44"><unientity>5678</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 45"><unientity>5674</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 46"><unientity>5679</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 47"><unientity>5665</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 48"><unientity>566A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 49"><unientity>5668</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 4A"><unientity>5671</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 4B"><unientity>566F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 4C"><unientity>E933</unientity><unientityalt>5662</unientityalt><desc>Variant of 4B374C which maps to 5662</desc></character>
+<character hex="21 37 4D"><unientity>566C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 4E"><unientity>5680</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 4F"><unientity>568E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 50"><unientity>5685</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 51"><unientity>5687</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 52"><unientity>5690</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 53"><unientity>568F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 54"><unientity>5695</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 55"><unientity>E934</unientity><unientityalt>56AE</unientityalt><desc>Variant of 453755 which maps to 56AE</desc></character>
+<character hex="21 37 56"><unientity>56A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 57"><unientity>56B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 58"><unientity>56A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 59"><unientity>56B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5A"><unientity>56B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5B"><unientity>56B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5C"><unientity>56C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5D"><unientity>56C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5E"><unientity>56C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 5F"><unientity>56BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 60"><unientity>56CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 61"><unientity>56C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 62"><unientity>56C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 64"><unientity>56D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 65"><unientity>56DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 66"><unientity>56DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 67"><unientity>56E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 68"><unientity>56DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 69"><unientity>56E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 6B"><unientity>56F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 6C"><unientity>56FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 6D"><unientity>5703</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 6E"><unientity>5708</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 6F"><unientity>570B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 70"><unientity>570D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 71"><unientity>5712</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 72"><unientity>5713</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 73"><unientity>5718</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 74"><unientity>5716</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 75"><unientity>571F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 77"><unientity>572D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 78"><unientity>572F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 79"><unientity>5730</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 7A"><unientity>5728</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 7B"><unientity>5733</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 7C"><unientity>5751</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 37 7D"><unientity>574A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 21"><unientity>5740</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 22"><unientity>5747</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 23"><unientity>574D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 24"><unientity>573E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 25"><unientity>574E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 27"><unientity>5783</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 28"><unientity>576A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 29"><unientity>5769</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2A"><unientity>5777</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2B"><unientity>5761</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2C"><unientity>5764</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2D"><unientity>5766</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2E"><unientity>5782</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 2F"><unientity>577C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 30"><unientity>57A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 31"><unientity>578B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 32"><unientity>57A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 33"><unientity>57AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 34"><unientity>57A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 35"><unientity>57D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 36"><unientity>57C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 37"><unientity>57CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 38"><unientity>57CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 39"><unientity>57C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3A"><unientity>57F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3B"><unientity>57F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3C"><unientity>57FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3D"><unientity>57DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3E"><unientity>580A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 3F"><unientity>5805</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 40"><unientity>5802</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 41"><unientity>5806</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 42"><unientity>57E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 43"><unientity>57E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 44"><unientity>5831</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 45"><unientity>582F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 46"><unientity>5835</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 47"><unientity>582A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 48"><unientity>5830</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 49"><unientity>5824</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4A"><unientity>5834</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4B"><unientity>5821</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4C"><unientity>585E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4D"><unientity>5857</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4E"><unientity>5858</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 4F"><unientity>5851</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 50"><unientity>586B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 51"><unientity>584C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 52"><unientity>585A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 53"><unientity>586D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 54"><unientity>5854</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 55"><unientity>5862</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 56"><unientity>584A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 57"><unientity>5883</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 58"><unientity>587E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 59"><unientity>5875</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5A"><unientity>588A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5B"><unientity>5879</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5C"><unientity>5885</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5D"><unientity>5893</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5E"><unientity>589E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 5F"><unientity>5880</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 60"><unientity>58B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 61"><unientity>589C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 62"><unientity>58AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 63"><unientity>589F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 64"><unientity>E935</unientity><unientityalt>58C7</unientityalt><desc>Variant of 4B3864 which maps to 58C7</desc></character>
+<character hex="21 38 65"><unientity>58C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 66"><unientity>58C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 67"><unientity>58BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 68"><unientity>58D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 69"><unientity>58D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6A"><unientity>58D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6B"><unientity>58D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6C"><unientity>58D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6D"><unientity>58DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6E"><unientity>58DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 6F"><unientity>58E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 70"><unientity>58E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 71"><unientity>58E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 72"><unientity>58EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 73"><unientity>58EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 74"><unientity>58EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 76"><unientity>58FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 77"><unientity>58FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 78"><unientity>590F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 79"><unientity>5914</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 7A"><unientity>5915</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 7B"><unientity>5916</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 7C"><unientity>5919</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 7D"><unientity>591A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 38 7E"><unientity>591C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 21"><unientity>5920</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 22"><unientity>5924</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 23"><unientity>5925</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 24"><unientity>5922</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 25"><unientity>5927</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 26"><unientity>592A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 27"><unientity>592B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 28"><unientity>5929</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 29"><unientity>592D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 2A"><unientity>592E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 2B"><unientity>5931</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 2C"><unientity>5937</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 2E"><unientity>593E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 2F"><unientity>5954</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 30"><unientity>5949</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 31"><unientity>5948</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 32"><unientity>5947</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 33"><unientity>5944</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 34"><unientity>5955</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 35"><unientity>5951</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 36"><unientity>594E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 37"><unientity>594F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 38"><unientity>5950</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 39"><unientity>5957</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3A"><unientity>5958</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3B"><unientity>595A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3C"><unientity>5960</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3D"><unientity>5962</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3E"><unientity>5967</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 3F"><unientity>5969</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 40"><unientity>596A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 41"><unientity>596E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 42"><unientity>5973</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 43"><unientity>5974</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 44"><unientity>5976</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 45"><unientity>5984</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 46"><unientity>5983</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 47"><unientity>5978</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 48"><unientity>597D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 49"><unientity>5979</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 4A"><unientity>5982</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 4B"><unientity>5981</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 4C"><unientity>59A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 4D"><unientity>5992</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 4F"><unientity>59A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 50"><unientity>59A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 51"><unientity>5993</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 52"><unientity>599E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 53"><unientity>599D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 54"><unientity>5999</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 55"><unientity>59A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 56"><unientity>598A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 57"><unientity>5996</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 58"><unientity>59BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 59"><unientity>59BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5A"><unientity>59AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5B"><unientity>59D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5C"><unientity>59B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5D"><unientity>59C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5E"><unientity>59D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 5F"><unientity>59D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 60"><unientity>59AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 61"><unientity>59D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 62"><unientity>59D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 63"><unientity>59CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 65"><unientity>59CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 66"><unientity>59D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 67"><unientity>59E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 69"><unientity>59FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6A"><unientity>59D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6B"><unientity>5A03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6C"><unientity>59E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6D"><unientity>59E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6E"><unientity>59EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 6F"><unientity>5A01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 70"><unientity>59FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 71"><unientity>59E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 72"><unientity>59DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 73"><unientity>5A11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 74"><unientity>5A18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 75"><unientity>5A23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 76"><unientity>5A1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 77"><unientity>5A13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 78"><unientity>59EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 79"><unientity>5A20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 7A"><unientity>5A1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 7B"><unientity>5A1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 7C"><unientity>5A0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 7D"><unientity>5A29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 39 7E"><unientity>5A25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 21"><unientity>5A46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 22"><unientity>5A49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 23"><unientity>5A6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 24"><unientity>5A36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 25"><unientity>5A4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 26"><unientity>5A40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 27"><unientity>5A66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 28"><unientity>5A41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 29"><unientity>5A3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2A"><unientity>5A62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2B"><unientity>5A5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2C"><unientity>5A77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2D"><unientity>5A9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2E"><unientity>5A92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 2F"><unientity>5A7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 30"><unientity>5ABC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 31"><unientity>5A9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 32"><unientity>5ACC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 33"><unientity>5AC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 34"><unientity>5AC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 35"><unientity>5ABE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 36"><unientity>5ABD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 37"><unientity>5AB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 38"><unientity>5AC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 39"><unientity>5AB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3A"><unientity>5AE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3B"><unientity>5AD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3C"><unientity>5AD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3D"><unientity>5AE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3E"><unientity>5AE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 3F"><unientity>5AD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 40"><unientity>5AE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 41"><unientity>5AFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 42"><unientity>5B09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 43"><unientity>5B0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 44"><unientity>5B0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 45"><unientity>5AF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 46"><unientity>5B34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 47"><unientity>5B1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 48"><unientity>5B2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 49"><unientity>5B24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4A"><unientity>5B30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4B"><unientity>5B38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4C"><unientity>5B40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4D"><unientity>5B50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4E"><unientity>5B51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 4F"><unientity>5B53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 50"><unientity>5B54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 51"><unientity>5B55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 52"><unientity>5B57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 53"><unientity>5B58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 54"><unientity>5B5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 55"><unientity>5B5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 57"><unientity>5B5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 58"><unientity>5B63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 59"><unientity>5B64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5A"><unientity>5B69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5B"><unientity>5B6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5C"><unientity>5B70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5D"><unientity>5B73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5E"><unientity>5B71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 5F"><unientity>5B75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 60"><unientity>5B78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 61"><unientity>5B7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 62"><unientity>5B7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 63"><unientity>5B7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 65"><unientity>5B87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 66"><unientity>5B88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 67"><unientity>5B89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 68"><unientity>5B85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 69"><unientity>5B8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6A"><unientity>5B8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6B"><unientity>5B8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6C"><unientity>5B97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6D"><unientity>5B9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6E"><unientity>5B9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 6F"><unientity>5B98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 70"><unientity>5B99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 71"><unientity>5B9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 72"><unientity>5BA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 73"><unientity>5BA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 74"><unientity>5BA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 75"><unientity>5BA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 76"><unientity>5BA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 77"><unientity>5BB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 78"><unientity>5BB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 7A"><unientity>5BB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 7B"><unientity>5BB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 7C"><unientity>5BAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 7D"><unientity>5BB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3A 7E"><unientity>5BB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 21"><unientity>5BC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 22"><unientity>5BC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 23"><unientity>5BC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 24"><unientity>5BC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 25"><unientity>5BC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 26"><unientity>5BBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 27"><unientity>5BCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 28"><unientity>5BD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 29"><unientity>5BD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2A"><unientity>5BD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2B"><unientity>5BE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2C"><unientity>5BE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2D"><unientity>5BE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2E"><unientity>5BE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 2F"><unientity>5BE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 30"><unientity>5BDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 31"><unientity>5BE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 32"><unientity>5BE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 33"><unientity>5BDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 34"><unientity>5BEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 35"><unientity>5BEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 36"><unientity>5BE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 37"><unientity>5BEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 38"><unientity>5BF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 39"><unientity>5BF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3A"><unientity>5BF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3B"><unientity>5BFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3C"><unientity>5C01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3D"><unientity>5C04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3E"><unientity>5C09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 3F"><unientity>5C08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 40"><unientity>5C07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 41"><unientity>5C0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 42"><unientity>5C0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 43"><unientity>5C0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 44"><unientity>5C0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 45"><unientity>5C0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 46"><unientity>5C11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 47"><unientity>5C16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 48"><unientity>5C1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 49"><unientity>5C24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4A"><unientity>5C2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4B"><unientity>5C31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4C"><unientity>5C37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4D"><unientity>5C38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4E"><unientity>5C3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 4F"><unientity>5C3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 50"><unientity>5C40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 51"><unientity>5C41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 52"><unientity>5C3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 53"><unientity>5C3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 54"><unientity>5C46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 55"><unientity>5C45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 56"><unientity>5C48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 57"><unientity>5C4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 58"><unientity>5C4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 59"><unientity>5C4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 5A"><unientity>5C55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 5B"><unientity>5C51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 5C"><unientity>5C50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 5D"><unientity>E9E1</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 3B 5E"><unientity>5C60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 5F"><unientity>5C5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 60"><unientity>5C62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 61"><unientity>E936</unientity><unientityalt>5C64</unientityalt><desc>Variant of 4B3B61 which maps to 5C64</desc></character>
+<character hex="21 3B 62"><unientity>5C65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 63"><unientity>5C6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 64"><unientity>5C6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 65"><unientity>5C71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 66"><unientity>5C79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 67"><unientity>5C90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 68"><unientity>5C8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 69"><unientity>5C91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 6A"><unientity>5C94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 6B"><unientity>5CB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 6C"><unientity>5CB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 6E"><unientity>5CA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 6F"><unientity>5CAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 71"><unientity>5CB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 72"><unientity>5CD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 73"><unientity>5D01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 74"><unientity>5CFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 75"><unientity>5CED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 76"><unientity>5CFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 77"><unientity>5CE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 78"><unientity>5CF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 79"><unientity>5CF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 7A"><unientity>5CEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 7B"><unientity>5D07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 7C"><unientity>5D06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 7D"><unientity>5D1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3B 7E"><unientity>5D16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 21"><unientity>5D0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 22"><unientity>5D11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 23"><unientity>5D22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 24"><unientity>5D29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 25"><unientity>5D14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 26"><unientity>5D19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 27"><unientity>5D4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 28"><unientity>5D50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 29"><unientity>5D69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2A"><unientity>5D84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2B"><unientity>5D87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2C"><unientity>5D9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2D"><unientity>5DBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2E"><unientity>5DBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 2F"><unientity>E937</unientity><unientityalt>5DBA</unientityalt><desc>Variant of 4B3C2F which maps to 5DBA</desc></character>
+<character hex="21 3C 30"><unientity>5DCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 31"><unientity>5DD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 32"><unientity>5DD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 33"><unientity>5DD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 34"><unientity>5DDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 35"><unientity>5DDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 36"><unientity>5DE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 37"><unientity>5DE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 38"><unientity>5DE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 39"><unientity>5DE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3A"><unientity>5DE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3B"><unientity>5DEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3C"><unientity>5DEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3D"><unientity>5DF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3E"><unientity>5DF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 3F"><unientity>5DF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 40"><unientity>5DF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 41"><unientity>5DF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 42"><unientity>5DFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 43"><unientity>5DFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 44"><unientity>5E02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 46"><unientity>5E06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 49"><unientity>5E1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4A"><unientity>5E16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4B"><unientity>5E15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4C"><unientity>5E1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4D"><unientity>5E11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4E"><unientity>5E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 4F"><unientity>5E25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 51"><unientity>5E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 52"><unientity>5E33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 53"><unientity>5E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 54"><unientity>5E38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 55"><unientity>5E37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 56"><unientity>5E45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 57"><unientity>5E3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 58"><unientity>5E40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 59"><unientity>5E4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5A"><unientity>5E5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5B"><unientity>5E54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5C"><unientity>5E57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5D"><unientity>5E55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5E"><unientity>5E63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 5F"><unientity>5E62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 60"><unientity>5E5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 61"><unientity>5E6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 63"><unientity>5E73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 65"><unientity>5E74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 68"><unientity>5E7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 69"><unientity>5E7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6A"><unientity>5E7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6B"><unientity>5E7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6C"><unientity>5E8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6D"><unientity>5E87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6E"><unientity>5E8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 6F"><unientity>5E9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 70"><unientity>5E97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 71"><unientity>5E96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 72"><unientity>5E9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 73"><unientity>5E95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 74"><unientity>5EA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 75"><unientity>5EA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 76"><unientity>5EAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 77"><unientity>5EA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 78"><unientity>5EAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 79"><unientity>5EB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 7A"><unientity>5EB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 7B"><unientity>5EB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 7C"><unientity>5EB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 7D"><unientity>5EC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3C 7E"><unientity>5EC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 21"><unientity>5EBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 22"><unientity>5ECA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 23"><unientity>5EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 24"><unientity>5EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 25"><unientity>5ED3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 26"><unientity>5ED6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 27"><unientity>5EE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 28"><unientity>5EDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 29"><unientity>5EDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 2A"><unientity>E938</unientity><unientityalt>5EE3</unientityalt><desc>Variant of 4B3D2A which maps to 5EE3</desc></character>
+<character hex="21 3D 2B"><unientity>5EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 2C"><unientity>5EE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 2D"><unientity>9F90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 2E"><unientity>5EEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 2F"><unientity>5EF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 30"><unientity>5EF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 32"><unientity>5EF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 33"><unientity>5EFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 34"><unientity>5EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 36"><unientity>5F04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 37"><unientity>5F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 38"><unientity>5F0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 39"><unientity>5F0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3A"><unientity>5F12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3B"><unientity>5F13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3C"><unientity>5F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3D"><unientity>5F14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3E"><unientity>5F18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 3F"><unientity>5F17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 40"><unientity>5F1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 41"><unientity>5F1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 42"><unientity>5F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 43"><unientity>5F27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 44"><unientity>5F29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 45"><unientity>5F2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 46"><unientity>5F31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 47"><unientity>5F35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 48"><unientity>5F37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 49"><unientity>5F3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4A"><unientity>5F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4B"><unientity>5F48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4C"><unientity>5F4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4D"><unientity>5F4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4E"><unientity>5F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 4F"><unientity>5F59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 50"><unientity>5F5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 51"><unientity>5F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 52"><unientity>5F64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 53"><unientity>5F65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 54"><unientity>5F6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 55"><unientity>5F69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 57"><unientity>5F6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 58"><unientity>5F70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 59"><unientity>5F71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 5B"><unientity>5F79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 5C"><unientity>5F80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 5E"><unientity>5F7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 5F"><unientity>5F7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 60"><unientity>5F85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 61"><unientity>5F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 62"><unientity>5F8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 63"><unientity>5F8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 64"><unientity>5F87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 65"><unientity>5F8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 66"><unientity>5F92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 67"><unientity>5F91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 68"><unientity>5F90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 69"><unientity>5F98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 6A"><unientity>5F97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 6B"><unientity>5F99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 6C"><unientity>5F9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 6F"><unientity>5FA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 71"><unientity>5FAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 72"><unientity>5FAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 73"><unientity>5FAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 74"><unientity>5FB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 75"><unientity>5FB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 76"><unientity>5FB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 77"><unientity>5FBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 78"><unientity>5FC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 79"><unientity>5FC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 7A"><unientity>5FD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 7B"><unientity>5FD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 7C"><unientity>5FCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3D 7D"><unientity>5FD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 21"><unientity>5FCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 22"><unientity>5FEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 23"><unientity>5FE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 24"><unientity>5FF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 25"><unientity>5FFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 26"><unientity>5FDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 27"><unientity>5FF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 28"><unientity>5FFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 29"><unientity>6014</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 2A"><unientity>E939</unientity><unientityalt>6035</unientityalt><desc>Variant of 4B3E2A which maps to 6035</desc></character>
+<character hex="21 3E 2B"><unientity>602A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 2C"><unientity>602F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 2D"><unientity>6016</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 2E"><unientity>601D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 2F"><unientity>600F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 30"><unientity>6021</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 31"><unientity>6020</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 32"><unientity>6028</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 33"><unientity>6025</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 34"><unientity>6027</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 35"><unientity>600E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 36"><unientity>6015</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 37"><unientity>6012</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 38"><unientity>6059</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 39"><unientity>6063</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3A"><unientity>6068</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3B"><unientity>6043</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3C"><unientity>6065</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3D"><unientity>6050</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3E"><unientity>606D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 3F"><unientity>6062</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 40"><unientity>E93A</unientity><unientityalt>6046</unientityalt><desc>Variant of 4B3E40 which maps to 6046</desc></character>
+<character hex="21 3E 41"><unientity>604D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 42"><unientity>606B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 43"><unientity>6069</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 44"><unientity>606C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 45"><unientity>606F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 46"><unientity>606A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 47"><unientity>6064</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 48"><unientity>6070</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 49"><unientity>6055</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4A"><unientity>608C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4B"><unientity>60A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4C"><unientity>607F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4D"><unientity>609F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4E"><unientity>609A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 4F"><unientity>6096</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 50"><unientity>6084</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 51"><unientity>608D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 52"><unientity>60A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 53"><unientity>6089</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 54"><unientity>6094</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 55"><unientity>60A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 56"><unientity>60A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 57"><unientity>60B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 58"><unientity>60E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 59"><unientity>60CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 5B"><unientity>E93B</unientity><unientityalt>60C5</unientityalt><desc>Variant of 4B3E5B which maps to 60C5</desc></character>
+<character hex="21 3E 5C"><unientity>60B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 5D"><unientity>60D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 5E"><unientity>60B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 5F"><unientity>60BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 60"><unientity>60E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 61"><unientity>60E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 62"><unientity>60DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 63"><unientity>60D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 64"><unientity>60D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 65"><unientity>60BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 66"><unientity>60B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 67"><unientity>60C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 68"><unientity>60B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 69"><unientity>60DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6A"><unientity>60DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6B"><unientity>610F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6C"><unientity>611C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6D"><unientity>60F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6E"><unientity>611F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 6F"><unientity>60F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 70"><unientity>60FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 71"><unientity>60FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 72"><unientity>611A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 73"><unientity>6115</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 74"><unientity>60F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 75"><unientity>6123</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 76"><unientity>60F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 77"><unientity>611B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 78"><unientity>610E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 79"><unientity>6100</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 7A"><unientity>6101</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 7B"><unientity>60F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 7C"><unientity>6109</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 7D"><unientity>6108</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3E 7E"><unientity>60F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 21"><unientity>6148</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 22"><unientity>6168</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 24"><unientity>613C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 26"><unientity>614C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 27"><unientity>614D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 28"><unientity>614B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 29"><unientity>613E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2A"><unientity>6127</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2B"><unientity>6134</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2C"><unientity>6147</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2D"><unientity>6177</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2E"><unientity>6176</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 2F"><unientity>6167</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 30"><unientity>6170</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 31"><unientity>615A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 32"><unientity>615D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 33"><unientity>6182</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 34"><unientity>617C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 35"><unientity>6162</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 36"><unientity>616E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 37"><unientity>6155</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 38"><unientity>6158</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 39"><unientity>6163</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3A"><unientity>615F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3B"><unientity>616B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3C"><unientity>617E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3D"><unientity>61A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3E"><unientity>61B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 3F"><unientity>6191</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 40"><unientity>618E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 41"><unientity>61AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 42"><unientity>61A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 43"><unientity>61AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 44"><unientity>619A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 45"><unientity>61A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 46"><unientity>6194</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 47"><unientity>618A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 48"><unientity>61B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 49"><unientity>61CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4A"><unientity>61C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4B"><unientity>6190</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4C"><unientity>61BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4D"><unientity>61C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4E"><unientity>61C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 4F"><unientity>61C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 50"><unientity>61CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 51"><unientity>61E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 52"><unientity>61E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 53"><unientity>E93C</unientity><unientityalt>61F2</unientityalt><desc>Variant of 4B3F53 which maps to 61F2</desc></character>
+<character hex="21 3F 54"><unientity>61F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 55"><unientity>61F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 56"><unientity>61F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 57"><unientity>61F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 58"><unientity>61FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 59"><unientity>61FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5A"><unientity>61FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5B"><unientity>61FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5C"><unientity>6200</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5D"><unientity>6208</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5E"><unientity>620A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 5F"><unientity>620E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 60"><unientity>620D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 61"><unientity>620C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 62"><unientity>6210</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 63"><unientity>6212</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 64"><unientity>6211</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 65"><unientity>6216</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 66"><unientity>6215</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 67"><unientity>621B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 68"><unientity>621A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 69"><unientity>621F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6A"><unientity>6221</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6B"><unientity>6222</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6C"><unientity>622A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6D"><unientity>622E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6E"><unientity>6230</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 6F"><unientity>6232</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 70"><unientity>6234</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 71"><unientity>6233</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 72"><unientity>6236</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 73"><unientity>623F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 74"><unientity>623E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 75"><unientity>6240</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 76"><unientity>6241</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 78"><unientity>6248</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 79"><unientity>6249</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 7A"><unientity>624B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 7D"><unientity>6253</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 3F 7E"><unientity>6254</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 21"><unientity>6252</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 22"><unientity>625B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 23"><unientity>6263</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 24"><unientity>6258</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 25"><unientity>6296</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 26"><unientity>6297</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 27"><unientity>6292</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 28"><unientity>6276</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 29"><unientity>6289</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2A"><unientity>627F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2B"><unientity>6279</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2C"><unientity>6280</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2D"><unientity>628A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2E"><unientity>626D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 2F"><unientity>627C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 30"><unientity>627E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 31"><unientity>626F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 32"><unientity>6284</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 33"><unientity>6295</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 34"><unientity>6291</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 35"><unientity>6298</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 36"><unientity>626E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 37"><unientity>6273</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 38"><unientity>6293</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 39"><unientity>62C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3A"><unientity>62C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3B"><unientity>62CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3C"><unientity>62A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3D"><unientity>62DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3E"><unientity>62BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 3F"><unientity>62C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 40"><unientity>62B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 41"><unientity>62D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 42"><unientity>62D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 43"><unientity>62DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 44"><unientity>62AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 45"><unientity>62CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 46"><unientity>62D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 47"><unientity>62BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 48"><unientity>62BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 49"><unientity>E93D</unientity><unientityalt>62D0</unientityalt><desc>Variant of 4B4049 which maps to 62D0</desc></character>
+<character hex="21 40 4A"><unientity>62C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 4B"><unientity>62D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 4C"><unientity>62DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 4D"><unientity>62AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 4E"><unientity>62C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 4F"><unientity>62B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 50"><unientity>62D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 51"><unientity>62D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 52"><unientity>62CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 53"><unientity>62B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 54"><unientity>62CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 55"><unientity>62D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 56"><unientity>62C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 57"><unientity>6309</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 58"><unientity>6316</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 59"><unientity>62FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5A"><unientity>62F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5B"><unientity>6308</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5C"><unientity>62ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5D"><unientity>6301</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5E"><unientity>62EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 5F"><unientity>62EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 60"><unientity>62F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 61"><unientity>6307</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 62"><unientity>62F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 63"><unientity>62FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 64"><unientity>6311</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 65"><unientity>62EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 66"><unientity>E93E</unientity><unientityalt>62F4</unientityalt><desc>Variant of 4B4066 which maps to 62F4</desc></character>
+<character hex="21 40 67"><unientity>62FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 69"><unientity>6342</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6A"><unientity>632A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6B"><unientity>6355</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6C"><unientity>633E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6D"><unientity>632F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6E"><unientity>634E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 6F"><unientity>634F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 70"><unientity>6350</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 71"><unientity>6349</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 73"><unientity>632B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 74"><unientity>6328</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 75"><unientity>633A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 76"><unientity>63A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 77"><unientity>6369</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 78"><unientity>63A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 79"><unientity>6396</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 7A"><unientity>63A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 7B"><unientity>6372</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 7C"><unientity>6377</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 7D"><unientity>6383</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 40 7E"><unientity>636B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 21"><unientity>6367</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 22"><unientity>6398</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 23"><unientity>639B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 24"><unientity>63AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 25"><unientity>6371</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 26"><unientity>63A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 27"><unientity>638C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 28"><unientity>6389</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 29"><unientity>63A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2A"><unientity>6399</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2B"><unientity>63A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2C"><unientity>6388</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2D"><unientity>63AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2E"><unientity>633D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 2F"><unientity>6392</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 30"><unientity>63A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 31"><unientity>6376</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 32"><unientity>638F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 33"><unientity>63A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 34"><unientity>637B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 35"><unientity>E93F</unientity><unientityalt>6368</unientityalt><desc>Variant of 4B4135 which maps to 6368</desc></character>
+<character hex="21 41 36"><unientity>6384</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 37"><unientity>6380</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 38"><unientity>63C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 39"><unientity>63C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3A"><unientity>63CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3B"><unientity>63E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3C"><unientity>63C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3D"><unientity>63E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3E"><unientity>63D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 3F"><unientity>63DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 40"><unientity>63D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 41"><unientity>63ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 42"><unientity>63EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 43"><unientity>63CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 44"><unientity>63E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 45"><unientity>63F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 46"><unientity>E940</unientity><unientityalt>63DB</unientityalt><desc>Variant of 454146 which maps to 63DB</desc></character>
+<character hex="21 41 47"><unientity>63D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 48"><unientity>63EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 49"><unientity>641E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4A"><unientity>642A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4B"><unientity>643E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4C"><unientity>6413</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4D"><unientity>640F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4E"><unientity>6414</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 4F"><unientity>640D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 50"><unientity>642D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 51"><unientity>643D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 52"><unientity>6416</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 53"><unientity>6417</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 54"><unientity>641C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 55"><unientity>6436</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 56"><unientity>642C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 57"><unientity>6458</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 58"><unientity>6469</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 59"><unientity>6454</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5A"><unientity>6452</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5B"><unientity>646F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5C"><unientity>6478</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5D"><unientity>6479</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5E"><unientity>647A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 5F"><unientity>645F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 60"><unientity>6451</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 61"><unientity>6467</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 62"><unientity>649E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 63"><unientity>64A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 64"><unientity>6487</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 65"><unientity>6488</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 66"><unientity>64A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 67"><unientity>64B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 68"><unientity>6493</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 69"><unientity>6495</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6A"><unientity>6492</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6B"><unientity>64A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6C"><unientity>6491</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6D"><unientity>64AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6E"><unientity>64B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 6F"><unientity>64AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 70"><unientity>649A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 71"><unientity>64AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 72"><unientity>64AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 73"><unientity>64C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 74"><unientity>64C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 75"><unientity>64D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 76"><unientity>64CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 77"><unientity>64BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 78"><unientity>64C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 79"><unientity>64BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 7A"><unientity>64CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 7B"><unientity>64CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 7C"><unientity>64DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 7D"><unientity>64C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 41 7E"><unientity>64C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 21"><unientity>64CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 22"><unientity>64D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 23"><unientity>64D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 24"><unientity>64BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 25"><unientity>64E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 26"><unientity>64F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 27"><unientity>64E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 28"><unientity>64EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 29"><unientity>64F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2A"><unientity>64F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2B"><unientity>64F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2C"><unientity>6506</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2D"><unientity>6500</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2E"><unientity>64FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 2F"><unientity>64FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 30"><unientity>64FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 31"><unientity>650F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 32"><unientity>6518</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 33"><unientity>6514</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 34"><unientity>6519</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 35"><unientity>651D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 36"><unientity>651C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 37"><unientity>6523</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 38"><unientity>6524</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 39"><unientity>652B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3A"><unientity>652A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3B"><unientity>652C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3C"><unientity>652F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3D"><unientity>6536</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3E"><unientity>6539</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 3F"><unientity>653B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 40"><unientity>653E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 41"><unientity>653F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 42"><unientity>6545</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 43"><unientity>6548</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 44"><unientity>654E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 45"><unientity>6556</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 46"><unientity>6551</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 47"><unientity>6557</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 48"><unientity>655D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 49"><unientity>6558</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4A"><unientity>654F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4B"><unientity>6566</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4C"><unientity>6562</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4D"><unientity>6563</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4E"><unientity>655E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 4F"><unientity>5553</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 50"><unientity>656C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 51"><unientity>6572</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 52"><unientity>6575</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 53"><unientity>6577</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 54"><unientity>6578</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 55"><unientity>6574</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 56"><unientity>6582</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 57"><unientity>6583</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 58"><unientity>6587</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 59"><unientity>6591</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 5A"><unientity>6590</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 5C"><unientity>6599</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 5D"><unientity>659C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 5E"><unientity>659F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 5F"><unientity>65A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 60"><unientity>65A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 61"><unientity>65A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 62"><unientity>65A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 63"><unientity>65AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 64"><unientity>65AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 65"><unientity>65B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 66"><unientity>65B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 67"><unientity>65B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 69"><unientity>65BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6A"><unientity>65C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6B"><unientity>65C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6C"><unientity>65CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6D"><unientity>65CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6E"><unientity>65CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 6F"><unientity>65CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 70"><unientity>65D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 71"><unientity>65D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 72"><unientity>65E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 73"><unientity>65E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 75"><unientity>65E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 76"><unientity>65EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 77"><unientity>65ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 78"><unientity>65E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 79"><unientity>65F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 7A"><unientity>65FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 7B"><unientity>6606</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 7C"><unientity>6614</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 7D"><unientity>660C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 42 7E"><unientity>6600</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 21"><unientity>660E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 22"><unientity>6613</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 23"><unientity>6602</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 24"><unientity>660F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 25"><unientity>6625</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 26"><unientity>6627</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 27"><unientity>662F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 28"><unientity>662D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 29"><unientity>6620</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2A"><unientity>661F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2B"><unientity>6628</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2C"><unientity>664F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2D"><unientity>6642</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2E"><unientity>6652</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 2F"><unientity>6649</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 30"><unientity>6643</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 31"><unientity>664C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 32"><unientity>665D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 33"><unientity>6664</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 34"><unientity>6668</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 35"><unientity>6666</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 36"><unientity>665A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 37"><unientity>666F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 38"><unientity>666E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 39"><unientity>FA12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3A"><unientity>6691</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3B"><unientity>6670</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3C"><unientity>6676</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3D"><unientity>667A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3E"><unientity>6697</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 3F"><unientity>6687</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 40"><unientity>6689</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 41"><unientity>6688</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 42"><unientity>6696</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 43"><unientity>66A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 44"><unientity>66AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 45"><unientity>66B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 46"><unientity>66AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 47"><unientity>66C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 48"><unientity>66C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 49"><unientity>66C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4A"><unientity>66B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4B"><unientity>66D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4C"><unientity>66D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4D"><unientity>66E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4E"><unientity>66DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 4F"><unientity>66E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 50"><unientity>66F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 51"><unientity>66F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 52"><unientity>66F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 53"><unientity>66F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 54"><unientity>66F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 55"><unientity>66F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 56"><unientity>66F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 57"><unientity>52D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 58"><unientity>66FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 59"><unientity>66FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5A"><unientity>6703</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5B"><unientity>6708</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5C"><unientity>6709</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5D"><unientity>670D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5E"><unientity>670B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 5F"><unientity>6717</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 60"><unientity>6715</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 61"><unientity>6714</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 62"><unientity>671B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 63"><unientity>671D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 64"><unientity>671F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 66"><unientity>6727</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 67"><unientity>6728</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 69"><unientity>672C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 6A"><unientity>672B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 6B"><unientity>672A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 6D"><unientity>673D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 6F"><unientity>6731</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 70"><unientity>6735</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 71"><unientity>675E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 72"><unientity>6751</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 73"><unientity>674E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 74"><unientity>675C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 75"><unientity>6750</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 76"><unientity>6756</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 77"><unientity>675F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 78"><unientity>674F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 79"><unientity>6749</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 7B"><unientity>676D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 7C"><unientity>678B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 7D"><unientity>6795</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 43 7E"><unientity>6789</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 21"><unientity>6787</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 22"><unientity>6777</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 23"><unientity>679D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 24"><unientity>6797</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 25"><unientity>676F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 26"><unientity>6771</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 27"><unientity>6773</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 28"><unientity>679C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 29"><unientity>6775</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 2A"><unientity>679A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 2B"><unientity>6790</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 2D"><unientity>677E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 2E"><unientity>67D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 2F"><unientity>67F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 30"><unientity>67FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 31"><unientity>67D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 32"><unientity>67C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 33"><unientity>67AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 34"><unientity>67D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 35"><unientity>67D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 36"><unientity>67EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 37"><unientity>67E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 38"><unientity>67B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 39"><unientity>67EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3A"><unientity>67E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3B"><unientity>67FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3C"><unientity>67DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3D"><unientity>6805</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3E"><unientity>67DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 3F"><unientity>67B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 40"><unientity>67CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 41"><unientity>67F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 42"><unientity>6848</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 43"><unientity>6821</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 44"><unientity>6838</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 45"><unientity>6853</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 46"><unientity>6846</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 47"><unientity>6842</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 48"><unientity>6854</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 49"><unientity>6817</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 4A"><unientity>683D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 4B"><unientity>6851</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 4C"><unientity>6829</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 4D"><unientity>6850</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 4E"><unientity>6839</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 50"><unientity>67F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 51"><unientity>6843</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 52"><unientity>6840</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 53"><unientity>682A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 54"><unientity>6845</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 55"><unientity>683C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 56"><unientity>E941</unientity><unientityalt>6813</unientityalt><desc>Variant of 4B4456 which maps to 6813</desc></character>
+<character hex="21 44 57"><unientity>6881</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 58"><unientity>6893</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 59"><unientity>68AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5A"><unientity>6876</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5B"><unientity>68B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5C"><unientity>68A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5D"><unientity>6897</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5E"><unientity>68B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 5F"><unientity>68B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 60"><unientity>68A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 61"><unientity>687F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 62"><unientity>68B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 63"><unientity>689D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 64"><unientity>68AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 65"><unientity>6886</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 66"><unientity>6885</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 67"><unientity>68A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 68"><unientity>689F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 69"><unientity>6894</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6A"><unientity>6883</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6B"><unientity>68D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6C"><unientity>68FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6D"><unientity>68C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6E"><unientity>68F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 6F"><unientity>68D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 70"><unientity>68E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 71"><unientity>68DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 72"><unientity>68CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 73"><unientity>68EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 74"><unientity>690D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 75"><unientity>6905</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 76"><unientity>68E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 77"><unientity>68E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 78"><unientity>68F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 79"><unientity>68CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 7A"><unientity>68D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 7B"><unientity>68D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 7C"><unientity>6912</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 7D"><unientity>68F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 44 7E"><unientity>68DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 21"><unientity>690E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 22"><unientity>68C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 23"><unientity>6954</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 24"><unientity>6930</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 25"><unientity>6977</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 26"><unientity>6975</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 27"><unientity>695A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 28"><unientity>6960</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 29"><unientity>696B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2A"><unientity>694A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2B"><unientity>6968</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2C"><unientity>695E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2D"><unientity>696D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2E"><unientity>6979</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 2F"><unientity>6953</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 30"><unientity>6986</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 31"><unientity>69A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 32"><unientity>6995</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 33"><unientity>699C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 34"><unientity>6994</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 35"><unientity>69C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 36"><unientity>69B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 37"><unientity>69AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 38"><unientity>699B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 39"><unientity>69CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3A"><unientity>69D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3B"><unientity>69BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3C"><unientity>69AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3D"><unientity>69CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3E"><unientity>69AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 3F"><unientity>69D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 40"><unientity>69CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 41"><unientity>69B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 42"><unientity>6A1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 43"><unientity>69E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 44"><unientity>6A23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 45"><unientity>69EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 46"><unientity>6A01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 47"><unientity>6A19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 48"><unientity>69FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 49"><unientity>6A1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4A"><unientity>6A13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4B"><unientity>6A21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4C"><unientity>69F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4D"><unientity>6A0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4E"><unientity>6A02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 4F"><unientity>6A05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 50"><unientity>6A3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 51"><unientity>6A58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 52"><unientity>6A59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 53"><unientity>6A62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 54"><unientity>6A44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 55"><unientity>6A39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 56"><unientity>6A6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 57"><unientity>6A3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 58"><unientity>6A38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 59"><unientity>6A47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5A"><unientity>6A61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5B"><unientity>6A4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5C"><unientity>6A35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5D"><unientity>6A5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5E"><unientity>6A80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 5F"><unientity>6A94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 60"><unientity>6A84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 61"><unientity>6AA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 62"><unientity>6A9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 63"><unientity>6AB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 64"><unientity>6AB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 65"><unientity>6AC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 66"><unientity>6ABB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 68"><unientity>6AAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 69"><unientity>6AE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6A"><unientity>6ADA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6B"><unientity>6ADD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6C"><unientity>6ADB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6D"><unientity>6AD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6E"><unientity>6B04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 6F"><unientity>6AFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 70"><unientity>6B0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 71"><unientity>6B16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 73"><unientity>6B21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 74"><unientity>6B23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 76"><unientity>6B3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 77"><unientity>6B3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 78"><unientity>6B3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 79"><unientity>6B47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 7A"><unientity>6B49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 7B"><unientity>6B4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 7C"><unientity>6B50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 7D"><unientity>6B59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 45 7E"><unientity>6B5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 21"><unientity>6B61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 23"><unientity>6B63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 24"><unientity>6B64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 25"><unientity>6B65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 27"><unientity>6B66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 28"><unientity>6B6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 29"><unientity>6B72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2A"><unientity>6B77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2B"><unientity>6B78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2C"><unientity>6B79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2D"><unientity>6B7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2E"><unientity>6B7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 2F"><unientity>6B83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 30"><unientity>6B86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 31"><unientity>6B8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 32"><unientity>6B89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 33"><unientity>6B98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 34"><unientity>6B96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 35"><unientity>6BA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 36"><unientity>6BAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 37"><unientity>6BAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 38"><unientity>6BB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 39"><unientity>6BB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3A"><unientity>6BB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3B"><unientity>6BBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3C"><unientity>6BBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3D"><unientity>6BC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3E"><unientity>6BBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 3F"><unientity>6BC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 40"><unientity>6BC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 41"><unientity>6BCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 42"><unientity>6BCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 43"><unientity>6BCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 44"><unientity>6BD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 46"><unientity>6BD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 47"><unientity>6BD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 48"><unientity>6BDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 49"><unientity>6BEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4A"><unientity>6BEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4B"><unientity>6BFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4C"><unientity>6C0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4D"><unientity>6C11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4E"><unientity>6C10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 4F"><unientity>6C13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 50"><unientity>6C16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 51"><unientity>6C1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 52"><unientity>6C1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 53"><unientity>6C27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 54"><unientity>6C26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 55"><unientity>6C23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 56"><unientity>6C28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 57"><unientity>6C24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 58"><unientity>6C2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 59"><unientity>6C2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 5A"><unientity>6C33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 5B"><unientity>E942</unientity><unientityalt>6C2F</unientityalt><desc>Variant of 45465B which maps to 6C2F</desc></character>
+<character hex="21 46 5C"><unientity>6C34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 5D"><unientity>6C38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 5E"><unientity>6C41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 60"><unientity>6C40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 61"><unientity>6C42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 62"><unientity>6C5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 63"><unientity>6C57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 64"><unientity>6C5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 65"><unientity>6C59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 66"><unientity>6C60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 67"><unientity>6C55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 68"><unientity>6C50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 69"><unientity>6C5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 6A"><unientity>6C9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 6B"><unientity>6C81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 6D"><unientity>6C7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 6E"><unientity>6C6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 6F"><unientity>6C8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 70"><unientity>6C90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 71"><unientity>6C72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 72"><unientity>6C70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 73"><unientity>6C68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 74"><unientity>6C96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 76"><unientity>E943</unientity><unientityalt>6C89</unientityalt><desc>Variant of 4B4676 which maps to 6C89</desc></character>
+<character hex="21 46 77"><unientity>6C99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 78"><unientity>6C7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 79"><unientity>6C7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 7A"><unientity>6C92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 7B"><unientity>6C83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 7C"><unientity>6CB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 46 7E"><unientity>6CF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 21"><unientity>6CE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 22"><unientity>6CF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 23"><unientity>6CB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 24"><unientity>6CD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 25"><unientity>6CAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 26"><unientity>6CE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 27"><unientity>6CBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 28"><unientity>6CB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 29"><unientity>6CC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2A"><unientity>6CD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2B"><unientity>6CE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2C"><unientity>6CBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2D"><unientity>6CAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2E"><unientity>6CB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 2F"><unientity>6CF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 30"><unientity>6CC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 31"><unientity>6CBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 32"><unientity>6CC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 33"><unientity>6CD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 34"><unientity>6CBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 35"><unientity>6CDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 36"><unientity>6CE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 37"><unientity>6CBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 38"><unientity>6CCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 39"><unientity>6CCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3A"><unientity>6CC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3B"><unientity>6D41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3C"><unientity>6D0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3D"><unientity>6D32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3E"><unientity>6D25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 3F"><unientity>6D31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 40"><unientity>6D2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 41"><unientity>6D0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 42"><unientity>6D1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 43"><unientity>6D17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 44"><unientity>6D3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 45"><unientity>6D1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 46"><unientity>6D36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 47"><unientity>6D3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 48"><unientity>6D3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 49"><unientity>6D6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4A"><unientity>6D95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4B"><unientity>6D78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4C"><unientity>6D66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4D"><unientity>6D59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4E"><unientity>6D87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 4F"><unientity>6D88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 50"><unientity>6D6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 51"><unientity>6D93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 52"><unientity>6D89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 53"><unientity>6D6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 54"><unientity>6D74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 55"><unientity>6D5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 56"><unientity>6D69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 57"><unientity>6D77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 58"><unientity>6DD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 59"><unientity>6DDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5A"><unientity>6DF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5B"><unientity>6DBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5C"><unientity>6DE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5D"><unientity>6DB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5E"><unientity>6DE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 5F"><unientity>6DD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 60"><unientity>6DAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 61"><unientity>6DF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 62"><unientity>6DC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 63"><unientity>6DCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 64"><unientity>6DC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 65"><unientity>6DDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 66"><unientity>6DAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 67"><unientity>6DB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 68"><unientity>6DFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 69"><unientity>6DF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6A"><unientity>6DCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6B"><unientity>6DF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6C"><unientity>6DB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6D"><unientity>6DD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6E"><unientity>6DF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 6F"><unientity>6DE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 70"><unientity>6DEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 71"><unientity>6DD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 72"><unientity>6DFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 73"><unientity>6DEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 74"><unientity>6DF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 75"><unientity>6D8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 76"><unientity>6DC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 77"><unientity>6DEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 78"><unientity>6DC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 79"><unientity>6E54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 7A"><unientity>6E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 7B"><unientity>6E38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 7C"><unientity>6E32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 7D"><unientity>6E67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 47 7E"><unientity>6E20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 21"><unientity>6E5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 22"><unientity>6E1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 23"><unientity>6E56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 24"><unientity>6E2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 25"><unientity>6E6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 26"><unientity>6E58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 27"><unientity>6E23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 28"><unientity>6E24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 29"><unientity>6E1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2A"><unientity>6E25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2B"><unientity>6E4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2C"><unientity>6E3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2D"><unientity>6E6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2E"><unientity>6E2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 2F"><unientity>6E34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 30"><unientity>6E2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 31"><unientity>6E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 32"><unientity>6E4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 33"><unientity>6E3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 34"><unientity>6E43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 35"><unientity>6E19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 36"><unientity>6E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 37"><unientity>6ED3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 38"><unientity>6EB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 39"><unientity>6EC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 3B"><unientity>6EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 3C"><unientity>6EA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 3D"><unientity>6E9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 3F"><unientity>6EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 40"><unientity>6E98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 41"><unientity>6E90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 42"><unientity>6EC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 43"><unientity>6EC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 44"><unientity>6EBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 45"><unientity>6EAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 46"><unientity>6ED1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 47"><unientity>6ECB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 48"><unientity>6EC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 49"><unientity>6ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4A"><unientity>6EAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4B"><unientity>6E96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4C"><unientity>6E9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4D"><unientity>6F33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4E"><unientity>6EF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 4F"><unientity>6EEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 50"><unientity>6EFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 51"><unientity>6F29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 52"><unientity>6F14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 53"><unientity>6F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 54"><unientity>6F2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 55"><unientity>6F32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 56"><unientity>6F0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 57"><unientity>E944</unientity><unientityalt>6F22</unientityalt><desc>Variant of 4B4857 which maps to 6F22</desc></character>
+<character hex="21 48 58"><unientity>6EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 59"><unientity>6F23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5A"><unientity>6F38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5B"><unientity>6F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5C"><unientity>6F31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5D"><unientity>6F02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5E"><unientity>6F06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 5F"><unientity>6EEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 60"><unientity>6F2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 61"><unientity>6F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 62"><unientity>6F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 63"><unientity>6F3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 64"><unientity>6EF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 65"><unientity>6F01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 66"><unientity>6F11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 67"><unientity>6ECC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 68"><unientity>6F2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 69"><unientity>6F7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6A"><unientity>6F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6B"><unientity>6F84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6C"><unientity>6F51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6D"><unientity>6F64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6E"><unientity>6F97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 6F"><unientity>6F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 70"><unientity>6F7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 71"><unientity>6F86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 72"><unientity>6F8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 73"><unientity>6F6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 74"><unientity>6F5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 75"><unientity>6F6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 76"><unientity>6F78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 77"><unientity>6F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 78"><unientity>6F70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 79"><unientity>6F58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 7A"><unientity>6FC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 7B"><unientity>6FB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 7C"><unientity>6FC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 7D"><unientity>6FA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 48 7E"><unientity>6FA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 21"><unientity>6FA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 22"><unientity>6FC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 24"><unientity>6FC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 25"><unientity>6FB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 26"><unientity>6FDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 27"><unientity>6FD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 28"><unientity>6FF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 29"><unientity>6FE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 2A"><unientity>6FEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 2B"><unientity>E945</unientity><unientityalt>6FEB</unientityalt><desc>Variant of 4B492B which maps to 6FEB</desc></character>
+<character hex="21 49 2C"><unientity>6FE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 2D"><unientity>6FE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 2E"><unientity>6F80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 31"><unientity>700B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 32"><unientity>7009</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 33"><unientity>7006</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 34"><unientity>6FFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 35"><unientity>7011</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 36"><unientity>6FFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 37"><unientity>700F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 38"><unientity>701B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 39"><unientity>701A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 3A"><unientity>7028</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 3B"><unientity>701D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 3C"><unientity>7015</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 3D"><unientity>701F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 3F"><unientity>703E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 40"><unientity>704C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 41"><unientity>7051</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 42"><unientity>7058</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 43"><unientity>7063</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 44"><unientity>7064</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 45"><unientity>706B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 46"><unientity>7070</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 47"><unientity>7076</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 48"><unientity>707C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 49"><unientity>7078</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4A"><unientity>707D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4B"><unientity>7095</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4C"><unientity>708E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4D"><unientity>7092</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4E"><unientity>7099</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 4F"><unientity>708A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 50"><unientity>70AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 51"><unientity>70BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 52"><unientity>70AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 53"><unientity>70B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 54"><unientity>70AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 55"><unientity>70AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 56"><unientity>70AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 57"><unientity>70B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 58"><unientity>70CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 59"><unientity>70E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5A"><unientity>70D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5B"><unientity>70C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5C"><unientity>70D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5D"><unientity>70CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5E"><unientity>70F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 5F"><unientity>7109</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 60"><unientity>710A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 61"><unientity>70FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 62"><unientity>7119</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 63"><unientity>716E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 64"><unientity>711A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 65"><unientity>7136</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 66"><unientity>7121</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 67"><unientity>7130</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 68"><unientity>7126</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 69"><unientity>714E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6A"><unientity>7149</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6B"><unientity>7159</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6C"><unientity>7164</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6D"><unientity>7169</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6E"><unientity>715C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 6F"><unientity>716C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 70"><unientity>7166</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 71"><unientity>7167</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 72"><unientity>715E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 73"><unientity>7165</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 74"><unientity>714C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 75"><unientity>717D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 77"><unientity>7199</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 78"><unientity>718A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 79"><unientity>7184</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 7A"><unientity>719F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 7B"><unientity>71A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 7C"><unientity>71AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 7D"><unientity>71B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 49 7E"><unientity>71D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 21"><unientity>71BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 22"><unientity>71C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 23"><unientity>71D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 24"><unientity>71C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 25"><unientity>71DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 26"><unientity>71D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 27"><unientity>71B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 28"><unientity>71D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 29"><unientity>71CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2A"><unientity>71C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2B"><unientity>71C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2C"><unientity>71EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2D"><unientity>71E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2E"><unientity>71DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 2F"><unientity>71E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 30"><unientity>71ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 31"><unientity>71E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 32"><unientity>71EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 33"><unientity>71F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 34"><unientity>71FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 35"><unientity>7206</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 36"><unientity>720D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 37"><unientity>7210</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 38"><unientity>721B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 39"><unientity>7228</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 3A"><unientity>722A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 3B"><unientity>722D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 3C"><unientity>722C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 3D"><unientity>7230</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 3E"><unientity>E946</unientity><unientityalt>7235</unientityalt><desc>Variant of 4B4A3E which maps to 7235</desc></character>
+<character hex="21 4A 3F"><unientity>7236</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 40"><unientity>7238</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 41"><unientity>7239</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 42"><unientity>723A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 43"><unientity>723B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 44"><unientity>723D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 45"><unientity>723E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 46"><unientity>7246</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 47"><unientity>7247</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 48"><unientity>7248</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 49"><unientity>724C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4A"><unientity>7252</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4B"><unientity>7256</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4C"><unientity>7258</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4D"><unientity>7259</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4E"><unientity>725B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 4F"><unientity>725F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 50"><unientity>725D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 51"><unientity>7262</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 52"><unientity>7261</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 53"><unientity>7260</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 54"><unientity>7267</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 55"><unientity>7269</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 56"><unientity>726F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 57"><unientity>7272</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 58"><unientity>7274</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 59"><unientity>7279</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5A"><unientity>727D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5B"><unientity>7281</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5C"><unientity>7280</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5D"><unientity>7284</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5E"><unientity>7296</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 5F"><unientity>7292</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 60"><unientity>729B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 61"><unientity>72A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 62"><unientity>72A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 63"><unientity>72AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 64"><unientity>72AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 65"><unientity>72C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 66"><unientity>72C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 67"><unientity>72D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 68"><unientity>72C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 69"><unientity>72CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6A"><unientity>72D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6B"><unientity>72D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6C"><unientity>72E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6D"><unientity>72E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6E"><unientity>72E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 6F"><unientity>72FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 70"><unientity>72F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 72"><unientity>72FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 73"><unientity>72F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 74"><unientity>731C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 75"><unientity>731B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 76"><unientity>7313</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 77"><unientity>7316</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 78"><unientity>7319</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 79"><unientity>7336</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 7A"><unientity>7337</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 7B"><unientity>7329</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 7C"><unientity>7325</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 7D"><unientity>7334</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4A 7E"><unientity>7344</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 21"><unientity>733F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 22"><unientity>733E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 23"><unientity>7345</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 24"><unientity>7350</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 26"><unientity>7357</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 27"><unientity>7368</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 28"><unientity>7370</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 29"><unientity>7372</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2A"><unientity>7377</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2B"><unientity>7378</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2C"><unientity>7375</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2D"><unientity>737A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2E"><unientity>737B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 2F"><unientity>7380</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 30"><unientity>7384</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 31"><unientity>7387</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 32"><unientity>7389</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 33"><unientity>738B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 34"><unientity>7396</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 35"><unientity>739F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 36"><unientity>73A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 37"><unientity>73A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 38"><unientity>73AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 39"><unientity>73BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 3A"><unientity>73CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 3B"><unientity>73B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 3C"><unientity>73C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 3E"><unientity>73B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 3F"><unientity>73CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 40"><unientity>73ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 41"><unientity>73EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 42"><unientity>73E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 43"><unientity>7405</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 44"><unientity>7409</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 45"><unientity>7403</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 46"><unientity>740A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 47"><unientity>73FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 48"><unientity>7406</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 49"><unientity>740D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4A"><unientity>743A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4B"><unientity>7435</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4C"><unientity>7436</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4D"><unientity>7434</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4E"><unientity>742A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 4F"><unientity>7433</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 50"><unientity>7422</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 51"><unientity>7425</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 53"><unientity>7455</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 54"><unientity>745F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 55"><unientity>745A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 56"><unientity>7441</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 57"><unientity>743F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 58"><unientity>745B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 59"><unientity>745E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5A"><unientity>745C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5B"><unientity>7459</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5C"><unientity>7483</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5D"><unientity>7469</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5E"><unientity>746A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 5F"><unientity>7463</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 60"><unientity>7464</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 61"><unientity>7470</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 62"><unientity>748B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 63"><unientity>E947</unientity><unientityalt>749C</unientityalt><desc>Variant of 4B4B63 which maps to 749C</desc></character>
+<character hex="21 4B 64"><unientity>74A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 65"><unientity>74A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 66"><unientity>74A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 67"><unientity>74B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 68"><unientity>74A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 69"><unientity>74BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6A"><unientity>74CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6B"><unientity>74CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6C"><unientity>74DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6D"><unientity>74E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6E"><unientity>74E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 6F"><unientity>74E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 70"><unientity>74E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 71"><unientity>74F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 72"><unientity>74F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 73"><unientity>7504</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 74"><unientity>750C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 75"><unientity>7515</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 76"><unientity>7518</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 77"><unientity>751A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 78"><unientity>751C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 79"><unientity>751F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 7A"><unientity>7522</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 7B"><unientity>7526</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 7C"><unientity>7525</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 7D"><unientity>7528</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4B 7E"><unientity>7529</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 21"><unientity>752C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 22"><unientity>752B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 23"><unientity>752D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 24"><unientity>7530</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 25"><unientity>7532</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 26"><unientity>7531</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 27"><unientity>7533</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 28"><unientity>7537</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 29"><unientity>7538</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2A"><unientity>753D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2B"><unientity>754F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2C"><unientity>754C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2D"><unientity>755D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2E"><unientity>755C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 2F"><unientity>7554</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 30"><unientity>755A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 31"><unientity>7559</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 32"><unientity>7566</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 33"><unientity>7562</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 34"><unientity>7570</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 35"><unientity>7565</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 36"><unientity>756B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 37"><unientity>756A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 38"><unientity>7578</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 39"><unientity>7576</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 3A"><unientity>7586</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 3B"><unientity>7587</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 3C"><unientity>758A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 3E"><unientity>758F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 3F"><unientity>7591</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 40"><unientity>759D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 41"><unientity>7599</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 42"><unientity>759A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 43"><unientity>75A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 44"><unientity>75AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 45"><unientity>75A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 46"><unientity>75C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 47"><unientity>75C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 48"><unientity>75B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 49"><unientity>75B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4A"><unientity>75BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4B"><unientity>75BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4C"><unientity>75BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4D"><unientity>75B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4E"><unientity>75D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 4F"><unientity>75D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 50"><unientity>75B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 51"><unientity>E948</unientity><unientityalt>75CA</unientityalt><desc>Variant of 4B4C51 which maps to 75CA</desc></character>
+<character hex="21 4C 52"><unientity>75DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 53"><unientity>75E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 54"><unientity>75D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 55"><unientity>75DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 56"><unientity>75D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 57"><unientity>75E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 58"><unientity>7601</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 59"><unientity>7600</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5A"><unientity>75F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5B"><unientity>75F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5C"><unientity>75F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5D"><unientity>75F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5E"><unientity>75FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 5F"><unientity>75FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 60"><unientity>760D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 61"><unientity>7627</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 62"><unientity>7613</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 63"><unientity>760B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 65"><unientity>7620</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 66"><unientity>7629</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 67"><unientity>761F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 68"><unientity>7624</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 69"><unientity>7626</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6A"><unientity>7621</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6B"><unientity>7634</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6C"><unientity>7638</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6D"><unientity>7646</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6E"><unientity>7642</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 6F"><unientity>764C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 70"><unientity>7656</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 71"><unientity>7658</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 73"><unientity>7662</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 74"><unientity>7665</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 75"><unientity>7669</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 76"><unientity>766E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 77"><unientity>766C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 78"><unientity>7671</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 79"><unientity>E949</unientity><unientityalt>7672</unientityalt><desc>Variant of 4B4C79 which maps to 7672</desc></character>
+<character hex="21 4C 7A"><unientity>7678</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 7B"><unientity>767C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 7C"><unientity>767B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 7D"><unientity>767D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4C 7E"><unientity>767E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 21"><unientity>7682</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 22"><unientity>7684</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 23"><unientity>7687</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 24"><unientity>7686</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 26"><unientity>768E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 27"><unientity>7696</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 28"><unientity>7693</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 29"><unientity>769A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2A"><unientity>76AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2B"><unientity>76B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2C"><unientity>76B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2D"><unientity>76BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2E"><unientity>76BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 2F"><unientity>76C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 31"><unientity>76C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 32"><unientity>76C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 33"><unientity>76CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 34"><unientity>76CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 35"><unientity>76CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 36"><unientity>76D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 37"><unientity>76D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 38"><unientity>76DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 39"><unientity>76DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3A"><unientity>76DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3B"><unientity>76DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3C"><unientity>76E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3D"><unientity>76E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3E"><unientity>76E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 3F"><unientity>76E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 40"><unientity>76E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 41"><unientity>76EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 42"><unientity>76EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 43"><unientity>76EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 44"><unientity>76F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 45"><unientity>76F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 46"><unientity>7709</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 47"><unientity>76F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 48"><unientity>76F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 49"><unientity>7701</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4A"><unientity>770B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4B"><unientity>76FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4C"><unientity>76FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4D"><unientity>7729</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4E"><unientity>7720</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 4F"><unientity>771E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 50"><unientity>7728</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 51"><unientity>7737</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 52"><unientity>773C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 53"><unientity>7736</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 54"><unientity>7738</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 55"><unientity>773A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 56"><unientity>773E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 57"><unientity>774F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 58"><unientity>776B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 59"><unientity>775B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5A"><unientity>776A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5B"><unientity>7766</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5C"><unientity>7779</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5D"><unientity>775E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5E"><unientity>7763</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 5F"><unientity>775C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 60"><unientity>776C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 61"><unientity>7768</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 62"><unientity>7765</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 63"><unientity>777D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 64"><unientity>7771</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 65"><unientity>777F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 66"><unientity>7784</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 67"><unientity>7761</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 68"><unientity>7787</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 69"><unientity>778E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6A"><unientity>778C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6B"><unientity>7791</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6C"><unientity>779F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6D"><unientity>779E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6E"><unientity>77A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 6F"><unientity>77A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 70"><unientity>77B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 71"><unientity>77AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 72"><unientity>77B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 73"><unientity>77AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 74"><unientity>77AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 75"><unientity>77A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 76"><unientity>77BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 77"><unientity>77BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 78"><unientity>77BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 7A"><unientity>77D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 7B"><unientity>77D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 7C"><unientity>77DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 7D"><unientity>77DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4D 7E"><unientity>77DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 21"><unientity>77E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 22"><unientity>77E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 23"><unientity>77E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 24"><unientity>77E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 25"><unientity>77ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 26"><unientity>77EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 27"><unientity>77EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 28"><unientity>77F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 29"><unientity>77FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2A"><unientity>7802</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2B"><unientity>780D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2C"><unientity>780C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2D"><unientity>65AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2E"><unientity>7830</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 2F"><unientity>781D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 30"><unientity>7834</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 31"><unientity>7838</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 32"><unientity>7837</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 33"><unientity>7827</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 34"><unientity>782D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 35"><unientity>7825</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 36"><unientity>786B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 37"><unientity>784F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 38"><unientity>7843</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 39"><unientity>786C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3A"><unientity>785D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3B"><unientity>786F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3C"><unientity>78B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3D"><unientity>7897</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3E"><unientity>788E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 3F"><unientity>7898</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 40"><unientity>7889</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 41"><unientity>7891</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 42"><unientity>787C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 43"><unientity>788C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 44"><unientity>78A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 45"><unientity>78A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 46"><unientity>789F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 47"><unientity>78B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 48"><unientity>78CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 49"><unientity>78BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4A"><unientity>78C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4B"><unientity>78C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4C"><unientity>78BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4D"><unientity>78D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4E"><unientity>78BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 4F"><unientity>78CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 50"><unientity>78D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 51"><unientity>78E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 52"><unientity>78EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 53"><unientity>78DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 54"><unientity>78F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 55"><unientity>78F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 56"><unientity>E94A</unientity><unientityalt>78FA</unientityalt><desc>Variant of 4B4E56 which maps to 78FA</desc></character>
+<character hex="21 4E 57"><unientity>7901</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 58"><unientity>78EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 59"><unientity>790E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5A"><unientity>7919</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5B"><unientity>7926</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5C"><unientity>792C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5D"><unientity>792A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5E"><unientity>792B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 5F"><unientity>793A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 60"><unientity>7940</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 61"><unientity>793E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 62"><unientity>7941</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 63"><unientity>7945</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 64"><unientity>7949</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 65"><unientity>7948</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 66"><unientity>7947</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 67"><unientity>7955</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 68"><unientity>7960</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 69"><unientity>7950</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6A"><unientity>7956</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6B"><unientity>795E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6C"><unientity>795D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6D"><unientity>795F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6E"><unientity>795A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 6F"><unientity>7957</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 70"><unientity>7965</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 71"><unientity>7968</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 72"><unientity>796D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 73"><unientity>797A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 74"><unientity>7981</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 75"><unientity>797F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 76"><unientity>798F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 77"><unientity>798D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 78"><unientity>798E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 79"><unientity>79A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 7A"><unientity>79A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 7B"><unientity>79AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 7C"><unientity>79AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 7D"><unientity>79B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4E 7E"><unientity>79B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 21"><unientity>79BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 22"><unientity>842C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 23"><unientity>79BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 24"><unientity>79C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 25"><unientity>79C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 26"><unientity>79BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 27"><unientity>79C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 28"><unientity>79D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 29"><unientity>79CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2A"><unientity>79D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2B"><unientity>79E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2C"><unientity>79E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2D"><unientity>79E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2E"><unientity>79DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 2F"><unientity>79E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 30"><unientity>79E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 31"><unientity>79FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 32"><unientity>7A05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 33"><unientity>7A0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 34"><unientity>7A08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 35"><unientity>7A0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 36"><unientity>7A00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 37"><unientity>7A1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 39"><unientity>7A20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3A"><unientity>7A1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3B"><unientity>7A14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3C"><unientity>7A31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3D"><unientity>7A2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3E"><unientity>7A3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 3F"><unientity>7A3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 40"><unientity>7A40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 41"><unientity>7A3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 42"><unientity>7A37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 43"><unientity>7A3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 44"><unientity>7A4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 45"><unientity>7A4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 46"><unientity>7A4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 47"><unientity>7A46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 48"><unientity>7A57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 49"><unientity>7A61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4A"><unientity>7A62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4B"><unientity>7A6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4C"><unientity>7A69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4D"><unientity>7A74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4E"><unientity>7A76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 4F"><unientity>7A79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 50"><unientity>7A7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 51"><unientity>7A7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 52"><unientity>7A81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 53"><unientity>7A84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 54"><unientity>7A88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 55"><unientity>7A92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 56"><unientity>7A95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 57"><unientity>7A98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 58"><unientity>7A96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 59"><unientity>7A97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5A"><unientity>7A9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5B"><unientity>7AA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5C"><unientity>7AAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5D"><unientity>7AA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5E"><unientity>7AAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 5F"><unientity>7AAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 60"><unientity>7ABA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 61"><unientity>7AC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 62"><unientity>7AC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 63"><unientity>7AC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 64"><unientity>7ACA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 65"><unientity>7ACB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 66"><unientity>7AD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 67"><unientity>7AE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 68"><unientity>7AE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 69"><unientity>7AED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6A"><unientity>7AEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6B"><unientity>7AF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6C"><unientity>7AF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6D"><unientity>7AFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6E"><unientity>7AFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 6F"><unientity>7AFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 70"><unientity>7B06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 71"><unientity>7B11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 72"><unientity>7B20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 73"><unientity>7B2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 74"><unientity>7B28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 75"><unientity>7B1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 76"><unientity>7B1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 77"><unientity>7B19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 78"><unientity>7B26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 79"><unientity>7B46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 7A"><unientity>7B49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 7B"><unientity>7B50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 7C"><unientity>7B56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 7D"><unientity>7B52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 4F 7E"><unientity>7B4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 21"><unientity>7B4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 22"><unientity>7B4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 23"><unientity>7B54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 24"><unientity>7B60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 25"><unientity>7B77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 26"><unientity>7B75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 27"><unientity>7BA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 28"><unientity>7B94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 29"><unientity>7B95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2A"><unientity>7B9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2B"><unientity>7B8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2C"><unientity>7B97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2D"><unientity>7B8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2E"><unientity>7BC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 2F"><unientity>7BAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 30"><unientity>7BC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 31"><unientity>7BB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 32"><unientity>7BB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 33"><unientity>7BC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 34"><unientity>7BC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 35"><unientity>7BC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 36"><unientity>7C11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 37"><unientity>7BD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 38"><unientity>7BDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 39"><unientity>7BE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3A"><unientity>7BC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3B"><unientity>7BE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3C"><unientity>7BE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3D"><unientity>7C07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3E"><unientity>7C0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 3F"><unientity>7BFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 40"><unientity>7BF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 41"><unientity>7C21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 42"><unientity>7C2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 43"><unientity>7C2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 44"><unientity>7C27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 45"><unientity>7C1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 46"><unientity>7C23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 47"><unientity>7C3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 48"><unientity>7C3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 49"><unientity>7C38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4A"><unientity>7C37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4B"><unientity>7C3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4C"><unientity>7C43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4D"><unientity>7C4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4E"><unientity>7C4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 4F"><unientity>7C50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 50"><unientity>7C60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 51"><unientity>7C5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 52"><unientity>7C64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 53"><unientity>7C6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 54"><unientity>7C6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 55"><unientity>7C72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 56"><unientity>7C73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 57"><unientity>7C89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 58"><unientity>7C92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 59"><unientity>7C97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5A"><unientity>7C9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5B"><unientity>7CA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5C"><unientity>7CA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5D"><unientity>7CB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5E"><unientity>7CB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 5F"><unientity>7CBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 60"><unientity>7CB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 61"><unientity>FA1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 62"><unientity>7CCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 63"><unientity>7CD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 64"><unientity>7CD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 65"><unientity>7CE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 66"><unientity>7CDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 67"><unientity>7CDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 68"><unientity>7CDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 69"><unientity>7CE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 6A"><unientity>7CD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 6B"><unientity>7CE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 6C"><unientity>7CEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 6E"><unientity>7CFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 6F"><unientity>7CFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 70"><unientity>7D00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 71"><unientity>7D02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 72"><unientity>7D05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 73"><unientity>7D09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 74"><unientity>7D04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 75"><unientity>7D07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 76"><unientity>7D21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 77"><unientity>7D0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 78"><unientity>7D0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 79"><unientity>7D20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 7A"><unientity>7D1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 7B"><unientity>7D22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 7C"><unientity>7D15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 7D"><unientity>7D14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 50 7E"><unientity>7D10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 21"><unientity>7D17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 22"><unientity>E94B</unientity><unientityalt>7D0D</unientityalt><desc>Variant of 455122 which maps to 7D0D</desc></character>
+<character hex="21 51 23"><unientity>7D1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 24"><unientity>7D19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 25"><unientity>7D1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 26"><unientity>7D46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 28"><unientity>7D3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 29"><unientity>7D2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2A"><unientity>7D39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2B"><unientity>7D44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2C"><unientity>7D30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2D"><unientity>7D33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2E"><unientity>7D2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 2F"><unientity>7D40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 30"><unientity>7D42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 31"><unientity>7D71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 32"><unientity>7D5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 33"><unientity>7D68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 34"><unientity>7D50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 35"><unientity>7D2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 36"><unientity>7D62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 37"><unientity>7D76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 38"><unientity>7D61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 39"><unientity>7D66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3A"><unientity>7D6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3B"><unientity>7D72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3C"><unientity>7D93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3D"><unientity>7D91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3E"><unientity>7D79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 3F"><unientity>7D8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 40"><unientity>7D81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 41"><unientity>7D9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 42"><unientity>7DBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 43"><unientity>7DB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 44"><unientity>7DCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 45"><unientity>7DBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 46"><unientity>7DB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 47"><unientity>7DBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 48"><unientity>7DB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 49"><unientity>7DB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4A"><unientity>7DBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4B"><unientity>7DB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4C"><unientity>7DA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4D"><unientity>7DA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4E"><unientity>7DAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 4F"><unientity>7DBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 50"><unientity>7DB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 51"><unientity>7DC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 52"><unientity>7DE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 53"><unientity>7DEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 54"><unientity>E94C</unientity><unientityalt>7DF4</unientityalt><desc>Variant of 4B5154 which maps to 7DF4</desc></character>
+<character hex="21 51 55"><unientity>7DD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 56"><unientity>7DD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 57"><unientity>7DEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 58"><unientity>7DDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 59"><unientity>7DE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5A"><unientity>7DE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5B"><unientity>7DE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5C"><unientity>7DDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5D"><unientity>7D9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5E"><unientity>7DDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 5F"><unientity>7E11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 60"><unientity>7E0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 61"><unientity>7E08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 62"><unientity>7E1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 63"><unientity>7DFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 64"><unientity>7E23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 65"><unientity>7E2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 66"><unientity>7E3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 67"><unientity>7E46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 68"><unientity>7E37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 69"><unientity>7E32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6A"><unientity>7E43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6B"><unientity>7E41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6C"><unientity>7E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6D"><unientity>7E3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6E"><unientity>7E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 6F"><unientity>7E45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 70"><unientity>7E55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 71"><unientity>7E54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 72"><unientity>7E61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 73"><unientity>7E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 74"><unientity>7E5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 75"><unientity>7E6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 76"><unientity>7E69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 77"><unientity>7E6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 78"><unientity>7E79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 79"><unientity>7E6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 7A"><unientity>8FAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 7B"><unientity>7E7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 7C"><unientity>7E82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 7D"><unientity>7E7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 51 7E"><unientity>7E8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 21"><unientity>7E8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 22"><unientity>7E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 23"><unientity>7E96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 24"><unientity>7E9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 26"><unientity>7F38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 27"><unientity>7F3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 28"><unientity>7F3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 29"><unientity>7F44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 2B"><unientity>7F50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 2C"><unientity>7F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 2D"><unientity>7F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 2E"><unientity>7F5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 2F"><unientity>7F72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 30"><unientity>7F6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 31"><unientity>7F69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 32"><unientity>7F6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 33"><unientity>7F70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 34"><unientity>7F75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 35"><unientity>7F77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 36"><unientity>7F79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 37"><unientity>7F85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 38"><unientity>7F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 39"><unientity>7F8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3A"><unientity>7F8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3B"><unientity>7F8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3C"><unientity>7F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3D"><unientity>7F9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3E"><unientity>7F9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 3F"><unientity>5584</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 40"><unientity>7FA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 41"><unientity>7FA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 42"><unientity>7FA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 43"><unientity>7FAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 44"><unientity>7FB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 45"><unientity>7FB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 46"><unientity>7FB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 47"><unientity>7FB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 48"><unientity>7FBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 49"><unientity>7FBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 4A"><unientity>7FC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 4B"><unientity>7FC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 4C"><unientity>7FCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 4D"><unientity>7FD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 4E"><unientity>E94D</unientity><unientityalt>7FCE</unientityalt><desc>Variant of 4B524E which maps to 7FCE</desc></character>
+<character hex="21 52 4F"><unientity>7FD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 50"><unientity>7FD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 51"><unientity>7FE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 52"><unientity>7FE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 53"><unientity>7FDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 54"><unientity>7FE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 55"><unientity>7FF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 56"><unientity>7FF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 57"><unientity>7FFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 58"><unientity>7FF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 59"><unientity>7FFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5A"><unientity>7FF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5B"><unientity>8000</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5C"><unientity>8001</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5D"><unientity>8003</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5E"><unientity>8006</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 5F"><unientity>8005</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 60"><unientity>800C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 61"><unientity>8010</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 62"><unientity>800D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 63"><unientity>8012</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 64"><unientity>8015</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 65"><unientity>8018</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 66"><unientity>8019</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 67"><unientity>8017</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 68"><unientity>801C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 69"><unientity>8033</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6A"><unientity>8036</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6B"><unientity>803F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6C"><unientity>803D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6D"><unientity>804A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6E"><unientity>8046</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 6F"><unientity>8056</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 70"><unientity>8058</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 71"><unientity>805E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 72"><unientity>805A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 73"><unientity>8071</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 74"><unientity>8072</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 75"><unientity>8073</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 76"><unientity>8070</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 77"><unientity>806F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 78"><unientity>8077</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 79"><unientity>8076</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 7A"><unientity>807E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 7B"><unientity>807D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 7C"><unientity>807F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 52 7E"><unientity>8084</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 21"><unientity>8085</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 22"><unientity>8087</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 23"><unientity>8089</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 24"><unientity>808B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 25"><unientity>808C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 26"><unientity>8093</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 27"><unientity>809D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 28"><unientity>8098</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 29"><unientity>809B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2A"><unientity>809A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2B"><unientity>8096</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2C"><unientity>80B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2D"><unientity>80AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2E"><unientity>80BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 2F"><unientity>80A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 30"><unientity>80A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 31"><unientity>80AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 32"><unientity>80B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 33"><unientity>80AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 34"><unientity>80A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 35"><unientity>80A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 36"><unientity>80B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 37"><unientity>80D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 38"><unientity>80CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 39"><unientity>80E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3A"><unientity>80DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3B"><unientity>80E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3C"><unientity>80C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3D"><unientity>80DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3E"><unientity>80C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 3F"><unientity>80CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 40"><unientity>80DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 41"><unientity>80E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 42"><unientity>80F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 43"><unientity>8102</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 44"><unientity>8105</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 45"><unientity>80F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 46"><unientity>80F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 47"><unientity>80ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 48"><unientity>80FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 49"><unientity>8106</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4A"><unientity>80F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4B"><unientity>80F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4C"><unientity>810A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4D"><unientity>8108</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4E"><unientity>812B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 4F"><unientity>812F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 50"><unientity>8116</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 52"><unientity>8129</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 53"><unientity>8155</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 54"><unientity>8154</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 55"><unientity>814B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 56"><unientity>8151</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 57"><unientity>8150</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 58"><unientity>814E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 59"><unientity>8139</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5A"><unientity>8146</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5B"><unientity>813E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5C"><unientity>8171</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5D"><unientity>8170</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5E"><unientity>8178</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 5F"><unientity>8165</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 60"><unientity>816E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 61"><unientity>8173</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 62"><unientity>816B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 63"><unientity>8179</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 64"><unientity>817A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 65"><unientity>8166</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 66"><unientity>8180</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 67"><unientity>818F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 68"><unientity>817F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 69"><unientity>818A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6A"><unientity>8188</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6B"><unientity>819D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6C"><unientity>81A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6D"><unientity>819B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6E"><unientity>819A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 6F"><unientity>819C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 70"><unientity>81B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 71"><unientity>81A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 72"><unientity>81A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 73"><unientity>81C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 74"><unientity>81BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 75"><unientity>81C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 76"><unientity>81C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 77"><unientity>81C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 78"><unientity>81BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 79"><unientity>81BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 7A"><unientity>81C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 7B"><unientity>81BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 7C"><unientity>81CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 7D"><unientity>81CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 53 7E"><unientity>81D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 21"><unientity>81DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 22"><unientity>81DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 23"><unientity>81E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 24"><unientity>81E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 25"><unientity>81E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 26"><unientity>81EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 27"><unientity>81EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 28"><unientity>81ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 29"><unientity>81F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 2B"><unientity>81FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 2C"><unientity>81FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 2D"><unientity>81FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 2E"><unientity>81FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 2F"><unientity>8200</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 30"><unientity>8202</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 31"><unientity>8205</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 32"><unientity>8207</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 33"><unientity>8208</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 34"><unientity>8209</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 35"><unientity>820A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 36"><unientity>820C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 37"><unientity>820D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 38"><unientity>8210</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 39"><unientity>8212</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3A"><unientity>8214</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3B"><unientity>821B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3C"><unientity>821C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3D"><unientity>821E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3E"><unientity>821F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 3F"><unientity>8222</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 40"><unientity>822A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 41"><unientity>822B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 42"><unientity>822C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 43"><unientity>8228</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 44"><unientity>8237</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 45"><unientity>8235</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 46"><unientity>8239</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 47"><unientity>8236</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 48"><unientity>8247</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 49"><unientity>8258</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4A"><unientity>8259</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4B"><unientity>8266</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4C"><unientity>826E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4D"><unientity>826F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4E"><unientity>8271</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 4F"><unientity>8272</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 50"><unientity>827E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 51"><unientity>8292</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 52"><unientity>828B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 53"><unientity>828D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 54"><unientity>82B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 55"><unientity>829D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 56"><unientity>8299</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 57"><unientity>82BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 58"><unientity>82AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 59"><unientity>82AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 5A"><unientity>82A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 5B"><unientity>829F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 5C"><unientity>82BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 5D"><unientity>82B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 5E"><unientity>82B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 60"><unientity>82E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 61"><unientity>8305</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 62"><unientity>8309</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 63"><unientity>82E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 64"><unientity>82DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 65"><unientity>82E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 66"><unientity>8304</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 67"><unientity>82E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 68"><unientity>8302</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 69"><unientity>82DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6A"><unientity>82D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6B"><unientity>82F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6C"><unientity>8301</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6D"><unientity>82D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6E"><unientity>82D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 6F"><unientity>82D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 70"><unientity>82DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 71"><unientity>82DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 72"><unientity>832B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 73"><unientity>8352</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 74"><unientity>834A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 75"><unientity>8338</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 76"><unientity>8354</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 77"><unientity>8350</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 78"><unientity>8349</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 79"><unientity>8335</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 7A"><unientity>8334</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 7B"><unientity>8336</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 7C"><unientity>8331</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 7D"><unientity>8340</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 54 7E"><unientity>8317</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 21"><unientity>5179</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 22"><unientity>834F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 23"><unientity>8339</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 24"><unientity>838E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 25"><unientity>8398</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 26"><unientity>839E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 27"><unientity>8378</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 28"><unientity>83A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 29"><unientity>8396</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 2A"><unientity>83A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 2B"><unientity>83AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 2C"><unientity>E94E</unientity><unientityalt>8392</unientityalt><desc>Variant of 4B552C which maps to 8392</desc></character>
+<character hex="21 55 2D"><unientity>838A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 2E"><unientity>8393</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 2F"><unientity>83A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 30"><unientity>8389</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 31"><unientity>8377</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 32"><unientity>837C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 33"><unientity>837B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 34"><unientity>840D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 35"><unientity>83E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 36"><unientity>83E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 38"><unientity>8403</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 39"><unientity>83C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 3A"><unientity>83C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 3B"><unientity>840B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 3C"><unientity>83EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 3E"><unientity>83F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 3F"><unientity>83BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 41"><unientity>840A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 42"><unientity>840C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 43"><unientity>83CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 44"><unientity>83DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 45"><unientity>83CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 46"><unientity>83F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 47"><unientity>840E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 48"><unientity>8404</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 49"><unientity>843D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4A"><unientity>8482</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4B"><unientity>8431</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4C"><unientity>8475</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4D"><unientity>8466</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4E"><unientity>8457</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 4F"><unientity>8449</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 50"><unientity>846C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 51"><unientity>846B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 52"><unientity>845B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 53"><unientity>8477</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 54"><unientity>843C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 55"><unientity>8435</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 56"><unientity>8461</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 57"><unientity>8463</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 58"><unientity>8469</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 59"><unientity>8438</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5A"><unientity>84B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5B"><unientity>849E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5C"><unientity>84BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5D"><unientity>84C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5E"><unientity>84C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 5F"><unientity>84C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 60"><unientity>849C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 61"><unientity>84CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 62"><unientity>84B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 63"><unientity>84C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 64"><unientity>8499</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 65"><unientity>84D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 66"><unientity>8490</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 67"><unientity>84BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 68"><unientity>853D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 69"><unientity>84FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6A"><unientity>8517</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6B"><unientity>851A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6C"><unientity>84EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6D"><unientity>852C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6E"><unientity>852D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 6F"><unientity>8513</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 71"><unientity>8523</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 72"><unientity>8521</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 73"><unientity>8514</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 74"><unientity>84EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 75"><unientity>8525</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 76"><unientity>8569</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 77"><unientity>854A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 78"><unientity>8559</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 79"><unientity>8548</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 7A"><unientity>8568</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 7B"><unientity>8543</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 7C"><unientity>856A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 7D"><unientity>8549</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 55 7E"><unientity>8584</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 21"><unientity>85AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 22"><unientity>856D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 23"><unientity>859B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 24"><unientity>8591</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 25"><unientity>857E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 26"><unientity>8594</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 27"><unientity>859C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 28"><unientity>8587</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 29"><unientity>E94F</unientity><unientityalt>85CD</unientityalt><desc>Variant of 4B5629 which maps to 85CD</desc></character>
+<character hex="21 56 2A"><unientity>85A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 2B"><unientity>85CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 2C"><unientity>85AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 2D"><unientity>85D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 2E"><unientity>85C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 2F"><unientity>85B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 30"><unientity>85E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 31"><unientity>85DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 32"><unientity>85EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 33"><unientity>85E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 34"><unientity>85D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 35"><unientity>85E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 36"><unientity>85FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 37"><unientity>85F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 38"><unientity>8611</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 39"><unientity>85FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3A"><unientity>8606</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3B"><unientity>860B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3C"><unientity>8607</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3D"><unientity>860A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3E"><unientity>862D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 3F"><unientity>8617</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 40"><unientity>861A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 41"><unientity>8638</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 42"><unientity>863F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 43"><unientity>864E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 44"><unientity>8650</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 45"><unientity>8654</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 46"><unientity>5F6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 47"><unientity>8655</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 48"><unientity>865C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 49"><unientity>865B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 4A"><unientity>865F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 4B"><unientity>865E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 4C"><unientity>8667</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 4F"><unientity>8679</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 50"><unientity>86A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 51"><unientity>86AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 52"><unientity>868A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 53"><unientity>8693</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 54"><unientity>86A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 55"><unientity>868C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 56"><unientity>86A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 57"><unientity>86C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 58"><unientity>86C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 59"><unientity>86B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5A"><unientity>86CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5B"><unientity>86B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5C"><unientity>86C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5D"><unientity>86C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5E"><unientity>86B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 5F"><unientity>86AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 60"><unientity>86DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 61"><unientity>86D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 62"><unientity>86ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 63"><unientity>86D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 64"><unientity>86DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 65"><unientity>86E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 66"><unientity>86FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 67"><unientity>86F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 68"><unientity>8707</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 69"><unientity>8703</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6A"><unientity>8708</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6B"><unientity>8700</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6C"><unientity>86FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6D"><unientity>8713</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6E"><unientity>8702</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 6F"><unientity>871C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 70"><unientity>873F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 71"><unientity>873B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 72"><unientity>8722</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 73"><unientity>8725</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 74"><unientity>8734</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 75"><unientity>8718</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 76"><unientity>8755</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 77"><unientity>8760</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 78"><unientity>8776</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 79"><unientity>8774</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 7A"><unientity>8766</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 7B"><unientity>8778</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 7C"><unientity>8768</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 7D"><unientity>874C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 56 7E"><unientity>8757</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 21"><unientity>8759</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 22"><unientity>8783</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 23"><unientity>8782</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 24"><unientity>87A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 25"><unientity>879E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 26"><unientity>878D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 27"><unientity>879F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 28"><unientity>87D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 29"><unientity>87C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2A"><unientity>87AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2B"><unientity>87B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2C"><unientity>87BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2D"><unientity>87C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2E"><unientity>87D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 2F"><unientity>87BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 30"><unientity>87C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 31"><unientity>87CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 32"><unientity>87EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 33"><unientity>87F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 34"><unientity>87EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 35"><unientity>87FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 36"><unientity>8805</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 37"><unientity>880D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 38"><unientity>87F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 39"><unientity>8814</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3A"><unientity>8815</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3B"><unientity>8822</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3C"><unientity>8823</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3D"><unientity>8821</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3E"><unientity>881F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 3F"><unientity>8831</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 40"><unientity>8839</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 41"><unientity>8836</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 42"><unientity>883B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 43"><unientity>8840</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 44"><unientity>884C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 45"><unientity>884D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 46"><unientity>E950</unientity><unientityalt>8853</unientityalt><desc>Variant of 4B5746 which maps to 8853</desc></character>
+<character hex="21 57 47"><unientity>8857</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 48"><unientity>8859</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 49"><unientity>885B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4A"><unientity>885D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4B"><unientity>8861</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4C"><unientity>8862</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4D"><unientity>8863</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4E"><unientity>521D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 4F"><unientity>8868</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 50"><unientity>886B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 51"><unientity>8882</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 52"><unientity>8881</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 53"><unientity>8870</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 54"><unientity>8877</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 55"><unientity>8888</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 56"><unientity>88AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 57"><unientity>8892</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 58"><unientity>8896</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 59"><unientity>888D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5A"><unientity>888B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5B"><unientity>889E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5C"><unientity>88C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5D"><unientity>88C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5E"><unientity>88B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 5F"><unientity>88DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 60"><unientity>88D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 61"><unientity>88D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 62"><unientity>88DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 63"><unientity>88CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 64"><unientity>88D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 65"><unientity>88DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 66"><unientity>88D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 67"><unientity>8902</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 68"><unientity>88F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 69"><unientity>88F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6A"><unientity>88F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6B"><unientity>88F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6C"><unientity>88FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6D"><unientity>88E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6E"><unientity>891A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 6F"><unientity>8910</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 71"><unientity>8913</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 72"><unientity>8912</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 73"><unientity>8932</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 74"><unientity>892A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 75"><unientity>8925</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 76"><unientity>892B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 77"><unientity>893B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 78"><unientity>8936</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 79"><unientity>8938</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 7A"><unientity>8944</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 7B"><unientity>895F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 7C"><unientity>8960</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 7D"><unientity>8956</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 57 7E"><unientity>8964</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 21"><unientity>896A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 22"><unientity>896F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 23"><unientity>8972</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 24"><unientity>897F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 25"><unientity>8981</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 26"><unientity>8983</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 28"><unientity>898B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 29"><unientity>898F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2A"><unientity>8993</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2B"><unientity>8996</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2C"><unientity>89AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2D"><unientity>89A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2E"><unientity>89AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 2F"><unientity>89B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 30"><unientity>89BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 31"><unientity>89BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 32"><unientity>89C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 33"><unientity>89D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 34"><unientity>89E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 35"><unientity>89F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 36"><unientity>89F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 37"><unientity>8A00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 38"><unientity>8A08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 39"><unientity>8A02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3A"><unientity>8A03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3B"><unientity>8A10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3C"><unientity>8A18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3D"><unientity>8A0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3E"><unientity>8A0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 3F"><unientity>8A15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 40"><unientity>8A0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 41"><unientity>8A16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 42"><unientity>8A17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 43"><unientity>8A13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 44"><unientity>8A2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 45"><unientity>8A23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 46"><unientity>8A1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 47"><unientity>8A25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 48"><unientity>8A31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 49"><unientity>8A2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4A"><unientity>8A1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4B"><unientity>8A1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4C"><unientity>8A3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4D"><unientity>8A60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4E"><unientity>8A55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 4F"><unientity>8A5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 51"><unientity>8A41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 52"><unientity>8A54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 53"><unientity>8A5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 54"><unientity>8A50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 55"><unientity>8A46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 56"><unientity>8A34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 57"><unientity>8A3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 58"><unientity>8A6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 59"><unientity>8A72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5A"><unientity>8A73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5B"><unientity>8A66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5C"><unientity>8A69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5D"><unientity>8A70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5E"><unientity>8A63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 5F"><unientity>8A7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 60"><unientity>8AA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 61"><unientity>8A87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 62"><unientity>8A85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 63"><unientity>8A6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 64"><unientity>8A79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 65"><unientity>8A62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 66"><unientity>8A71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 67"><unientity>8A6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 68"><unientity>8A6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 69"><unientity>8AAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6A"><unientity>8AA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6B"><unientity>8AA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6C"><unientity>8A9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6D"><unientity>8A8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6E"><unientity>8A93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 6F"><unientity>8AA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 70"><unientity>8A8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 71"><unientity>E951</unientity><unientityalt>8AA4</unientityalt><desc>Variant of 4B5871 which maps to 8AA4</desc></character>
+<character hex="21 58 72"><unientity>8AA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 73"><unientity>8AA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 74"><unientity>8A98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 75"><unientity>8A91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 76"><unientity>8ABC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 77"><unientity>8AC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 78"><unientity>8AD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 79"><unientity>8AC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 7A"><unientity>E952</unientity><unientityalt>8ACB</unientityalt><desc>Variant of 4B587A which maps to 8ACB</desc></character>
+<character hex="21 58 7B"><unientity>8AF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 7C"><unientity>8AB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 7D"><unientity>8ABF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 58 7E"><unientity>8AC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 21"><unientity>8AC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 22"><unientity>8AB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 23"><unientity>8A95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 24"><unientity>8AD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 25"><unientity>8AE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 26"><unientity>8AFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 27"><unientity>8AEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 28"><unientity>8AF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 29"><unientity>8AE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 2A"><unientity>8ADC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 2B"><unientity>8B00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 2C"><unientity>E953</unientity><unientityalt>8B01</unientityalt><desc>Variant of 2D592C which maps to 8B01</desc></character>
+<character hex="21 59 2D"><unientity>8B02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 2E"><unientity>8AFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 2F"><unientity>8AF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 30"><unientity>8AED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 31"><unientity>8B17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 32"><unientity>8B19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 33"><unientity>8B0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 34"><unientity>8B1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 35"><unientity>8B0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 36"><unientity>8B21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 37"><unientity>8B04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 38"><unientity>8B1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 39"><unientity>8B39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3A"><unientity>8B2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3B"><unientity>8B28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3C"><unientity>8B58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3D"><unientity>8B5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3E"><unientity>8B4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 3F"><unientity>8B49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 40"><unientity>8B5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 41"><unientity>8B41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 42"><unientity>8B4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 43"><unientity>8B70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 44"><unientity>8B6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 45"><unientity>8B66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 46"><unientity>8B6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 47"><unientity>8B74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 48"><unientity>8B77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 49"><unientity>8B7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4A"><unientity>8B80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4B"><unientity>8B8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4C"><unientity>8B93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4D"><unientity>8B96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4E"><unientity>8B92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 4F"><unientity>8B9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 51"><unientity>8C41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 52"><unientity>8C3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 53"><unientity>8C46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 54"><unientity>8C48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 55"><unientity>8C49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 56"><unientity>8C4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 57"><unientity>8C4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 58"><unientity>8C50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 59"><unientity>8C54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 5A"><unientity>8C5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 5C"><unientity>8C62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 5D"><unientity>8C6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 5E"><unientity>8C6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 5F"><unientity>8C6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 60"><unientity>8C7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 61"><unientity>8C79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 62"><unientity>8C82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 63"><unientity>8C8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 64"><unientity>8C89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 65"><unientity>8C8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 66"><unientity>8C8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 67"><unientity>8C93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 68"><unientity>8C9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 69"><unientity>8C9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6A"><unientity>8CA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6B"><unientity>8CA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6C"><unientity>8CA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6D"><unientity>8CAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6E"><unientity>8CAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 6F"><unientity>8CA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 70"><unientity>8CAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 71"><unientity>8CA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 72"><unientity>8CA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 73"><unientity>8CAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 75"><unientity>8CBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 76"><unientity>8CC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 77"><unientity>8CC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 78"><unientity>8CB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 79"><unientity>8CBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 7A"><unientity>8CB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 7B"><unientity>8CB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 7C"><unientity>8CBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 7D"><unientity>8CB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 59 7E"><unientity>8CBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 21"><unientity>8CC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 22"><unientity>8CC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 23"><unientity>8CCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 24"><unientity>8CC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 25"><unientity>8CC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 26"><unientity>8CB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 27"><unientity>8CC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 28"><unientity>8CC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 29"><unientity>8CD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 2A"><unientity>8CD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 2B"><unientity>8CD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 2C"><unientity>8CE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 2D"><unientity>8CE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 2F"><unientity>8CE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 30"><unientity>8CE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 31"><unientity>8CE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 32"><unientity>8CDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 33"><unientity>8CDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 34"><unientity>8CEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 35"><unientity>8CED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 36"><unientity>8CF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 37"><unientity>8CFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 38"><unientity>8CFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 39"><unientity>8D05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 3A"><unientity>8CFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 3B"><unientity>E954</unientity><unientityalt>8D08</unientityalt><desc>Variant of 4B5A3B which maps to 8D08</desc></character>
+<character hex="21 5A 3C"><unientity>8D0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 3D"><unientity>8D0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 3E"><unientity>8D0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 3F"><unientity>8D0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 40"><unientity>8D13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 41"><unientity>8D16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 42"><unientity>8D1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 43"><unientity>8D64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 44"><unientity>8D67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 45"><unientity>8D66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 46"><unientity>8D6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 47"><unientity>8D6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 48"><unientity>8D70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 49"><unientity>8D74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4A"><unientity>8D73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4B"><unientity>8D77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4C"><unientity>8D85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4D"><unientity>8D8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4E"><unientity>8D81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 4F"><unientity>8D99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 50"><unientity>8D95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 51"><unientity>8DA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 52"><unientity>8D9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 53"><unientity>8DA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 54"><unientity>8DB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 55"><unientity>8DB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 56"><unientity>8DBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 57"><unientity>8DCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 58"><unientity>8DDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 59"><unientity>8DDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5A"><unientity>8DCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5B"><unientity>8DDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5C"><unientity>8DC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5D"><unientity>8DD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5E"><unientity>8DCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 5F"><unientity>8DE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 60"><unientity>8DDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 61"><unientity>8DE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 62"><unientity>8DF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 63"><unientity>8DFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 64"><unientity>8DEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 65"><unientity>8DEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 66"><unientity>8DFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 67"><unientity>8E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 68"><unientity>8E10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 69"><unientity>8E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6A"><unientity>8E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6B"><unientity>8E0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6C"><unientity>8E29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6D"><unientity>8E1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6E"><unientity>8E44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 6F"><unientity>8E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 70"><unientity>8E42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 71"><unientity>8E34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 72"><unientity>8E39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 73"><unientity>8E35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 74"><unientity>8E49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 75"><unientity>8E4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 76"><unientity>8E48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 77"><unientity>8E4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 78"><unientity>8E63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 79"><unientity>8E59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 7A"><unientity>8E66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 7B"><unientity>8E64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 7C"><unientity>8E72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 7D"><unientity>8E6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5A 7E"><unientity>8E7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 21"><unientity>8E76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 22"><unientity>8E7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 23"><unientity>8E82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 24"><unientity>8E81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 25"><unientity>8E87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 26"><unientity>8E89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 27"><unientity>8E85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 28"><unientity>8E8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 29"><unientity>E955</unientity><unientityalt>8E8D</unientityalt><desc>Variant of 4B5B29 which maps to 8E8D</desc></character>
+<character hex="21 5B 2A"><unientity>8E91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 2B"><unientity>8EA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 2C"><unientity>8EAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 2D"><unientity>8EAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 2E"><unientity>8EAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 2F"><unientity>8EB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 30"><unientity>8EBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 31"><unientity>8EC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 32"><unientity>8ECA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 33"><unientity>8ECB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 34"><unientity>8ECD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 35"><unientity>8ECC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 36"><unientity>8ED2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 37"><unientity>8ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 38"><unientity>8EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 39"><unientity>8EDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3A"><unientity>8EFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3B"><unientity>8EF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3C"><unientity>8EFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3D"><unientity>8F03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3E"><unientity>8EFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 3F"><unientity>8F09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 40"><unientity>8F0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 41"><unientity>8F14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 42"><unientity>8F12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 43"><unientity>8F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 44"><unientity>8F13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 45"><unientity>8F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 46"><unientity>8F1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 47"><unientity>8F1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 48"><unientity>8F1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 49"><unientity>8F29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4A"><unientity>8F2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4B"><unientity>8F1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4C"><unientity>8F3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4D"><unientity>8F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4E"><unientity>8F38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 4F"><unientity>8F44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 50"><unientity>8F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 51"><unientity>8F45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 52"><unientity>E956</unientity><unientityalt>8F42</unientityalt><desc>Variant of 4B5B52 which maps to 8F42</desc></character>
+<character hex="21 5B 53"><unientity>8F3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 54"><unientity>8F4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 55"><unientity>8F49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 56"><unientity>8F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 57"><unientity>8F4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 58"><unientity>8F5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 59"><unientity>8F61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5A"><unientity>8F9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5B"><unientity>8F9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5C"><unientity>8F9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5D"><unientity>8FA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5E"><unientity>8FA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 5F"><unientity>8FA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 60"><unientity>8FAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 61"><unientity>8FAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 62"><unientity>8FB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 63"><unientity>8FB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 64"><unientity>8FB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 66"><unientity>8FC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 67"><unientity>8FC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 68"><unientity>8FC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 69"><unientity>5DE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 6A"><unientity>8FCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 6B"><unientity>8FD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 6C"><unientity>8FD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 6D"><unientity>E957</unientity><unientityalt>8FF0</unientityalt><desc>Variant of 275B6D which maps to 8FF0</desc></character>
+<character hex="21 5B 6E"><unientity>8FE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 6F"><unientity>8FE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 70"><unientity>8FEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 71"><unientity>8FE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 73"><unientity>8FEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 74"><unientity>9001</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 75"><unientity>9006</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 76"><unientity>8FF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 77"><unientity>9000</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 7A"><unientity>9003</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 7B"><unientity>8FFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 7C"><unientity>9005</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 7D"><unientity>9019</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5B 7E"><unientity>9023</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 21"><unientity>901F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 22"><unientity>9017</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 23"><unientity>901D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 24"><unientity>9010</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 26"><unientity>900D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 27"><unientity>901E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 28"><unientity>901A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 29"><unientity>9020</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2A"><unientity>900F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2B"><unientity>9022</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2C"><unientity>9016</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2D"><unientity>901B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2E"><unientity>9014</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 2F"><unientity>902E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 30"><unientity>9035</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 31"><unientity>9031</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 32"><unientity>FA25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 33"><unientity>9032</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 34"><unientity>904B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 36"><unientity>9053</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 37"><unientity>9042</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 38"><unientity>9050</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 39"><unientity>9054</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3A"><unientity>9055</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3B"><unientity>903C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3C"><unientity>9047</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3D"><unientity>904F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3E"><unientity>904E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 3F"><unientity>904D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 40"><unientity>9051</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 41"><unientity>9041</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 42"><unientity>903E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 43"><unientity>9058</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 44"><unientity>9060</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 45"><unientity>905C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 46"><unientity>9063</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 47"><unientity>9065</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 48"><unientity>905E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 49"><unientity>9069</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4A"><unientity>906E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4B"><unientity>9068</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4C"><unientity>906D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4D"><unientity>9075</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4E"><unientity>9074</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 4F"><unientity>9078</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 50"><unientity>9072</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 51"><unientity>9077</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 52"><unientity>907C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 53"><unientity>907A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 54"><unientity>907F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 55"><unientity>907D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 56"><unientity>9081</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 57"><unientity>9084</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 58"><unientity>9082</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 59"><unientity>9080</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5A"><unientity>9087</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5B"><unientity>908A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5C"><unientity>9090</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5D"><unientity>908F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5E"><unientity>9091</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 5F"><unientity>9095</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 60"><unientity>90A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 61"><unientity>90A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 62"><unientity>90AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 63"><unientity>90A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 64"><unientity>90B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 65"><unientity>90B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 66"><unientity>90B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 67"><unientity>90CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 68"><unientity>90CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6A"><unientity>90E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6B"><unientity>90E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6C"><unientity>90ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6D"><unientity>90F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6E"><unientity>90FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 6F"><unientity>9102</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 70"><unientity>9109</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 71"><unientity>9112</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 72"><unientity>9119</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 73"><unientity>912D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 74"><unientity>9130</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 75"><unientity>9127</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 76"><unientity>9131</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 77"><unientity>E958</unientity><unientityalt>9139</unientityalt><desc>Variant of 4B5C77 which maps to 9139</desc></character>
+<character hex="21 5C 78"><unientity>9149</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 79"><unientity>914B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 7A"><unientity>914A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 7B"><unientity>9152</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 7C"><unientity>914D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 7D"><unientity>914C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5C 7E"><unientity>9157</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 21"><unientity>9163</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 22"><unientity>9165</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 23"><unientity>916C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 24"><unientity>9169</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 25"><unientity>916A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 26"><unientity>9175</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 27"><unientity>9178</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 28"><unientity>9177</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 29"><unientity>9187</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2A"><unientity>9189</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2B"><unientity>918B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2C"><unientity>9183</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2D"><unientity>9192</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2E"><unientity>91A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 2F"><unientity>919E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 30"><unientity>919C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 31"><unientity>91AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 32"><unientity>91AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 33"><unientity>91BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 34"><unientity>91C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 35"><unientity>91C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 36"><unientity>91C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 37"><unientity>91C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 38"><unientity>91CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3A"><unientity>91CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3B"><unientity>91CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3C"><unientity>91CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3D"><unientity>91D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3E"><unientity>91D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 3F"><unientity>91DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 40"><unientity>91D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 41"><unientity>91D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 42"><unientity>91DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 43"><unientity>91F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 44"><unientity>91E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 45"><unientity>91E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 46"><unientity>91E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 47"><unientity>9223</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 48"><unientity>920D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 49"><unientity>9215</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 4A"><unientity>9209</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 4B"><unientity>9214</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 4C"><unientity>921E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 4D"><unientity>9210</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 4F"><unientity>9237</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 50"><unientity>9238</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 51"><unientity>923D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 52"><unientity>923E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 53"><unientity>9240</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 54"><unientity>924B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 55"><unientity>925B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 56"><unientity>9264</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 57"><unientity>9251</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 58"><unientity>E959</unientity><unientityalt>9234</unientityalt><desc>Variant of 4B5D58 which maps to 9234</desc></character>
+<character hex="21 5D 59"><unientity>9278</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5A"><unientity>9280</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5B"><unientity>92AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5C"><unientity>9285</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5D"><unientity>9298</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5E"><unientity>9296</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 5F"><unientity>927B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 60"><unientity>9293</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 61"><unientity>929C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 62"><unientity>92C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 63"><unientity>92BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 64"><unientity>92B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 65"><unientity>92EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 66"><unientity>92B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 67"><unientity>92C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 68"><unientity>92E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 69"><unientity>92BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6A"><unientity>92D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6B"><unientity>9320</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6C"><unientity>9336</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6D"><unientity>92F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6E"><unientity>9333</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 6F"><unientity>932F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 70"><unientity>9322</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 71"><unientity>92FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 72"><unientity>932B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 73"><unientity>931A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 74"><unientity>9304</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 75"><unientity>9310</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 76"><unientity>9326</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 77"><unientity>934D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 78"><unientity>9382</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 79"><unientity>9375</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 7A"><unientity>9365</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 7C"><unientity>934B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 7D"><unientity>9328</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5D 7E"><unientity>9370</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 21"><unientity>937E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 22"><unientity>9318</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 23"><unientity>936C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 24"><unientity>935B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 25"><unientity>938A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 26"><unientity>9394</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 27"><unientity>93AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 28"><unientity>9396</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 29"><unientity>93A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2A"><unientity>93B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2B"><unientity>93E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2C"><unientity>93D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2D"><unientity>93D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2E"><unientity>93C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 2F"><unientity>93DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 30"><unientity>93D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 31"><unientity>93C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 32"><unientity>93E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 33"><unientity>93DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 34"><unientity>93E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 35"><unientity>93DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 36"><unientity>93CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 37"><unientity>93D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 39"><unientity>9403</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3A"><unientity>942E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3B"><unientity>93FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3C"><unientity>9433</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3D"><unientity>9435</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3E"><unientity>943A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 3F"><unientity>9438</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 40"><unientity>9432</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 42"><unientity>9451</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 43"><unientity>9444</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 44"><unientity>9463</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 45"><unientity>9460</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 46"><unientity>9472</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 47"><unientity>9470</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 48"><unientity>947E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 49"><unientity>947C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4A"><unientity>947D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4B"><unientity>947F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4C"><unientity>9577</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4D"><unientity>9580</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4E"><unientity>9582</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 4F"><unientity>9583</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 50"><unientity>9589</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 51"><unientity>9594</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 52"><unientity>958F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 53"><unientity>958B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 54"><unientity>9591</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 55"><unientity>9593</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 56"><unientity>9592</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 57"><unientity>9598</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 58"><unientity>95A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 59"><unientity>95A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5A"><unientity>95A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5B"><unientity>95A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5C"><unientity>95A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5D"><unientity>95A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5E"><unientity>95B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 5F"><unientity>95AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 60"><unientity>95BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 61"><unientity>95CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 62"><unientity>95CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 63"><unientity>95CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 64"><unientity>95C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 65"><unientity>95C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 67"><unientity>95D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 68"><unientity>95D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 69"><unientity>95DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6A"><unientity>95E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6B"><unientity>95E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6C"><unientity>961C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6D"><unientity>9621</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6E"><unientity>9632</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 6F"><unientity>9631</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 70"><unientity>962E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 71"><unientity>962A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 72"><unientity>9640</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 73"><unientity>963F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 74"><unientity>963B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 75"><unientity>9644</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 76"><unientity>9650</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 77"><unientity>964C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 78"><unientity>964B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 79"><unientity>964D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 7A"><unientity>9662</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 7B"><unientity>9663</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 7C"><unientity>965B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 7D"><unientity>9661</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5E 7E"><unientity>965D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 21"><unientity>9664</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 22"><unientity>966A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 23"><unientity>9673</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 24"><unientity>9678</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 25"><unientity>9675</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 26"><unientity>9672</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 27"><unientity>9676</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 28"><unientity>9677</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 29"><unientity>9674</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2A"><unientity>9670</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2B"><unientity>968A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2C"><unientity>968E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2D"><unientity>968B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2E"><unientity>967D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 2F"><unientity>9685</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 30"><unientity>9686</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 31"><unientity>968D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 32"><unientity>9698</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 33"><unientity>9694</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 34"><unientity>9699</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 35"><unientity>9695</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 36"><unientity>969C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 37"><unientity>969B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 38"><unientity>96A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 39"><unientity>96A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3A"><unientity>96AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3B"><unientity>96B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3C"><unientity>96B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3D"><unientity>96B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3E"><unientity>96BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 3F"><unientity>96C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 40"><unientity>96C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 41"><unientity>96C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 42"><unientity>96C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 43"><unientity>96C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 44"><unientity>96C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 45"><unientity>96CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 46"><unientity>96CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 47"><unientity>96C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 48"><unientity>96CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 49"><unientity>96D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4A"><unientity>96D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4B"><unientity>96DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4C"><unientity>96DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4D"><unientity>96DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4E"><unientity>96D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 4F"><unientity>96E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 50"><unientity>E95A</unientity><unientityalt>96E3</unientityalt><desc>Variant of 4B5F50 which maps to 96E3</desc></character>
+<character hex="21 5F 51"><unientity>96E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 52"><unientity>96EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 53"><unientity>96EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 54"><unientity>96F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 55"><unientity>96FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 56"><unientity>96F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 57"><unientity>96F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 58"><unientity>96F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 59"><unientity>9700</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5A"><unientity>9707</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5B"><unientity>9704</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5C"><unientity>9709</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5D"><unientity>9706</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5E"><unientity>9711</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 5F"><unientity>970E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 60"><unientity>9716</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 61"><unientity>970F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 62"><unientity>970D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 63"><unientity>9713</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 64"><unientity>971C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 65"><unientity>971E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 66"><unientity>972A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 67"><unientity>9727</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 68"><unientity>9738</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 69"><unientity>9739</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6A"><unientity>9732</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6B"><unientity>973D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6C"><unientity>973E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6D"><unientity>9744</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6E"><unientity>9742</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 6F"><unientity>9748</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 70"><unientity>9751</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 71"><unientity>FA1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 72"><unientity>E95B</unientity><unientityalt>975B</unientityalt><desc>Variant of 4B5F72 which maps to 975B</desc></character>
+<character hex="21 5F 73"><unientity>975C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 74"><unientity>975E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 75"><unientity>9760</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 76"><unientity>9761</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 78"><unientity>9766</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 79"><unientity>9768</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 7A"><unientity>9769</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 7B"><unientity>9776</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 7C"><unientity>9774</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 7D"><unientity>977C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 5F 7E"><unientity>9785</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 21"><unientity>978D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 22"><unientity>978B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 23"><unientity>978F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 24"><unientity>9798</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 25"><unientity>97A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 26"><unientity>97A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 27"><unientity>97A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 28"><unientity>97AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 29"><unientity>97C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2A"><unientity>97C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2B"><unientity>97C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2C"><unientity>97CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2D"><unientity>97CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2E"><unientity>97D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 2F"><unientity>97DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 30"><unientity>97ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 31"><unientity>97F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 32"><unientity>7AE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 33"><unientity>7ADF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 34"><unientity>97F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 35"><unientity>97FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 36"><unientity>E95C</unientity><unientityalt>97FF</unientityalt><desc>Variant of 456036 which maps to 97FF</desc></character>
+<character hex="21 60 37"><unientity>9801</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 38"><unientity>9802</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 39"><unientity>9803</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3A"><unientity>9805</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3B"><unientity>9806</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3C"><unientity>9808</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3D"><unientity>9810</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3E"><unientity>980A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 3F"><unientity>9811</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 40"><unientity>9813</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 41"><unientity>9812</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 42"><unientity>980C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 43"><unientity>9817</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 44"><unientity>E95D</unientity><unientityalt>9818</unientityalt><desc>Variant of 4B6044 which maps to 9818</desc></character>
+<character hex="21 60 45"><unientity>9821</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 46"><unientity>982D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 47"><unientity>9830</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 48"><unientity>9838</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 49"><unientity>983B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4A"><unientity>9839</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4B"><unientity>9837</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4C"><unientity>9824</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4D"><unientity>9846</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4E"><unientity>9854</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 4F"><unientity>984D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 50"><unientity>984C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 51"><unientity>984E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 52"><unientity>9853</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 53"><unientity>E95E</unientity><unientityalt>985E</unientityalt><desc>Variant of 4B6053 which maps to 985E</desc></character>
+<character hex="21 60 54"><unientity>985A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 55"><unientity>9858</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 56"><unientity>9867</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 57"><unientity>986B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 58"><unientity>986F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 59"><unientity>9871</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5A"><unientity>9870</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5B"><unientity>98A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5C"><unientity>98AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5D"><unientity>98B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5E"><unientity>98B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 5F"><unientity>98B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 60"><unientity>98BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 61"><unientity>98BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 62"><unientity>98C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 63"><unientity>98DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 64"><unientity>98DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 65"><unientity>98E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 66"><unientity>98E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 67"><unientity>98E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 68"><unientity>98ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 69"><unientity>98EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6A"><unientity>98EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6B"><unientity>98EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6C"><unientity>98FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6D"><unientity>98F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6E"><unientity>98FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 6F"><unientity>98FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 70"><unientity>9903</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 71"><unientity>990A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 72"><unientity>990C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 73"><unientity>9909</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 74"><unientity>9910</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 75"><unientity>9912</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 76"><unientity>9918</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 77"><unientity>9913</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 78"><unientity>9905</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 79"><unientity>9928</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 7A"><unientity>991E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 7B"><unientity>991B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 7C"><unientity>9921</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 7D"><unientity>9935</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 60 7E"><unientity>993E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 21"><unientity>993F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 22"><unientity>993D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 23"><unientity>9945</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 24"><unientity>9952</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 25"><unientity>9951</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 26"><unientity>995C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 27"><unientity>995E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 28"><unientity>9996</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 29"><unientity>9999</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2A"><unientity>99A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2B"><unientity>99A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2C"><unientity>99AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2D"><unientity>99AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2E"><unientity>99AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 2F"><unientity>99B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 30"><unientity>99B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 31"><unientity>99B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 32"><unientity>99C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 33"><unientity>99D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 34"><unientity>99DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 35"><unientity>99D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 36"><unientity>99DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 37"><unientity>99DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 38"><unientity>99D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 39"><unientity>99D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3A"><unientity>99D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3B"><unientity>99ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3C"><unientity>99F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3D"><unientity>9A01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3E"><unientity>99FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 3F"><unientity>99E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 40"><unientity>9A0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 41"><unientity>9A19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 42"><unientity>9A16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 43"><unientity>9A2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 44"><unientity>9A30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 45"><unientity>9A37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 46"><unientity>9A43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 47"><unientity>9A45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 48"><unientity>9A40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 49"><unientity>9A3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4A"><unientity>9A55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4B"><unientity>9A5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4C"><unientity>9A5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4D"><unientity>9A57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4E"><unientity>9A5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 4F"><unientity>9A62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 50"><unientity>9A65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 51"><unientity>9A6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 52"><unientity>9AA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 53"><unientity>9AAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 54"><unientity>9AB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 55"><unientity>9AB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 56"><unientity>9AB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 57"><unientity>9ABC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 58"><unientity>9ACF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 59"><unientity>9AD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 5A"><unientity>9AD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 5B"><unientity>9AD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 5C"><unientity>9AD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 5D"><unientity>9AE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 5F"><unientity>9AEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 60"><unientity>9AFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 61"><unientity>9AED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 62"><unientity>9B03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 63"><unientity>9B06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 64"><unientity>9B0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 65"><unientity>9B1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 66"><unientity>9B22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 67"><unientity>9B25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 68"><unientity>9B27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6A"><unientity>9B31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6B"><unientity>9B32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6C"><unientity>9B3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6D"><unientity>9B41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6E"><unientity>9B42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 6F"><unientity>9B45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 70"><unientity>9B44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 71"><unientity>9B4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 72"><unientity>9B54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 73"><unientity>9B58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 74"><unientity>9B5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 75"><unientity>9B77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 76"><unientity>9B6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 77"><unientity>9B91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 78"><unientity>9BAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 79"><unientity>9BAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 7A"><unientity>9BAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 7B"><unientity>9BCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 7C"><unientity>9BC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 7D"><unientity>9BE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 61 7E"><unientity>9BE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 21"><unientity>9C13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 22"><unientity>9C0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 23"><unientity>9BFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 24"><unientity>9C2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 25"><unientity>9C25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 26"><unientity>9C31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 27"><unientity>9C3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 28"><unientity>9C3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 29"><unientity>9C54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2A"><unientity>9C57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2B"><unientity>9C56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2C"><unientity>9C49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2D"><unientity>9C77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2E"><unientity>9C78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 2F"><unientity>9CE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 30"><unientity>9CE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 31"><unientity>9CF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 32"><unientity>9CF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 33"><unientity>9CF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 34"><unientity>9D06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 35"><unientity>9D09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 36"><unientity>9D15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 37"><unientity>9D23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 38"><unientity>9D28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 39"><unientity>9D26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 3A"><unientity>9D1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 3B"><unientity>E95F</unientity><unientityalt>9D12</unientityalt><desc>Variant of 4B623B which maps to 9D12</desc></character>
+<character hex="21 62 3C"><unientity>9D3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 3D"><unientity>9D3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 3E"><unientity>9D61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 3F"><unientity>9D51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 40"><unientity>9D60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 41"><unientity>9D5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 42"><unientity>9D89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 43"><unientity>9D72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 44"><unientity>9D6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 45"><unientity>9D6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 46"><unientity>9DB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 47"><unientity>9DAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 48"><unientity>9DC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 49"><unientity>9DD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4A"><unientity>9DD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4B"><unientity>9DE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4C"><unientity>9DF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4D"><unientity>9DFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4E"><unientity>9E1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 4F"><unientity>9E1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 50"><unientity>9E79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 51"><unientity>9E7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 52"><unientity>9E7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 53"><unientity>9E7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 54"><unientity>9E82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 55"><unientity>9E8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 56"><unientity>9E97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 57"><unientity>9E92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 58"><unientity>9E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 59"><unientity>9E9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5A"><unientity>9E9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5B"><unientity>9EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5C"><unientity>9EA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5D"><unientity>9EB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5E"><unientity>9EB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 5F"><unientity>9EBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 60"><unientity>9EBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 61"><unientity>9EBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 62"><unientity>9EC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 63"><unientity>9ECD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 64"><unientity>9ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 65"><unientity>9ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 66"><unientity>9ED1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 67"><unientity>58A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 68"><unientity>9ED8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 69"><unientity>9ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6A"><unientity>9EDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6B"><unientity>9EDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6C"><unientity>9EDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6D"><unientity>9EDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6E"><unientity>9EE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 6F"><unientity>9EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 70"><unientity>9EEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 71"><unientity>9EF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 72"><unientity>9EF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 73"><unientity>9F07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 74"><unientity>9F0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 75"><unientity>9F13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 76"><unientity>9F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 77"><unientity>9F19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 78"><unientity>9F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 79"><unientity>9F2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 7A"><unientity>9F34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 7B"><unientity>9F3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 7C"><unientity>9F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 7D"><unientity>9F4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 62 7E"><unientity>9F4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 21"><unientity>9F52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 22"><unientity>9F5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 23"><unientity>9F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 24"><unientity>E960</unientity><unientityalt>9F61</unientityalt><desc>Variant of 456324 which maps to 9F61</desc></character>
+<character hex="21 63 25"><unientity>9F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 26"><unientity>9F5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 27"><unientity>9F6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 28"><unientity>9F6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 29"><unientity>9F77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 2A"><unientity>9F72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 2B"><unientity>9F8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 2C"><unientity>9F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 2D"><unientity>9F9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 63 30"><unientity>8288</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 24"><unientity>4E0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 25"><unientity>5187</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 29"><unientity>4E28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 2E"><unientity>4E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 31"><unientity>4E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 33"><unientity>4E3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 34"><unientity>4E42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 37"><unientity>738D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 3C"><unientity>4E5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 3F"><unientity>6C39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 46"><unientity>4E85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 50"><unientity>4EA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 51"><unientity>4EA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 52"><unientity>4EB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 55"><unientity>E961</unientity><unientityalt>4EB6</unientityalt><desc>Variant of 4B6455 which maps to 4EB6</desc></character>
+<character hex="21 64 58"><unientity>4EB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 5A"><unientity>4EBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 5E"><unientity>4EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 61"><unientity>4EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 62"><unientity>E9E2</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 64 63"><unientity>4EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 6B"><unientity>4EE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 72"><unientity>4F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 73"><unientity>4F0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 75"><unientity>4F03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 64 7C"><unientity>4F22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 27"><unientity>4EF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 28"><unientity>4F07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 2A"><unientity>4F00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 2C"><unientity>4F0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 32"><unientity>4F3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 36"><unientity>4F58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 37"><unientity>4F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 39"><unientity>4F64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 3A"><unientity>4F49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 3F"><unientity>4F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 40"><unientity>4F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 44"><unientity>4F67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 4D"><unientity>4F68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 4E"><unientity>4F5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 4F"><unientity>4F5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 56"><unientity>4F82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 57"><unientity>4F7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 5A"><unientity>4F98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 5B"><unientity>4F92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 5C"><unientity>4F7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 60"><unientity>4F80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 61"><unientity>4F74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 62"><unientity>4F76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 64"><unientity>4FA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 66"><unientity>4F91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 67"><unientity>4F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 6C"><unientity>4F4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 6D"><unientity>4F97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 6E"><unientity>4F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 70"><unientity>4F79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 71"><unientity>4F9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 72"><unientity>4F81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 73"><unientity>4F78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 76"><unientity>4F9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 77"><unientity>4F90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 7B"><unientity>4F7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 65 7C"><unientity>4FCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 22"><unientity>4FE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 26"><unientity>4FB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 27"><unientity>4FC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 29"><unientity>4FC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 2A"><unientity>4FE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 2C"><unientity>4FE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 33"><unientity>4FDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 35"><unientity>4FD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 37"><unientity>4FC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 3B"><unientity>4FDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 3E"><unientity>4FC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 43"><unientity>4FB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 46"><unientity>501E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 48"><unientity>503F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 49"><unientity>5005</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 4C"><unientity>5007</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 4D"><unientity>5013</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 4E"><unientity>5022</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 52"><unientity>4FF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 59"><unientity>4FF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 5B"><unientity>5037</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 5E"><unientity>502E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 61"><unientity>4FF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 62"><unientity>501C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 66"><unientity>502C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 69"><unientity>5010</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 66 79"><unientity>503D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 22"><unientity>506F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 23"><unientity>5050</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 25"><unientity>5070</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 29"><unientity>5053</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 2A"><unientity>506A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 2C"><unientity>5056</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 31"><unientity>506D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 38"><unientity>505D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 39"><unientity>5048</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 3B"><unientity>5058</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 3C"><unientity>5072</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 41"><unientity>5041</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 46"><unientity>5015</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 48"><unientity>507A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 4A"><unientity>506C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 4B"><unientity>505F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 4D"><unientity>506B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 4E"><unientity>5094</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 50"><unientity>509E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 52"><unientity>509B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 53"><unientity>509A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 57"><unientity>50A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 5A"><unientity>508C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 5C"><unientity>5088</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 62"><unientity>508E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 64"><unientity>5095</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 67"><unientity>50A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 6A"><unientity>5092</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 6C"><unientity>509C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 71"><unientity>50C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 75"><unientity>50C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 7B"><unientity>50CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 67 7C"><unientity>50B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 22"><unientity>50C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 2C"><unientity>50BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 2E"><unientity>50CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 32"><unientity>50D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 34"><unientity>50EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 35"><unientity>50E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 3A"><unientity>50F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 3B"><unientity>50CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 3C"><unientity>50DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 41"><unientity>50F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 42"><unientity>50E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 44"><unientity>50F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 46"><unientity>50D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 55"><unientity>50EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 5B"><unientity>510E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 5F"><unientity>5105</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 61"><unientity>50FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 65"><unientity>5106</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 66"><unientity>5107</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 67"><unientity>510F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 68"><unientity>50FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 69"><unientity>510B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 6A"><unientity>50FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 6D"><unientity>5101</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 71"><unientity>5115</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 72"><unientity>5113</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 78"><unientity>511A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 79"><unientity>9797</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 68 7E"><unientity>5126</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 29"><unientity>5124</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 2B"><unientity>5129</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 30"><unientity>5131</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 3E"><unientity>5135</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 40"><unientity>5133</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 44"><unientity>513A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 47"><unientity>5139</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 48"><unientity>513B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 51"><unientity>5159</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 52"><unientity>515B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 55"><unientity>515D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 56"><unientity>515E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 58"><unientity>515F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 59"><unientity>5161</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 5C"><unientity>5163</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 67"><unientity>5182</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 69"><unientity>5184</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 6E"><unientity>518F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 70"><unientity>5194</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 71"><unientity>5193</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 75"><unientity>5196</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 7B"><unientity>51A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 69 7C"><unientity>51A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 22"><unientity>51AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 23"><unientity>51AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 26"><unientity>51B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 35"><unientity>51BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 43"><unientity>51CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 46"><unientity>51C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 4E"><unientity>51D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 4F"><unientity>51D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 54"><unientity>51D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 63"><unientity>51D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 66"><unientity>51DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 68"><unientity>51E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 73"><unientity>5160</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 78"><unientity>51F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6A 79"><unientity>51F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 24"><unientity>5213</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 26"><unientity>5216</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 2A"><unientity>521C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 33"><unientity>5231</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 36"><unientity>5235</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 37"><unientity>5232</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 39"><unientity>5233</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 3E"><unientity>5244</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 43"><unientity>5249</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 47"><unientity>5260</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 4B"><unientity>525A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 4C"><unientity>5252</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 4D"><unientity>525E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 50"><unientity>525F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 53"><unientity>5255</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 5B"><unientity>526E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 5E"><unientity>5268</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 5F"><unientity>7B9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 6B"><unientity>5278</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 74"><unientity>5282</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 75"><unientity>5281</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 79"><unientity>528C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 7A"><unientity>528A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6B 7C"><unientity>5290</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 21"><unientity>5293</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 27"><unientity>5296</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 29"><unientity>5298</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 2B"><unientity>529A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 2C"><unientity>5299</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 2E"><unientity>52A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 31"><unientity>52AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 33"><unientity>52AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 37"><unientity>52BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 38"><unientity>52BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 3C"><unientity>52CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 3D"><unientity>52CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 40"><unientity>52D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 41"><unientity>52D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 46"><unientity>52D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 48"><unientity>52D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 4C"><unientity>52E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 4E"><unientity>52E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 50"><unientity>55E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 53"><unientity>52E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 58"><unientity>52F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 5A"><unientity>52F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 5E"><unientity>52F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 61"><unientity>52F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 62"><unientity>52FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 64"><unientity>52FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 69"><unientity>5307</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 6A"><unientity>5303</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 6B"><unientity>E9E3</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 6C 6E"><unientity>530A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 6F"><unientity>530B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 77"><unientity>5311</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6C 7B"><unientity>6706</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 23"><unientity>531A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 24"><unientity>531C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 25"><unientity>531F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 2E"><unientity>532D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 33"><unientity>5330</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 36"><unientity>5335</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 3A"><unientity>5338</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 3E"><unientity>533D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 41"><unientity>534C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 42"><unientity>534D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 4B"><unientity>535D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 4C"><unientity>5363</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 4E"><unientity>E9E4</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 6D 53"><unientity>536C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 57"><unientity>5372</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 58"><unientity>537A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 5D"><unientity>5380</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 64"><unientity>538E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 66"><unientity>5393</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 67"><unientity>5394</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 6D"><unientity>5399</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 74"><unientity>8652</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 7A"><unientity>53A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6D 7B"><unientity>53AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 2C"><unientity>53B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 2E"><unientity>53B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 3E"><unientity>53D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 48"><unientity>53DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 57"><unientity>53FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 58"><unientity>535F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 61"><unientity>5414</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 68"><unientity>5406</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 6C"><unientity>544C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 6D"><unientity>5445</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 6F"><unientity>541A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 70"><unientity>5432</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 76"><unientity>5421</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 78"><unientity>5430</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 79"><unientity>5454</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6E 7D"><unientity>543D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 21"><unientity>544F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 24"><unientity>542A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 26"><unientity>5422</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 27"><unientity>5423</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 2E"><unientity>545F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 2F"><unientity>549C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 35"><unientity>5488</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 37"><unientity>547F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 39"><unientity>5482</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 3A"><unientity>546D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 3B"><unientity>5491</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 42"><unientity>5494</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 43"><unientity>546B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 49"><unientity>548D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 4A"><unientity>5463</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 4B"><unientity>5474</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 52"><unientity>5466</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 53"><unientity>5464</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 55"><unientity>54A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 58"><unientity>54A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 5A"><unientity>54AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 5B"><unientity>54BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 5C"><unientity>54CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 5E"><unientity>54BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 60"><unientity>54A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 63"><unientity>54A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 64"><unientity>54B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 66"><unientity>54A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 67"><unientity>5472</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 68"><unientity>5470</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 69"><unientity>54BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 6A"><unientity>54B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 6B"><unientity>54DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 6C"><unientity>54D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 6D"><unientity>54AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 71"><unientity>54BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 74"><unientity>54C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 7B"><unientity>551A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 7C"><unientity>54E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 6F 7D"><unientity>5507</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 23"><unientity>5517</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 24"><unientity>54FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 25"><unientity>54E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 27"><unientity>54F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 2A"><unientity>54E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 2B"><unientity>550A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 2D"><unientity>54FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 2E"><unientity>5518</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 30"><unientity>5504</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 32"><unientity>54EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 34"><unientity>5508</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 38"><unientity>54F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 39"><unientity>54F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 3E"><unientity>550E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 44"><unientity>5523</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 46"><unientity>550F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 47"><unientity>5511</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 4B"><unientity>5575</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 4D"><unientity>5573</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 4E"><unientity>554C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 4F"><unientity>5576</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 50"><unientity>554D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 51"><unientity>555A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 53"><unientity>553C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 55"><unientity>5550</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 57"><unientity>5539</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 58"><unientity>5548</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 59"><unientity>552D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 5A"><unientity>5551</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 5D"><unientity>552A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 60"><unientity>5562</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 61"><unientity>5536</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 64"><unientity>5549</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 68"><unientity>5530</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 6A"><unientity>5540</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 6B"><unientity>5535</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 70"><unientity>5545</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 79"><unientity>553F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 7B"><unientity>5541</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 70 7D"><unientity>5565</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 23"><unientity>5591</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 25"><unientity>5577</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 26"><unientity>55A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 27"><unientity>55AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 2A"><unientity>5605</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 2D"><unientity>5593</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 2F"><unientity>5586</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 34"><unientity>5588</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 36"><unientity>55B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 43"><unientity>E962</unientity><unientityalt>55E2</unientityalt><desc>Variant of 2D7143 which maps to 55E2</desc></character>
+<character hex="21 71 44"><unientity>5581</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 45"><unientity>558E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 47"><unientity>55B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 49"><unientity>558F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 4B"><unientity>5559</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 50"><unientity>55A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 51"><unientity>5592</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 52"><unientity>5599</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 56"><unientity>55F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 58"><unientity>55CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 59"><unientity>55D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5A"><unientity>55DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5B"><unientity>55CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5C"><unientity>55DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5D"><unientity>55D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5E"><unientity>55C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 5F"><unientity>55C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 61"><unientity>55CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 62"><unientity>55DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 64"><unientity>55D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 65"><unientity>55C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 69"><unientity>55E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 6F"><unientity>55CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 70"><unientity>55D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 75"><unientity>55E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 77"><unientity>55D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 78"><unientity>55C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 79"><unientity>55F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 71 7E"><unientity>5627</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 24"><unientity>55FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 25"><unientity>5612</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 27"><unientity>55F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 28"><unientity>560F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 2B"><unientity>55F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 2E"><unientity>561E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 31"><unientity>560C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 34"><unientity>561C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 35"><unientity>5610</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 36"><unientity>5601</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 38"><unientity>5613</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 39"><unientity>55F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 3C"><unientity>5602</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 42"><unientity>561D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 44"><unientity>55FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 47"><unientity>5642</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 48"><unientity>564C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 4B"><unientity>564B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 52"><unientity>5640</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 55"><unientity>5635</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 57"><unientity>5649</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 58"><unientity>5641</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 5C"><unientity>5658</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 5D"><unientity>5620</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 5E"><unientity>5654</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 60"><unientity>562A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 61"><unientity>563D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 64"><unientity>562C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 67"><unientity>5638</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 69"><unientity>564D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 6B"><unientity>562B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 6C"><unientity>564F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 6E"><unientity>5670</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 6F"><unientity>565F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 70"><unientity>567C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 72"><unientity>5660</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 78"><unientity>5676</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 7A"><unientity>5666</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 7B"><unientity>5673</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 7C"><unientity>566D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 72 7E"><unientity>5672</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 25"><unientity>5693</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 28"><unientity>568C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 32"><unientity>56BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 34"><unientity>5686</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 35"><unientity>5684</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 36"><unientity>5691</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 37"><unientity>568A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 3E"><unientity>569E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 41"><unientity>569C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 42"><unientity>569A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 45"><unientity>5699</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 4B"><unientity>56AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 4C"><unientity>56A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 4E"><unientity>56AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 53"><unientity>56B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 5A"><unientity>56B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 5B"><unientity>56C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 60"><unientity>56C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 62"><unientity>56CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 67"><unientity>56CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 6A"><unientity>56D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 6B"><unientity>56D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 6D"><unientity>56DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 6F"><unientity>56E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 70"><unientity>56DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 75"><unientity>56EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 76"><unientity>56EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 77"><unientity>56E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 79"><unientity>56FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 73 7E"><unientity>56F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 21"><unientity>56F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 24"><unientity>56FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 27"><unientity>5705</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 28"><unientity>5704</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 29"><unientity>5702</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 2C"><unientity>570A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 2D"><unientity>5709</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 2E"><unientity>5707</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 30"><unientity>570C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 31"><unientity>5715</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 32"><unientity>5714</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 35"><unientity>571A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 36"><unientity>571B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 37"><unientity>571C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 39"><unientity>571D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 3A"><unientity>571E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 41"><unientity>5724</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 42"><unientity>572E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 43"><unientity>5729</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 48"><unientity>5738</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 4C"><unientity>572A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 63"><unientity>5749</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 65"><unientity>5745</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 68"><unientity>574B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 69"><unientity>574C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 6A"><unientity>573F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 70"><unientity>5768</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 75"><unientity>578A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 77"><unientity>576D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 79"><unientity>5774</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 74 7A"><unientity>5767</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 26"><unientity>5770</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 28"><unientity>5771</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 2A"><unientity>576E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 2D"><unientity>5776</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 2E"><unientity>5789</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 30"><unientity>577F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 31"><unientity>5775</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 32"><unientity>577B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 33"><unientity>5788</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 35"><unientity>5773</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 38"><unientity>579F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 39"><unientity>5790</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 3A"><unientity>5793</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 3F"><unientity>579E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 40"><unientity>57B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 43"><unientity>579A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 45"><unientity>5794</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 47"><unientity>57A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 48"><unientity>5799</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 49"><unientity>578C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 4B"><unientity>5797</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 4E"><unientity>579D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 52"><unientity>579C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 54"><unientity>57A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 57"><unientity>57A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 59"><unientity>EA00</unientity><desc>East Asian ideograph not found in unified han</desc></character>
+<character hex="21 75 5B"><unientity>5795</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 5F"><unientity>57B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 60"><unientity>57C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 6A"><unientity>5809</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 6C"><unientity>57BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 71"><unientity>57DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 73"><unientity>57D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 77"><unientity>57D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 75 7E"><unientity>57C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 22"><unientity>57C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 27"><unientity>70FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 29"><unientity>57E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 2A"><unientity>57FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 2B"><unientity>5803</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 2C"><unientity>57F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 2D"><unientity>57E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 31"><unientity>57ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 33"><unientity>5800</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 35"><unientity>57EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 36"><unientity>5807</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 39"><unientity>580E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 3B"><unientity>580F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 3D"><unientity>57F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 3E"><unientity>5810</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 40"><unientity>580D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 43"><unientity>57EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 48"><unientity>5801</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 49"><unientity>5812</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 4D"><unientity>57FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 4E"><unientity>57F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 50"><unientity>580C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 51"><unientity>5813</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 52"><unientity>57F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 56"><unientity>580B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 58"><unientity>57F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 59"><unientity>5804</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 5A"><unientity>57CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 5B"><unientity>57DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 5F"><unientity>5847</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 67"><unientity>581B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 69"><unientity>5819</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 6A"><unientity>5833</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 6C"><unientity>581E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 6D"><unientity>583F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 71"><unientity>5827</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 76"><unientity>5828</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 78"><unientity>582E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 7A"><unientity>581D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 76 7D"><unientity>5844</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 21"><unientity>5848</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 23"><unientity>5818</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 26"><unientity>57F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 29"><unientity>582D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 2B"><unientity>5820</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 30"><unientity>584E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 33"><unientity>585D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 35"><unientity>5859</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 37"><unientity>584B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 3D"><unientity>5865</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 40"><unientity>586C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 42"><unientity>5852</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 45"><unientity>5864</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 47"><unientity>5853</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 48"><unientity>584F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 49"><unientity>583D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 4D"><unientity>584D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 4E"><unientity>5856</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 55"><unientity>589A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 58"><unientity>5892</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 5A"><unientity>588E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 5C"><unientity>5889</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 5F"><unientity>5840</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 60"><unientity>589B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 61"><unientity>587C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 63"><unientity>5888</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 65"><unientity>5890</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 68"><unientity>5898</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 6B"><unientity>587D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 6F"><unientity>587F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 70"><unientity>5881</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 7B"><unientity>58A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 77 7E"><unientity>58A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 24"><unientity>58B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 2B"><unientity>58AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 2E"><unientity>58A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 30"><unientity>58A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 32"><unientity>58A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 3A"><unientity>58C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 41"><unientity>58BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 49"><unientity>58BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 4B"><unientity>58C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 4C"><unientity>58BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 50"><unientity>58D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 54"><unientity>58D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 56"><unientity>58CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 5A"><unientity>58E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 5E"><unientity>58DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 6C"><unientity>58FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 70"><unientity>5902</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 73"><unientity>5906</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 74"><unientity>6535</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 7A"><unientity>5910</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 78 7C"><unientity>8641</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 28"><unientity>592C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 2B"><unientity>592F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 30"><unientity>593C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 33"><unientity>5940</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 38"><unientity>594D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 43"><unientity>5953</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 4B"><unientity>595C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 4F"><unientity>5961</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 54"><unientity>596C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 55"><unientity>596D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 65"><unientity>597C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 69"><unientity>59A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 6B"><unientity>5998</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 6F"><unientity>599A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 71"><unientity>59A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 79 7C"><unientity>5997</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 21"><unientity>5990</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 24"><unientity>59C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 25"><unientity>59B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 28"><unientity>59CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 2A"><unientity>59BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 2C"><unientity>59B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 35"><unientity>59B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 3A"><unientity>59B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 3E"><unientity>59C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 43"><unientity>59F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 44"><unientity>59F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 4F"><unientity>59EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 50"><unientity>59F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 51"><unientity>5A00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 52"><unientity>59DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 56"><unientity>59FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 5D"><unientity>59F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 5E"><unientity>59DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 5F"><unientity>59FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 61"><unientity>59E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 6E"><unientity>5A2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 75"><unientity>5A16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 78"><unientity>5A09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7A 7E"><unientity>5A12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 2C"><unientity>5A60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 31"><unientity>5A67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 3A"><unientity>5A38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 3B"><unientity>5A5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 3C"><unientity>5A6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 3D"><unientity>5A35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 3E"><unientity>5A55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 41"><unientity>5A2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 48"><unientity>5A50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 49"><unientity>5A65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 52"><unientity>5A64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 65"><unientity>5A8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 69"><unientity>5ACF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 6A"><unientity>5A7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 71"><unientity>5A9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7B 75"><unientity>5AA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 21"><unientity>5AA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 22"><unientity>5A8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 24"><unientity>5AA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 25"><unientity>5A9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 26"><unientity>5AA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 27"><unientity>5A9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 28"><unientity>5A7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 29"><unientity>5A96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 30"><unientity>5A93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 31"><unientity>5AAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 34"><unientity>5AAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 35"><unientity>5A95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 36"><unientity>5AAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 39"><unientity>5AC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 3E"><unientity>5AB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 41"><unientity>5AC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 45"><unientity>5AB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 49"><unientity>5AD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 4A"><unientity>5A90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 4F"><unientity>5AB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 50"><unientity>5ABA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 52"><unientity>5AAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 59"><unientity>5AD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 5B"><unientity>5AB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 60"><unientity>5ADC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 6D"><unientity>5AE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 6E"><unientity>5AE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 72"><unientity>5AEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 7B"><unientity>5ADA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7C 7C"><unientity>5AEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 26"><unientity>5AFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 2A"><unientity>5AFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 2B"><unientity>5B08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 2E"><unientity>5B0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 38"><unientity>5B03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 3D"><unientity>5B17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 3E"><unientity>5B16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 40"><unientity>5B19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 47"><unientity>5B1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 48"><unientity>5B21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 52"><unientity>5B2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 59"><unientity>5B32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 63"><unientity>5B3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 6E"><unientity>5B45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 74"><unientity>5B4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 76"><unientity>5B4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7D 7C"><unientity>5B56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 21"><unientity>5B5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 23"><unientity>5B62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 24"><unientity>5B65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 25"><unientity>5B67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 27"><unientity>E9E5</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 7E 28"><unientity>5B6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 2A"><unientity>5B6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 30"><unientity>5B7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 31"><unientity>5B7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 32"><unientity>5B80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 34"><unientity>5B84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 35"><unientity>E9E6</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="21 7E 40"><unientity>5B95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 43"><unientity>5B93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 49"><unientity>5BAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 52"><unientity>5BA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 55"><unientity>5BB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 59"><unientity>5BC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 5B"><unientity>EA01</unientity><desc>East Asian ideography not found in unified han</desc></character>
+<character hex="21 7E 60"><unientity>5BC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 68"><unientity>5BD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 6A"><unientity>5BC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 6E"><unientity>5BD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 75"><unientity>5BD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 79"><unientity>5BE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="21 7E 7E"><unientity>5BEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 24"><unientity>5BF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 25"><unientity>5BEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 33"><unientity>5C00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 35"><unientity>5C57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 3C"><unientity>5C15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 46"><unientity>5C22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 48"><unientity>5C25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 4B"><unientity>5C2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 52"><unientity>5C2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 5B"><unientity>5C32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 63"><unientity>5C3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 65"><unientity>5C44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 67"><unientity>5C49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 79"><unientity>5C59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 7B"><unientity>5C5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 22 7C"><unientity>5C5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 23"><unientity>5C63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 29"><unientity>5C67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 2B"><unientity>5C68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 30"><unientity>5C6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 31"><unientity>5C6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 37"><unientity>5C74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 39"><unientity>5C73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 3B"><unientity>5C77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 3C"><unientity>5C7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 40"><unientity>5C7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 46"><unientity>5C8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 49"><unientity>5C88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 4B"><unientity>5C8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 4D"><unientity>5C99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 55"><unientity>5CA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 57"><unientity>5CA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 5C"><unientity>5CA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 60"><unientity>5CB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 61"><unientity>5CA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 66"><unientity>5CA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 67"><unientity>5CAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 6B"><unientity>5CA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 6C"><unientity>5CB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 6D"><unientity>5CC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 6F"><unientity>5CAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 70"><unientity>5CD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 78"><unientity>5CD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 23 79"><unientity>E9E7</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 24 26"><unientity>5CE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 28"><unientity>5CD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 29"><unientity>5CDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 2B"><unientity>5CCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 30"><unientity>5CC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 31"><unientity>5CDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 34"><unientity>5D00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 3B"><unientity>5CFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 3C"><unientity>5CEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 41"><unientity>5CF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 46"><unientity>5CF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 49"><unientity>5D1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 4A"><unientity>5D12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 50"><unientity>5D1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 52"><unientity>5D0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 53"><unientity>5D20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 54"><unientity>5D21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 57"><unientity>5D27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 58"><unientity>5D0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 5A"><unientity>5D26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 5D"><unientity>5D2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 69"><unientity>5D24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 71"><unientity>5D36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 72"><unientity>5D3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 74"><unientity>5D4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 76"><unientity>5D57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 24 77"><unientity>5D34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 25"><unientity>5D3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 26"><unientity>5D52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 27"><unientity>5D3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 28"><unientity>5D4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 2C"><unientity>5D59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 2D"><unientity>5D47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 2F"><unientity>5D32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 31"><unientity>5D42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 34"><unientity>5D74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 39"><unientity>5D6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 3A"><unientity>5D6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 3F"><unientity>5D75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 44"><unientity>5D4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 49"><unientity>5D6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 4A"><unientity>5D62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 4D"><unientity>5D82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 50"><unientity>5D79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 51"><unientity>5D8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 5A"><unientity>5D81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 60"><unientity>5D7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 66"><unientity>5D92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 68"><unientity>5D99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 69"><unientity>5D97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 6A"><unientity>5DA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 73"><unientity>5DA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 75"><unientity>5D93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 77"><unientity>5DA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 7B"><unientity>5D94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 25 7E"><unientity>5DAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 26"><unientity>5DA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 2A"><unientity>5DB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 2E"><unientity>5DB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 2F"><unientity>5DAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 30"><unientity>5DB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 32"><unientity>5DB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 34"><unientity>5DBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 36"><unientity>5DB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 3E"><unientity>5DC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 44"><unientity>5DC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 46"><unientity>5DC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 47"><unientity>5DCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 4E"><unientity>5DD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 50"><unientity>5DDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 52"><unientity>5DDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 56"><unientity>5DE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 62"><unientity>5E00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 64"><unientity>51E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 72"><unientity>5E14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 73"><unientity>5E17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 76"><unientity>5E19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 77"><unientity>5E12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 78"><unientity>5E1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 7A"><unientity>5E23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 26 7B"><unientity>5E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 22"><unientity>5E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 24"><unientity>5E28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 35"><unientity>5E44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 36"><unientity>5E43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 39"><unientity>5E42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 3F"><unientity>5E4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 47"><unientity>5E58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 48"><unientity>5E48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 57"><unientity>5E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 58"><unientity>5E61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 5D"><unientity>5E68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 5F"><unientity>5E6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 60"><unientity>5E6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 63"><unientity>5E6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 64"><unientity>5E6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 65"><unientity>5E70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 6D"><unientity>5E75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 77"><unientity>5E80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 27 7E"><unientity>5E8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 2F"><unientity>5EA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 35"><unientity>5EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 36"><unientity>5EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 42"><unientity>5EB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 4B"><unientity>5EB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 4C"><unientity>5EC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 51"><unientity>5ECC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 55"><unientity>5ECB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 57"><unientity>5ECD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 5A"><unientity>5ED2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 5B"><unientity>5ED1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 5C"><unientity>5ED5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 5F"><unientity>5ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 60"><unientity>5ED9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 61"><unientity>5ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 68"><unientity>5EE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 6D"><unientity>5EE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 71"><unientity>5EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 28 7C"><unientity>5EED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 21"><unientity>5EF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 23"><unientity>5EF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 35"><unientity>5F07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 3A"><unientity>5F0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 4A"><unientity>5F28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 4B"><unientity>5F22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 4C"><unientity>5F23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 4D"><unientity>5F24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 51"><unientity>5F33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 52"><unientity>5F30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 58"><unientity>5F38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 5C"><unientity>5F40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 5F"><unientity>5F44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 62"><unientity>5F4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 68"><unientity>5F50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 69"><unientity>5F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 6A"><unientity>5F56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 6C"><unientity>5F58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 70"><unientity>5F60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 71"><unientity>5F61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 72"><unientity>5F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 73"><unientity>809C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 74"><unientity>5F67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 78"><unientity>5F72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 79"><unientity>5F73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 29 7C"><unientity>5F74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 23"><unientity>5F82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 27"><unientity>5F89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 2B"><unientity>5F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 34"><unientity>EA02</unientity><desc>East Asian ideograph not found in unified han</desc></character>
+<character hex="22 2A 39"><unientity>5F9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 3D"><unientity>5F9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 46"><unientity>5FAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 50"><unientity>5FBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 57"><unientity>5FC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 5F"><unientity>5FD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 61"><unientity>5FD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 63"><unientity>5FD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 67"><unientity>5FCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 68"><unientity>5FED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 72"><unientity>5FEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 73"><unientity>5FF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 78"><unientity>5FE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2A 7B"><unientity>5FE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 24"><unientity>5FEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 2A"><unientity>6026</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 2C"><unientity>6029</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 2D"><unientity>602B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 30"><unientity>6019</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 31"><unientity>6008</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 36"><unientity>600A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 37"><unientity>600C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 38"><unientity>601B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 3C"><unientity>6017</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 3D"><unientity>6033</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 45"><unientity>600D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 46"><unientity>6010</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 4B"><unientity>6039</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 50"><unientity>6013</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 53"><unientity>6054</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 57"><unientity>605D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 5A"><unientity>6047</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 5E"><unientity>6049</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 5F"><unientity>6053</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 68"><unientity>6067</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 6F"><unientity>604C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 71"><unientity>6041</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 72"><unientity>6077</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 74"><unientity>6042</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 76"><unientity>605F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2B 7A"><unientity>6061</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 24"><unientity>608A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 2B"><unientity>6092</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 2C"><unientity>609D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 2D"><unientity>6081</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 2F"><unientity>609E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 30"><unientity>6083</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 32"><unientity>6097</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 34"><unientity>60A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 3A"><unientity>6095</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 3E"><unientity>60C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 42"><unientity>60B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 46"><unientity>60BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 47"><unientity>60D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 48"><unientity>60D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 4E"><unientity>60CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 51"><unientity>60CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 53"><unientity>60D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 54"><unientity>60B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 56"><unientity>60DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 5D"><unientity>60C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 60"><unientity>60B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 62"><unientity>60E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 66"><unientity>60E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 67"><unientity>60E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 69"><unientity>60DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 6E"><unientity>60E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 70"><unientity>6114</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 73"><unientity>6103</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 75"><unientity>6119</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 7C"><unientity>60FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2C 7D"><unientity>610D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 2A"><unientity>610A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 2C"><unientity>6110</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 32"><unientity>6112</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 34"><unientity>60F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 37"><unientity>6125</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 3B"><unientity>60F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 3F"><unientity>6121</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 41"><unientity>60FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 43"><unientity>6106</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 48"><unientity>6149</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 4A"><unientity>614A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 4E"><unientity>612B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 50"><unientity>6129</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 51"><unientity>6150</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 56"><unientity>53AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 58"><unientity>6130</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 5B"><unientity>6141</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 5E"><unientity>6137</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 61"><unientity>6146</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 66"><unientity>615E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 67"><unientity>6175</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 68"><unientity>6174</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 6B"><unientity>6183</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 70"><unientity>6171</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 74"><unientity>616A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 77"><unientity>6173</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 79"><unientity>6164</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2D 7B"><unientity>6153</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 23"><unientity>618B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 2C"><unientity>616F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 2D"><unientity>6165</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 2F"><unientity>615C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 32"><unientity>619D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 33"><unientity>61A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 3D"><unientity>61A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 40"><unientity>61A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 42"><unientity>619C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 43"><unientity>61AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 45"><unientity>6196</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 46"><unientity>6197</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 47"><unientity>61AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 4C"><unientity>6192</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 52"><unientity>61AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 55"><unientity>618D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 5A"><unientity>61CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 5C"><unientity>61CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 5D"><unientity>61C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 68"><unientity>61BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 6A"><unientity>61B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 71"><unientity>61E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 77"><unientity>61E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 7D"><unientity>61DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2E 7E"><unientity>61DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 29"><unientity>61F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 3D"><unientity>6201</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 41"><unientity>6204</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 43"><unientity>6207</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 44"><unientity>6209</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 47"><unientity>6214</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 56"><unientity>6223</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 5B"><unientity>6225</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 5D"><unientity>6224</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 61"><unientity>6229</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 67"><unientity>622D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 69"><unientity>97EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 6E"><unientity>6239</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 6F"><unientity>623A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 70"><unientity>623D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 75"><unientity>6243</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 77"><unientity>6246</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 78"><unientity>6245</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 79"><unientity>624A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 7A"><unientity>6250</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 2F 7C"><unientity>625E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 26"><unientity>6268</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 28"><unientity>6260</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 2B"><unientity>625A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 2C"><unientity>6262</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 2D"><unientity>6266</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 31"><unientity>6286</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 32"><unientity>628E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 41"><unientity>62A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 43"><unientity>6282</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 46"><unientity>6285</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 4B"><unientity>629D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 56"><unientity>62A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 57"><unientity>62D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 61"><unientity>62E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 69"><unientity>62B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 6A"><unientity>62C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 30 72"><unientity>630D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 25"><unientity>62F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 31"><unientity>630C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 32"><unientity>6360</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 37"><unientity>62F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 3A"><unientity>6331</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 42"><unientity>6345</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 44"><unientity>6343</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 45"><unientity>6335</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 47"><unientity>6353</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 48"><unientity>6364</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 49"><unientity>6336</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 4A"><unientity>6344</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 54"><unientity>6339</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 58"><unientity>6357</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 5A"><unientity>633C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 5B"><unientity>6358</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 5C"><unientity>634B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 5F"><unientity>6354</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 68"><unientity>637D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 6A"><unientity>63B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 6B"><unientity>6382</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 6C"><unientity>636C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 6E"><unientity>639F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 72"><unientity>639E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 73"><unientity>637F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 79"><unientity>6381</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 7B"><unientity>6397</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 31 7D"><unientity>63AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 25"><unientity>6387</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 26"><unientity>637A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 27"><unientity>638E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 2A"><unientity>6386</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 2F"><unientity>6375</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 30"><unientity>63AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 37"><unientity>63B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 38"><unientity>63B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 39"><unientity>63AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 3A"><unientity>637C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 3B"><unientity>6390</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 3D"><unientity>63AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 41"><unientity>636D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 43"><unientity>63DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 44"><unientity>63E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 47"><unientity>63D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 4F"><unientity>63BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 50"><unientity>63C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 52"><unientity>63F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 58"><unientity>63E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 5B"><unientity>63E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 5C"><unientity>63D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 5D"><unientity>63F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 5E"><unientity>63F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 5F"><unientity>63F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 66"><unientity>E9E8</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 32 6A"><unientity>63F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 70"><unientity>63BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 72"><unientity>63EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 73"><unientity>63DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 76"><unientity>E9E9</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 32 79"><unientity>63C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 7A"><unientity>63DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 7B"><unientity>63D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 32 7E"><unientity>6412</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 22"><unientity>6410</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 24"><unientity>6434</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 29"><unientity>641B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 2B"><unientity>6420</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 2C"><unientity>6424</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 2F"><unientity>6426</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 31"><unientity>640C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 36"><unientity>6415</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 37"><unientity>6418</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 38"><unientity>640E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 39"><unientity>EA03</unientity><desc>East Asian ideography not found in unified han</desc></character>
+<character hex="22 33 3B"><unientity>6422</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 3D"><unientity>6421</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 44"><unientity>6430</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 45"><unientity>6441</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 48"><unientity>6435</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 4C"><unientity>6409</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 51"><unientity>640A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 53"><unientity>6440</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 59"><unientity>6407</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 5B"><unientity>643B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 5D"><unientity>643F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 68"><unientity>645B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 6A"><unientity>644F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 6C"><unientity>646B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 6F"><unientity>6476</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 76"><unientity>6474</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 78"><unientity>647D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 33 7B"><unientity>6473</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 23"><unientity>644E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 24"><unientity>6464</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 27"><unientity>6482</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 28"><unientity>645E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 2C"><unientity>647B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 2E"><unientity>645C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 3C"><unientity>649D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 3F"><unientity>6499</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 42"><unientity>648F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 4D"><unientity>6496</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 4E"><unientity>64A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 54"><unientity>6490</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 5B"><unientity>64B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 61"><unientity>6498</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 62"><unientity>649F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 65"><unientity>E9EA</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 34 66"><unientity>64B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 6A"><unientity>64D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 6C"><unientity>64D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 74"><unientity>64BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 34 75"><unientity>64D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 2A"><unientity>64EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 2D"><unientity>64E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 2E"><unientity>64E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 31"><unientity>64EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 33"><unientity>64E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 36"><unientity>64ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 38"><unientity>64E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 42"><unientity>64F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 46"><unientity>6504</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 4B"><unientity>64FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 4F"><unientity>6508</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 53"><unientity>6509</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 59"><unientity>651A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 5B"><unientity>6516</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 61"><unientity>651B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 69"><unientity>6527</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 6D"><unientity>6522</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 6F"><unientity>6529</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 72"><unientity>6525</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 77"><unientity>652E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 35 7C"><unientity>6541</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 2C"><unientity>6538</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 34"><unientity>6542</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 36"><unientity>6549</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 3E"><unientity>6554</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 3F"><unientity>6555</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 45"><unientity>6567</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 47"><unientity>6561</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 4F"><unientity>656D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 54"><unientity>657A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 64"><unientity>6585</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 6E"><unientity>658C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 70"><unientity>6592</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 71"><unientity>6595</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 75"><unientity>659B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 77"><unientity>659D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 36 7A"><unientity>65A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 22"><unientity>65A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 23"><unientity>65A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 27"><unientity>65AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 2A"><unientity>65B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 2C"><unientity>65B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 2F"><unientity>65BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 31"><unientity>65C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 32"><unientity>65C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 33"><unientity>65C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 34"><unientity>65C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 3B"><unientity>65D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 3C"><unientity>65D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 44"><unientity>65DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 45"><unientity>65DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 47"><unientity>65DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 48"><unientity>65DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 4A"><unientity>65E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 4E"><unientity>65E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 54"><unientity>65F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 55"><unientity>65F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 5A"><unientity>6609</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 5B"><unientity>65FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 5C"><unientity>65FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 5E"><unientity>660A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 64"><unientity>6603</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 6A"><unientity>6611</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 6B"><unientity>6615</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 6D"><unientity>6604</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 6E"><unientity>6631</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 72"><unientity>6621</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 75"><unientity>662C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 77"><unientity>6635</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 7C"><unientity>661E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 37 7D"><unientity>663A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 27"><unientity>6633</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 28"><unientity>662B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 2B"><unientity>6634</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 2C"><unientity>6624</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 31"><unientity>6645</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 32"><unientity>665F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 3D"><unientity>6665</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 3E"><unientity>665C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 3F"><unientity>6661</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 48"><unientity>665B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 49"><unientity>6659</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 4A"><unientity>6667</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 4C"><unientity>665E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 4D"><unientity>6657</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 50"><unientity>667E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 51"><unientity>666C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 5A"><unientity>6678</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 60"><unientity>6673</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 66"><unientity>666D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 68"><unientity>6677</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 70"><unientity>6684</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 71"><unientity>668C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 72"><unientity>6693</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 75"><unientity>668B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 76"><unientity>6690</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 79"><unientity>6694</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 7A"><unientity>668A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 7C"><unientity>6698</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 38 7D"><unientity>668D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 24"><unientity>7A25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 2A"><unientity>66A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 30"><unientity>5C21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 32"><unientity>669D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 3A"><unientity>66B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 40"><unientity>66B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 41"><unientity>66AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 43"><unientity>66AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 47"><unientity>66B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 4E"><unientity>66C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 4F"><unientity>66BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 54"><unientity>66C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 55"><unientity>66C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 5A"><unientity>66BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 5C"><unientity>66C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 60"><unientity>66CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 71"><unientity>66DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 72"><unientity>66DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 73"><unientity>66E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 76"><unientity>66E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 78"><unientity>66E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 39 7C"><unientity>66E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 28"><unientity>6705</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 30"><unientity>670F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 31"><unientity>6710</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 33"><unientity>6712</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 34"><unientity>6713</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 38"><unientity>6719</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 39"><unientity>6718</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 47"><unientity>6723</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 4C"><unientity>673E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 4E"><unientity>673F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 58"><unientity>6757</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 5B"><unientity>6745</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 5C"><unientity>6747</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 60"><unientity>675D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 61"><unientity>6755</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 66"><unientity>674C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 67"><unientity>6759</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 68"><unientity>6748</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 6B"><unientity>6763</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 6E"><unientity>6753</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 71"><unientity>674A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 75"><unientity>6793</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 78"><unientity>677C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 7A"><unientity>679F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3A 7C"><unientity>6785</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 21"><unientity>677B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 22"><unientity>6792</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 23"><unientity>6776</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 25"><unientity>6791</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 26"><unientity>6799</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 28"><unientity>67A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 2E"><unientity>678F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 30"><unientity>6772</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 31"><unientity>E963</unientity><unientityalt>6798</unientityalt><desc>Variant of 4C3B31 which maps to 6798</desc></character>
+<character hex="22 3B 32"><unientity>676A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 39"><unientity>67AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 3B"><unientity>67A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 3F"><unientity>67A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 44"><unientity>67F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 48"><unientity>678D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 49"><unientity>678C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 4C"><unientity>67FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 4E"><unientity>6810</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 51"><unientity>67C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 54"><unientity>67CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 58"><unientity>67C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 5C"><unientity>67BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 5F"><unientity>67B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 60"><unientity>6803</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 61"><unientity>67F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 63"><unientity>67D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 64"><unientity>67B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 6D"><unientity>6802</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 6F"><unientity>67E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 70"><unientity>67D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 71"><unientity>67DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 72"><unientity>67B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 74"><unientity>67DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 75"><unientity>67F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 77"><unientity>67B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 78"><unientity>6806</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 79"><unientity>67AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 7A"><unientity>67F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 7C"><unientity>67EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 7D"><unientity>6AAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3B 7E"><unientity>67B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 21"><unientity>67B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 23"><unientity>67C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 24"><unientity>67E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 26"><unientity>67CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 28"><unientity>67CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 29"><unientity>67E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 2A"><unientity>67F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 2B"><unientity>67C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 2D"><unientity>67DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 2F"><unientity>67E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 30"><unientity>6849</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 31"><unientity>683E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 36"><unientity>6814</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 37"><unientity>684B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 38"><unientity>681E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 3B"><unientity>6833</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 40"><unientity>6831</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 41"><unientity>6832</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 42"><unientity>6835</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 43"><unientity>683B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 44"><unientity>684E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 47"><unientity>682B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 48"><unientity>682D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 4A"><unientity>684D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 4F"><unientity>6844</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 55"><unientity>685D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 56"><unientity>685E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 58"><unientity>6834</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 59"><unientity>6812</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 65"><unientity>685A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 68"><unientity>686B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 69"><unientity>686C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 6B"><unientity>6879</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 6E"><unientity>68B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 71"><unientity>689B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 72"><unientity>687E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 74"><unientity>68B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 76"><unientity>6882</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3C 7A"><unientity>6890</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 21"><unientity>6872</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 22"><unientity>689C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 25"><unientity>686D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 2E"><unientity>68A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 30"><unientity>6898</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 32"><unientity>688B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 33"><unientity>68A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 34"><unientity>686F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 39"><unientity>68A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 3B"><unientity>6874</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 3C"><unientity>6875</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 3F"><unientity>6877</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 40"><unientity>688F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 43"><unientity>687B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 44"><unientity>688E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 4B"><unientity>68B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 50"><unientity>692C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 51"><unientity>6917</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 53"><unientity>690C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 56"><unientity>690B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 58"><unientity>68D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 59"><unientity>6904</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 5B"><unientity>690A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 5C"><unientity>6909</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 5D"><unientity>6929</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 62"><unientity>68EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 63"><unientity>692A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 64"><unientity>68EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 65"><unientity>681F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 66"><unientity>7439</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 6A"><unientity>6910</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 6E"><unientity>68D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 6F"><unientity>68EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 73"><unientity>68F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 78"><unientity>68FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 79"><unientity>68FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 7B"><unientity>68F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3D 7C"><unientity>6913</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 21"><unientity>6907</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 23"><unientity>691A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 24"><unientity>6919</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 2A"><unientity>68DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 2B"><unientity>691B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 2D"><unientity>68FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 33"><unientity>68E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 37"><unientity>68D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 38"><unientity>68D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 39"><unientity>6908</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 3E"><unientity>68E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 3F"><unientity>68F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 40"><unientity>68C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 44"><unientity>6911</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 46"><unientity>68D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 47"><unientity>68EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 49"><unientity>68C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 4B"><unientity>68C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 53"><unientity>6974</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 55"><unientity>6938</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 58"><unientity>6962</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 5D"><unientity>6958</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 5F"><unientity>6957</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 60"><unientity>693F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 61"><unientity>6971</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 64"><unientity>6945</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 65"><unientity>695D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 66"><unientity>6932</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 69"><unientity>696E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 6A"><unientity>6963</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 6B"><unientity>6948</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 6E"><unientity>6939</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 70"><unientity>696A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 73"><unientity>6937</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 7A"><unientity>696C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 7B"><unientity>694E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 7D"><unientity>6980</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3E 7E"><unientity>6933</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 21"><unientity>6952</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 25"><unientity>695B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 2D"><unientity>6985</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 32"><unientity>693D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 35"><unientity>6978</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 37"><unientity>697B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 3A"><unientity>6934</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 3B"><unientity>6969</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 3D"><unientity>6944</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 3E"><unientity>696F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 44"><unientity>698A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 45"><unientity>69A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 46"><unientity>69B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 50"><unientity>69CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 51"><unientity>69CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 59"><unientity>698D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 5A"><unientity>6991</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 5C"><unientity>69AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 60"><unientity>69BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 61"><unientity>69A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 65"><unientity>699E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 68"><unientity>69D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 6A"><unientity>698E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 6D"><unientity>69D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 75"><unientity>69A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 77"><unientity>69BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 78"><unientity>69D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 7A"><unientity>69F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 3F 7E"><unientity>69D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 27"><unientity>69BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 2D"><unientity>69A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 2E"><unientity>69A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 34"><unientity>69D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 38"><unientity>69C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 3D"><unientity>6A12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 3E"><unientity>6A11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 41"><unientity>6A00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 46"><unientity>69E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 4B"><unientity>6A0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 4C"><unientity>69E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 4D"><unientity>69E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 50"><unientity>69FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 54"><unientity>6A17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 56"><unientity>69E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 57"><unientity>69EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 5B"><unientity>69F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 5E"><unientity>6A2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 5F"><unientity>69FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 60"><unientity>6A20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 64"><unientity>69ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 67"><unientity>6A1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 68"><unientity>6A2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 6E"><unientity>6A18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 72"><unientity>6A1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 75"><unientity>6A0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 76"><unientity>6A0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 40 7C"><unientity>69EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 23"><unientity>69F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 24"><unientity>69F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 28"><unientity>6A14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 29"><unientity>6A63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 37"><unientity>6A67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 39"><unientity>6A43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 3A"><unientity>6A33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 3B"><unientity>6A32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 3C"><unientity>6A5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 3F"><unientity>6A28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 40"><unientity>6A48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 41"><unientity>6A50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 42"><unientity>6A52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 43"><unientity>6A72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 45"><unientity>6A3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 46"><unientity>6A77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 47"><unientity>6A5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 4A"><unientity>6A5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 4B"><unientity>6A5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 4F"><unientity>6A51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 51"><unientity>6A56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 53"><unientity>6A36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 56"><unientity>6A7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 58"><unientity>6A3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 6C"><unientity>69F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 6D"><unientity>6A64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 73"><unientity>6A8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 75"><unientity>6AA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 77"><unientity>6AA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 79"><unientity>6A96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 41 7E"><unientity>6A7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 22"><unientity>6A7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 23"><unientity>6A89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 24"><unientity>6A91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 26"><unientity>6A9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 2A"><unientity>6A92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 2B"><unientity>6AA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 34"><unientity>6A99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 35"><unientity>6A9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 36"><unientity>6A7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 37"><unientity>6A9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 42"><unientity>6AA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 47"><unientity>6A90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 49"><unientity>6A9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 4A"><unientity>6A87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 4B"><unientity>6A8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 51"><unientity>6AAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 55"><unientity>6AC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 57"><unientity>6AAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 5D"><unientity>6ABF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 64"><unientity>6ACA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 68"><unientity>6AB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 79"><unientity>6AE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 42 7E"><unientity>6AED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 25"><unientity>6ACC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 28"><unientity>6AD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 33"><unientity>6ADF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 34"><unientity>6ACD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 35"><unientity>6ADE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 37"><unientity>6AEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 39"><unientity>6AF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 3A"><unientity>6AE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 3F"><unientity>6AEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 40"><unientity>6AEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 44"><unientity>6AF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 45"><unientity>6AE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 48"><unientity>6AF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 4E"><unientity>6AFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 50"><unientity>6AFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 52"><unientity>6B01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 58"><unientity>6B03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 59"><unientity>6AF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 5F"><unientity>6B0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 60"><unientity>6B09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 61"><unientity>6B0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 67"><unientity>6B11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 6D"><unientity>6B19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 6E"><unientity>6B17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 72"><unientity>6B1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 43 7E"><unientity>6B2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 2A"><unientity>6B35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 2C"><unientity>6B37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 2D"><unientity>6B3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 32"><unientity>6B39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 35"><unientity>6B3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 37"><unientity>6B46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 38"><unientity>6B41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 3A"><unientity>6B40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 3B"><unientity>6B42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 3C"><unientity>6B43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 3E"><unientity>6B48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 3F"><unientity>6B4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 46"><unientity>E964</unientity><unientityalt>6B4E</unientityalt><desc>Variant of 4C4446 which maps to 6B4E</desc></character>
+<character hex="22 44 4A"><unientity>6B57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 4C"><unientity>6B54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 4E"><unientity>6B55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 51"><unientity>6B5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 53"><unientity>6B5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 54"><unientity>6B60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 5B"><unientity>6B6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 5D"><unientity>6B6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 5F"><unientity>6B6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 61"><unientity>6B71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 6B"><unientity>6B7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 71"><unientity>6B82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 73"><unientity>6B84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 79"><unientity>6B8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 44 7B"><unientity>6B95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 25"><unientity>6B99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 29"><unientity>6B9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 35"><unientity>6BA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 36"><unientity>6BA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 38"><unientity>6BAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 39"><unientity>6BAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 3B"><unientity>6BAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 3D"><unientity>6BB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 3F"><unientity>6BB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 47"><unientity>6BBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 4D"><unientity>6996</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 54"><unientity>6BC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 5B"><unientity>6BD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 60"><unientity>6BDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 62"><unientity>6BDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 63"><unientity>6BDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 65"><unientity>6BDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 6F"><unientity>6BE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 70"><unientity>6BEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 45 71"><unientity>6BE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 2A"><unientity>6BF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 2C"><unientity>6BF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 33"><unientity>6BF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 37"><unientity>6BFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 38"><unientity>6BF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 42"><unientity>6BFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 44"><unientity>6C06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 48"><unientity>6C04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 4A"><unientity>6C05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 4C"><unientity>6C08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 51"><unientity>6C0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 52"><unientity>6C0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 59"><unientity>6C15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 5A"><unientity>6C18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 5B"><unientity>6C19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 5C"><unientity>6C1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 5E"><unientity>6C1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 60"><unientity>6C20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 62"><unientity>6C21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 64"><unientity>6C2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 66"><unientity>6C2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 67"><unientity>6C30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 68"><unientity>6C2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 69"><unientity>E9EB</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 46 70"><unientity>6C3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 74"><unientity>6C3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 78"><unientity>6C46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 7A"><unientity>6C52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 7B"><unientity>6C62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 46 7C"><unientity>6C4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 24"><unientity>6C5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 26"><unientity>6C5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 27"><unientity>6C4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 2B"><unientity>6C4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 2C"><unientity>6C54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 2D"><unientity>6C63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 30"><unientity>6C78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 31"><unientity>6C74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 32"><unientity>6C86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 33"><unientity>6C76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 38"><unientity>6C6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 39"><unientity>6C67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 3B"><unientity>6C84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 3E"><unientity>6C94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 40"><unientity>6C8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 42"><unientity>6C65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 47"><unientity>6C6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 49"><unientity>6C9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 4A"><unientity>6C69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 4B"><unientity>6C9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 4C"><unientity>6C6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 4D"><unientity>6C93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 51"><unientity>6C87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 52"><unientity>6C6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 56"><unientity>6C95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 5A"><unientity>6C82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 5C"><unientity>6CA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 62"><unientity>6CEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 63"><unientity>6CEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 64"><unientity>6CC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 66"><unientity>6CEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 67"><unientity>6CAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 6E"><unientity>E965</unientity><unientityalt>6CAD</unientityalt><desc>Variant of 4C476E which maps to 6CAD</desc></character>
+<character hex="22 47 70"><unientity>6CAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 72"><unientity>6CF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 7A"><unientity>6CBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 7B"><unientity>7553</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 47 7D"><unientity>6CC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 24"><unientity>6CD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 26"><unientity>6CC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 28"><unientity>6CCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 29"><unientity>6CE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 2D"><unientity>6CF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 2F"><unientity>6CE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 30"><unientity>6CD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 32"><unientity>6CD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 33"><unientity>6CB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 37"><unientity>6D1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 3B"><unientity>6D28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 44"><unientity>6D39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 4D"><unientity>6D26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 4E"><unientity>6D27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 4F"><unientity>6D0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 50"><unientity>6D0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 51"><unientity>6D3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 5A"><unientity>6D07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 5B"><unientity>6D04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 5C"><unientity>6CDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 60"><unientity>6D2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 61"><unientity>6D35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 62"><unientity>6D3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 64"><unientity>6D19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 67"><unientity>6D0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 6A"><unientity>6D2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 6B"><unientity>6D11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 6C"><unientity>6D00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 6D"><unientity>6D24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 6F"><unientity>6D33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 73"><unientity>6D63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 77"><unientity>6DA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 48 7D"><unientity>6D92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 25"><unientity>6D6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 26"><unientity>6D6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 28"><unientity>6D61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 29"><unientity>6D91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 2C"><unientity>6D81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 2E"><unientity>6D8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 2F"><unientity>E966</unientity><unientityalt>6D34</unientityalt><desc>Variant of 34492F which maps to 6D34</desc></character>
+<character hex="22 49 34"><unientity>6D79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 35"><unientity>6DEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 39"><unientity>6D7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 3B"><unientity>6D85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 3C"><unientity>6D65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 3E"><unientity>6D5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 40"><unientity>6D67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 43"><unientity>6D94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 46"><unientity>6D60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 48"><unientity>6D98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 4B"><unientity>6D7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 4C"><unientity>6D70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 4F"><unientity>6D96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 59"><unientity>6DAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 5A"><unientity>6DB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 5C"><unientity>6DAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 60"><unientity>6DEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 6A"><unientity>6DAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 6B"><unientity>6DB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 6C"><unientity>6DE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 6D"><unientity>6DD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 6E"><unientity>6DE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 71"><unientity>6DF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 79"><unientity>6E0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 49 7B"><unientity>6DBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 2A"><unientity>6DDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 2D"><unientity>6DD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 32"><unientity>6DFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 35"><unientity>6DDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 36"><unientity>6DDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 39"><unientity>6DDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 3D"><unientity>6DA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 44"><unientity>6E12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 46"><unientity>6DF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 4A"><unientity>6DE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 4C"><unientity>6E1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 50"><unientity>6E27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 55"><unientity>6E49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 58"><unientity>6E3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 60"><unientity>6E8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 62"><unientity>6E4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 66"><unientity>6E62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 6A"><unientity>6E51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 6B"><unientity>6E44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 6D"><unientity>6E63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 71"><unientity>6E73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 74"><unientity>6E4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4A 77"><unientity>6E4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 22"><unientity>6E28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 24"><unientity>6E5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 26"><unientity>6E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 28"><unientity>6E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 2C"><unientity>6E84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 2E"><unientity>6E2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 30"><unientity>6E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 31"><unientity>6E5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 32"><unientity>6E72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 33"><unientity>6E30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 34"><unientity>6E53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 36"><unientity>6E39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 37"><unientity>6E71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 38"><unientity>6E69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 39"><unientity>6E6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 3B"><unientity>6E8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 3E"><unientity>6E76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 40"><unientity>6E2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 41"><unientity>6E4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 42"><unientity>6E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 43"><unientity>6ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 45"><unientity>6E9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 46"><unientity>6E9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 48"><unientity>6EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 49"><unientity>6ED8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 4A"><unientity>6E8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 4D"><unientity>6E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 4F"><unientity>6EA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 51"><unientity>6EB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 57"><unientity>6EA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 59"><unientity>6E92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 5A"><unientity>6EA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 5E"><unientity>6E8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 60"><unientity>6ED9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 61"><unientity>6EBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 63"><unientity>6EC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 69"><unientity>6EBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 6A"><unientity>6EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 6C"><unientity>6EB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 6D"><unientity>6EB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 75"><unientity>6EA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 79"><unientity>6ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 7C"><unientity>6ECA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4B 7D"><unientity>6ED5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 21"><unientity>6EC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 24"><unientity>6EB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 26"><unientity>6EB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 29"><unientity>6EB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 2E"><unientity>6EF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 30"><unientity>6F37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 34"><unientity>6EFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 35"><unientity>6F09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 3C"><unientity>6F3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 3D"><unientity>6F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 3E"><unientity>6F12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 3F"><unientity>6F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 41"><unientity>6F1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 42"><unientity>6EF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 43"><unientity>6F19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 44"><unientity>6F00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 4B"><unientity>6F24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 51"><unientity>6F18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 57"><unientity>6F1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 5A"><unientity>6F0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 5E"><unientity>6F36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 60"><unientity>6EF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 61"><unientity>6EEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 62"><unientity>6F41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 64"><unientity>6F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 65"><unientity>6F2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 67"><unientity>6F34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 6B"><unientity>6F49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 6D"><unientity>6F30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 76"><unientity>6EFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 77"><unientity>6EEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 78"><unientity>6F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 79"><unientity>6F0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4C 7B"><unientity>6F35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 23"><unientity>6F7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 24"><unientity>6F9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 27"><unientity>6F87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 2B"><unientity>6F6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 2F"><unientity>6F5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 30"><unientity>6F60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 35"><unientity>6F90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 37"><unientity>6F8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 39"><unientity>6F92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 3A"><unientity>6F89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 3C"><unientity>6F8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 3D"><unientity>E967</unientity><unientityalt>6F62</unientityalt><desc>Variant of 4C4D3D which maps to 6F62</desc></character>
+<character hex="22 4D 44"><unientity>6F0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 4B"><unientity>6F6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 4D"><unientity>6F8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 58"><unientity>6E88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 5A"><unientity>6F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 5F"><unientity>6F72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 62"><unientity>6F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 63"><unientity>6F5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 68"><unientity>6F5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 73"><unientity>6FB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 74"><unientity>6F9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 79"><unientity>6FA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 7C"><unientity>6FC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4D 7D"><unientity>6FBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 21"><unientity>6FAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 25"><unientity>6FBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 26"><unientity>6FC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 2D"><unientity>6FC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 2E"><unientity>6F5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 2F"><unientity>6FC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 30"><unientity>6FA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 32"><unientity>6FCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 35"><unientity>6FB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 37"><unientity>6FAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 3C"><unientity>6FA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 40"><unientity>6FA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 41"><unientity>6FB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 42"><unientity>6FAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 43"><unientity>6FD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 44"><unientity>6FDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 50"><unientity>6FD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 56"><unientity>6FE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 57"><unientity>6FF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 5D"><unientity>6FDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 5E"><unientity>6FEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 62"><unientity>6FF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 66"><unientity>7005</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 67"><unientity>700C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 6A"><unientity>700D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4E 72"><unientity>7026</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 24"><unientity>7020</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 26"><unientity>7027</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 2B"><unientity>E968</unientity><unientityalt>701E</unientityalt><desc>Variant of 4C4F2B which maps to 701E</desc></character>
+<character hex="22 4F 2F"><unientity>702E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 31"><unientity>702D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 35"><unientity>7021</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 39"><unientity>7018</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 3A"><unientity>7023</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 41"><unientity>703C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 44"><unientity>7035</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 51"><unientity>7034</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 53"><unientity>7039</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 54"><unientity>703A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 5D"><unientity>7043</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 61"><unientity>7044</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 67"><unientity>7047</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 69"><unientity>7049</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 6B"><unientity>7055</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 71"><unientity>7052</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 73"><unientity>705C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 78"><unientity>7059</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 7B"><unientity>705E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 7C"><unientity>7061</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 4F 7D"><unientity>705D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 21"><unientity>9E02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 25"><unientity>7066</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 27"><unientity>7065</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 28"><unientity>7068</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 29"><unientity>7054</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 39"><unientity>7074</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 3B"><unientity>707A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 40"><unientity>7093</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 42"><unientity>7086</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 48"><unientity>E9EC</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 50 49"><unientity>7084</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 4A"><unientity>7081</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 56"><unientity>7088</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 57"><unientity>7098</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 59"><unientity>708C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 5C"><unientity>70B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 62"><unientity>70A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 63"><unientity>70A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 68"><unientity>7551</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 6F"><unientity>70A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 70"><unientity>79CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 71"><unientity>70B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 72"><unientity>70BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 73"><unientity>70A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 78"><unientity>70EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 7B"><unientity>70E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 7C"><unientity>70DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 50 7D"><unientity>70D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 22"><unientity>70DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 23"><unientity>70E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 26"><unientity>70E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 28"><unientity>70E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 2B"><unientity>70D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 2E"><unientity>70D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 38"><unientity>70CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 3A"><unientity>70D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 3B"><unientity>70C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 3C"><unientity>70DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 3D"><unientity>70C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 3F"><unientity>70FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 42"><unientity>70F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 44"><unientity>7104</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 48"><unientity>70F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 4A"><unientity>7110</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 4C"><unientity>7103</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 50"><unientity>70F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 55"><unientity>7111</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 56"><unientity>7112</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 5C"><unientity>710C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 60"><unientity>70F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 66"><unientity>7113</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 67"><unientity>70EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 68"><unientity>7100</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 6C"><unientity>711E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 6D"><unientity>7134</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 6E"><unientity>7120</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 6F"><unientity>713F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 74"><unientity>7131</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 51 75"><unientity>712D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 27"><unientity>7139</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 28"><unientity>7135</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 2C"><unientity>713B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 2E"><unientity>711C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 32"><unientity>713D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 35"><unientity>712F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 3B"><unientity>7129</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 43"><unientity>712E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 48"><unientity>7177</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 51"><unientity>7146</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 52"><unientity>7152</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 54"><unientity>714F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 55"><unientity>715D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 56"><unientity>7141</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 57"><unientity>7160</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 59"><unientity>7175</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 5A"><unientity>7173</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 5C"><unientity>7143</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 5D"><unientity>715A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 5E"><unientity>7176</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 60"><unientity>714B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 62"><unientity>7147</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 65"><unientity>7168</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 66"><unientity>7171</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 67"><unientity>715F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 69"><unientity>7150</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 6B"><unientity>7153</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 70"><unientity>7144</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 76"><unientity>7172</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 78"><unientity>7178</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 7B"><unientity>7187</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 52 7C"><unientity>717B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 23"><unientity>7192</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 2B"><unientity>7180</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 2C"><unientity>7189</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 32"><unientity>7185</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 33"><unientity>7196</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 36"><unientity>717C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 39"><unientity>7198</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 3C"><unientity>7197</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 3E"><unientity>71B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 3F"><unientity>71A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 42"><unientity>71A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 46"><unientity>719E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 47"><unientity>71B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 4A"><unientity>719B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 4E"><unientity>71AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 51"><unientity>71A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 52"><unientity>71A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 55"><unientity>719A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 57"><unientity>71B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 59"><unientity>71B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 67"><unientity>71D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 69"><unientity>71C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 6A"><unientity>71B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 6D"><unientity>71CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 6F"><unientity>71CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 70"><unientity>71D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 72"><unientity>71BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 75"><unientity>71C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 77"><unientity>71C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 7A"><unientity>71BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 53 7C"><unientity>71B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 21"><unientity>71DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 22"><unientity>71C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 24"><unientity>71C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 26"><unientity>71D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 29"><unientity>71CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 2A"><unientity>71DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 32"><unientity>71EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 36"><unientity>71E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 3A"><unientity>71F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 3D"><unientity>71F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 3F"><unientity>71E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 47"><unientity>71E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 4B"><unientity>720C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 4F"><unientity>71FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 56"><unientity>71F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 5B"><unientity>720E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 5C"><unientity>5911</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 5E"><unientity>720A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 60"><unientity>7217</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 61"><unientity>7207</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 66"><unientity>7215</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 69"><unientity>7213</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 6E"><unientity>7218</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 71"><unientity>720B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 79"><unientity>721A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 54 7D"><unientity>721F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 21"><unientity>721D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 29"><unientity>7225</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 2A"><unientity>7226</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 41"><unientity>723F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 43"><unientity>7241</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 44"><unientity>7242</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 4F"><unientity>7250</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 51"><unientity>724F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 52"><unientity>7253</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 53"><unientity>7255</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 56"><unientity>725A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 59"><unientity>7263</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 61"><unientity>7273</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 63"><unientity>726E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 66"><unientity>7276</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 68"><unientity>7277</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 6B"><unientity>727E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 6D"><unientity>727C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 71"><unientity>727F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 74"><unientity>7289</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 55 7C"><unientity>728B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 22"><unientity>728D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 28"><unientity>728F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 48"><unientity>72A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 4C"><unientity>72AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 4E"><unientity>72B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 4F"><unientity>72B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 51"><unientity>72C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 52"><unientity>72B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 56"><unientity>72BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 58"><unientity>72C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 5B"><unientity>72C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 60"><unientity>72D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 64"><unientity>72D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 67"><unientity>72C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 6C"><unientity>72CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 6E"><unientity>72DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 6F"><unientity>72CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 73"><unientity>72E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 76"><unientity>72EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 79"><unientity>72E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 56 7E"><unientity>72FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 24"><unientity>72F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 25"><unientity>72FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 29"><unientity>7302</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 2C"><unientity>72FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 2D"><unientity>7301</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 2E"><unientity>72F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 31"><unientity>731D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 35"><unientity>730B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 36"><unientity>7317</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 3B"><unientity>7307</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 3E"><unientity>7318</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 42"><unientity>731E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 46"><unientity>7331</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 49"><unientity>7338</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 4A"><unientity>7322</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 4C"><unientity>7332</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 4D"><unientity>732C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 4E"><unientity>7327</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 4F"><unientity>732B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 52"><unientity>732F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 55"><unientity>7328</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 5A"><unientity>7347</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 5B"><unientity>7348</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 5C"><unientity>7349</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 5F"><unientity>733B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 62"><unientity>733A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 65"><unientity>7340</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 68"><unientity>734D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 6B"><unientity>7352</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 72"><unientity>735E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 74"><unientity>735D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 79"><unientity>7360</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 7B"><unientity>7358</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 57 7E"><unientity>7362</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 21"><unientity>734B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 25"><unientity>7367</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 29"><unientity>736C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 2B"><unientity>736B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 2F"><unientity>736F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 36"><unientity>737C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 38"><unientity>737E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 3B"><unientity>7381</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 3F"><unientity>7388</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 42"><unientity>738E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 46"><unientity>7395</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 47"><unientity>7392</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 48"><unientity>7397</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 4C"><unientity>7393</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 4D"><unientity>7394</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 51"><unientity>739E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 52"><unientity>73A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 5D"><unientity>73A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 62"><unientity>73A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 63"><unientity>73A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 67"><unientity>73B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 68"><unientity>73CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 6A"><unientity>73C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 6B"><unientity>73D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 6F"><unientity>73BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 70"><unientity>73C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 58 7D"><unientity>73CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 21"><unientity>73D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 27"><unientity>73EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 28"><unientity>73E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 2A"><unientity>73D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 2B"><unientity>73EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 2F"><unientity>73D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 30"><unientity>73DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 32"><unientity>73D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 35"><unientity>73BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 36"><unientity>73E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 38"><unientity>73E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 3A"><unientity>73DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 3C"><unientity>73E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 3F"><unientity>73E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 45"><unientity>73F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 47"><unientity>73FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 4A"><unientity>73F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 54"><unientity>73F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 5A"><unientity>73FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 5C"><unientity>7407</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 5E"><unientity>7412</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 63"><unientity>743C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 66"><unientity>742E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 67"><unientity>742F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 69"><unientity>7414</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 6A"><unientity>742C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 6C"><unientity>7430</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 6E"><unientity>742B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 70"><unientity>73F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 71"><unientity>741A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 78"><unientity>7416</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 59 7A"><unientity>7426</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 21"><unientity>7428</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 23"><unientity>7429</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 28"><unientity>7420</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 2A"><unientity>741B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 2B"><unientity>7424</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 2C"><unientity>7432</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 2D"><unientity>742D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 30"><unientity>7415</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 32"><unientity>743B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 36"><unientity>7444</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 40"><unientity>7447</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 43"><unientity>7458</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 45"><unientity>7442</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 47"><unientity>744B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 4A"><unientity>744A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 4F"><unientity>7452</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 55"><unientity>7457</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 56"><unientity>7451</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 5A"><unientity>745D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 5B"><unientity>7454</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 5D"><unientity>7440</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 60"><unientity>746D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 61"><unientity>7462</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 62"><unientity>7473</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 68"><unientity>7474</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 69"><unientity>746E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 6A"><unientity>7471</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 6B"><unientity>7468</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 78"><unientity>7460</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 79"><unientity>7472</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 7A"><unientity>7484</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 7B"><unientity>7487</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5A 7E"><unientity>7488</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 21"><unientity>7489</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 22"><unientity>747C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 27"><unientity>7482</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 28"><unientity>747E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 2A"><unientity>748A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 2D"><unientity>7486</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 30"><unientity>747A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 38"><unientity>7480</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 3C"><unientity>7481</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 3E"><unientity>747D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 3F"><unientity>7485</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 40"><unientity>7497</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 43"><unientity>7498</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 45"><unientity>749A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 4D"><unientity>74A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 54"><unientity>749F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 55"><unientity>749D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 56"><unientity>748D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 57"><unientity>749E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 59"><unientity>74A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 5D"><unientity>74A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 60"><unientity>74B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 61"><unientity>74B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 66"><unientity>74B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 67"><unientity>74AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 69"><unientity>74AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 6A"><unientity>7490</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 6C"><unientity>74A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 6E"><unientity>74A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 76"><unientity>74B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5B 7A"><unientity>74C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 25"><unientity>74BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 28"><unientity>74B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 29"><unientity>74BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 30"><unientity>74C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 31"><unientity>74C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 32"><unientity>74CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 38"><unientity>74D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 3A"><unientity>74D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 3D"><unientity>74D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 40"><unientity>74DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 41"><unientity>74DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 47"><unientity>74DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 50"><unientity>74E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 52"><unientity>74E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 54"><unientity>74E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 58"><unientity>74F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 5A"><unientity>74F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 5C"><unientity>74EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 61"><unientity>74F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 63"><unientity>74F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 66"><unientity>74FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 67"><unientity>74FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 71"><unientity>7505</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 77"><unientity>7503</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5C 7D"><unientity>7507</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 25"><unientity>750E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 28"><unientity>750D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 2C"><unientity>7511</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 2D"><unientity>750F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 32"><unientity>7512</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 33"><unientity>7513</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 39"><unientity>7517</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 42"><unientity>7521</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 44"><unientity>7524</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 49"><unientity>752F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 4D"><unientity>753A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 4F"><unientity>753F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 51"><unientity>7540</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 52"><unientity>753E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 55"><unientity>754A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 57"><unientity>754E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 58"><unientity>7547</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 59"><unientity>754B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 5A"><unientity>7548</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 5F"><unientity>755F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 60"><unientity>755B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 62"><unientity>7564</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 67"><unientity>7563</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 69"><unientity>756F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 6B"><unientity>756C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 6D"><unientity>7579</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 6E"><unientity>757A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 71"><unientity>7577</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 75"><unientity>7571</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 79"><unientity>757D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5D 7E"><unientity>757F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 25"><unientity>7583</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 2C"><unientity>7590</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 2D"><unientity>7592</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 2E"><unientity>7594</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 31"><unientity>7595</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 35"><unientity>7598</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 37"><unientity>75A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 3B"><unientity>75A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 3E"><unientity>75BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 43"><unientity>75B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 44"><unientity>75C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 46"><unientity>75BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 47"><unientity>75B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 4A"><unientity>75C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 4E"><unientity>75C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 50"><unientity>75B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 51"><unientity>75C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 58"><unientity>75CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 5C"><unientity>75CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 5E"><unientity>75CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 5F"><unientity>75D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 63"><unientity>75E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 66"><unientity>75E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 67"><unientity>75E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 71"><unientity>75E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 72"><unientity>75E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 73"><unientity>75D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 7A"><unientity>7602</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5E 7E"><unientity>7603</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 21"><unientity>75F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 22"><unientity>75FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 29"><unientity>7616</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 2C"><unientity>7608</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 2D"><unientity>7615</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 2E"><unientity>760C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 2F"><unientity>760F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 3B"><unientity>7610</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 3C"><unientity>760A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 3E"><unientity>7625</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 3F"><unientity>761A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 40"><unientity>761B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 47"><unientity>7619</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 48"><unientity>761E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 4C"><unientity>761D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 50"><unientity>7622</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 51"><unientity>762F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 54"><unientity>762D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 5C"><unientity>7633</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 5E"><unientity>763B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 5F"><unientity>7630</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 60"><unientity>763C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 62"><unientity>7635</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 67"><unientity>7648</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 68"><unientity>764E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 69"><unientity>7647</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 6A"><unientity>7643</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 6E"><unientity>764D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 6F"><unientity>7649</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 75"><unientity>7654</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 7A"><unientity>765C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 5F 7B"><unientity>7657</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 22"><unientity>7664</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 24"><unientity>7659</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 2B"><unientity>765F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 32"><unientity>7667</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 35"><unientity>766A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 37"><unientity>766D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 38"><unientity>766F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 3A"><unientity>7670</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 40"><unientity>7676</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 41"><unientity>7677</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 48"><unientity>7680</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 4A"><unientity>768B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 52"><unientity>7695</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 55"><unientity>656B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 59"><unientity>7699</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 5D"><unientity>769C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 5F"><unientity>769D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 65"><unientity>76A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 66"><unientity>76A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 67"><unientity>76A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 6A"><unientity>76AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 6D"><unientity>76AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 74"><unientity>76B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 60 77"><unientity>76BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 23"><unientity>76CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 26"><unientity>76CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 3B"><unientity>76E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 3C"><unientity>76E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 40"><unientity>76EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 44"><unientity>76ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 48"><unientity>76F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 4B"><unientity>7704</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 4F"><unientity>7708</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 50"><unientity>7707</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 53"><unientity>76F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 54"><unientity>770A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 59"><unientity>76FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 5E"><unientity>772B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 60"><unientity>770E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 62"><unientity>771B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 63"><unientity>7724</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 6C"><unientity>7722</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 6D"><unientity>771A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 6F"><unientity>7721</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 74"><unientity>7740</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 75"><unientity>7739</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 76"><unientity>772F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 61 77"><unientity>7731</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 22"><unientity>7725</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 25"><unientity>7735</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 26"><unientity>7734</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 2D"><unientity>7747</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 31"><unientity>7745</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 32"><unientity>774D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 33"><unientity>774A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 35"><unientity>7743</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 37"><unientity>774E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 3A"><unientity>775F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 3D"><unientity>7760</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 3E"><unientity>7752</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 42"><unientity>7758</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 44"><unientity>7756</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 45"><unientity>775A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 4F"><unientity>7762</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 52"><unientity>7780</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 56"><unientity>776F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 5D"><unientity>777E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 5F"><unientity>7785</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 60"><unientity>777A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 66"><unientity>E969</unientity><unientityalt>778B</unientityalt><desc>Variant of 4C6266 which maps to 778B</desc></character>
+<character hex="22 62 6A"><unientity>778D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 72"><unientity>7798</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 73"><unientity>7796</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 75"><unientity>77A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 76"><unientity>7799</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 7A"><unientity>77B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 62 7D"><unientity>77B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 23"><unientity>77B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 29"><unientity>77BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 2B"><unientity>77B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 2C"><unientity>77BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 35"><unientity>77CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 3A"><unientity>77D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 45"><unientity>77DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 46"><unientity>77DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 4F"><unientity>77E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 52"><unientity>77E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 55"><unientity>77EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 59"><unientity>77F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 5A"><unientity>77F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 5C"><unientity>77F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 60"><unientity>77FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 67"><unientity>77F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 68"><unientity>77FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 70"><unientity>7809</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 71"><unientity>7806</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 73"><unientity>7819</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 74"><unientity>7811</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 63 78"><unientity>7812</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 24"><unientity>781B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 26"><unientity>782C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 27"><unientity>7823</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 28"><unientity>782B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 2A"><unientity>7829</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 2D"><unientity>7822</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 31"><unientity>7835</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 32"><unientity>7833</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 33"><unientity>782E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 35"><unientity>7820</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 38"><unientity>783D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 3B"><unientity>781F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 3D"><unientity>7831</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 44"><unientity>784D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 48"><unientity>7848</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 49"><unientity>7853</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 4A"><unientity>7854</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 4B"><unientity>7845</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 4C"><unientity>7852</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 4E"><unientity>7850</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 4F"><unientity>7858</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 50"><unientity>7826</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 52"><unientity>7847</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 56"><unientity>784C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 5A"><unientity>7868</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 5B"><unientity>786D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 60"><unientity>7864</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 61"><unientity>785C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 64"><unientity>7876</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 66"><unientity>786A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 69"><unientity>7886</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 6B"><unientity>789A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 6C"><unientity>787F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 6D"><unientity>7887</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 70"><unientity>7894</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 76"><unientity>788F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 64 7E"><unientity>7899</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 29"><unientity>7893</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 2C"><unientity>7892</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 2D"><unientity>7896</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 2F"><unientity>78B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 31"><unientity>78A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 32"><unientity>78B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 39"><unientity>78B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 3B"><unientity>78A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 3E"><unientity>78B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 40"><unientity>78AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 41"><unientity>78A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 43"><unientity>789E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 44"><unientity>78A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 48"><unientity>78AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 4E"><unientity>78BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 55"><unientity>78CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 56"><unientity>78C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 58"><unientity>78D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 5A"><unientity>78D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 5E"><unientity>78C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 60"><unientity>78D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 68"><unientity>78DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 6A"><unientity>78E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 6E"><unientity>78DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 6F"><unientity>78E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 73"><unientity>78E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 76"><unientity>78EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 77"><unientity>78E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 79"><unientity>78F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 65 7E"><unientity>7905</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 21"><unientity>78F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 22"><unientity>78FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 27"><unientity>78FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 29"><unientity>78FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 2B"><unientity>7904</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 2E"><unientity>7912</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 32"><unientity>790C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 34"><unientity>7913</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 35"><unientity>7911</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 43"><unientity>791E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 46"><unientity>7922</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 4C"><unientity>7924</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 4D"><unientity>7927</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 50"><unientity>7929</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 55"><unientity>7931</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 5D"><unientity>7934</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 60"><unientity>7936</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 65"><unientity>793D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 67"><unientity>7942</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 68"><unientity>793F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 6A"><unientity>794A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 6B"><unientity>794D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 75"><unientity>7946</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 77"><unientity>7958</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 79"><unientity>795B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 7A"><unientity>795C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 7B"><unientity>794F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 7C"><unientity>7953</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 66 7D"><unientity>E9D0</unientity><unientityalt>7953</unientityalt><desc>Unrelated variant of EACC 22667C which maps to 7953</desc></character>
+<character hex="22 67 21"><unientity>7951</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 23"><unientity>7954</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 2A"><unientity>7967</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 2D"><unientity>796B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 30"><unientity>7972</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 3E"><unientity>797C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 4A"><unientity>7998</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 4B"><unientity>798A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 4D"><unientity>7999</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 4E"><unientity>7995</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 4F"><unientity>798B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 50"><unientity>7996</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 54"><unientity>7994</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 55"><unientity>7993</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 5C"><unientity>799A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 5F"><unientity>79A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 60"><unientity>799B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 61"><unientity>79A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 64"><unientity>799D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 6E"><unientity>79A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 70"><unientity>79AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 71"><unientity>79A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 75"><unientity>79B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 7A"><unientity>79B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 67 7B"><unientity>79B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 22"><unientity>79B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 23"><unientity>79BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 25"><unientity>79BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 28"><unientity>79C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 2A"><unientity>79C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 2D"><unientity>79D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 2E"><unientity>79D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 32"><unientity>79D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 3D"><unientity>79EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 3E"><unientity>E96A</unientity><unientityalt>79EB</unientityalt><desc>Variant of 4C683E which maps to 79EB</desc></character>
+<character hex="22 68 42"><unientity>79E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 44"><unientity>79DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 45"><unientity>79ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 48"><unientity>79F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 4F"><unientity>7A02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 50"><unientity>7A0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 54"><unientity>7A09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 5C"><unientity>7A03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 61"><unientity>7A0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 6B"><unientity>7A11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 6C"><unientity>7A18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 6F"><unientity>E96B</unientity><unientityalt>7A19</unientityalt><desc>Variant of 2E686F which maps to 7A19</desc></character>
+<character hex="22 68 71"><unientity>7A1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 76"><unientity>7A17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 68 7E"><unientity>7A2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 22"><unientity>7A2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 39"><unientity>7A48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 3D"><unientity>7A4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 3E"><unientity>7A47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 3F"><unientity>7A44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 40"><unientity>7A5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 4D"><unientity>7A5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 4F"><unientity>7A60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 57"><unientity>7A6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 5F"><unientity>7A70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 66"><unientity>7A75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 69"><unientity>7A78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 6B"><unientity>7A80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 70"><unientity>7A85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 75"><unientity>7A86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 78"><unientity>7A8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 7A"><unientity>7A94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 69 7E"><unientity>68A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 28"><unientity>7AA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 2B"><unientity>7A9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 2C"><unientity>7AA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 2E"><unientity>7AA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 31"><unientity>7AAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 36"><unientity>7AB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 3A"><unientity>7ABD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 3C"><unientity>7AB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 3D"><unientity>7AB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 3E"><unientity>7AB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 3F"><unientity>7ABB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 43"><unientity>7ABF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 49"><unientity>7ACD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 4B"><unientity>7ACF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 4F"><unientity>7AD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 51"><unientity>7AD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 52"><unientity>7AD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 54"><unientity>7AD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 55"><unientity>7ADA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 5A"><unientity>7AE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 5E"><unientity>7AE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 66"><unientity>7AEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 6B"><unientity>7AF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 76"><unientity>7AF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6A 7C"><unientity>7AFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 27"><unientity>7B39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 2D"><unientity>7B0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 2E"><unientity>7B08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 33"><unientity>7B0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 35"><unientity>7B35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 36"><unientity>7B25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 39"><unientity>7B38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 3B"><unientity>7B3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 3F"><unientity>7B24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 40"><unientity>7B33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 42"><unientity>7B2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 44"><unientity>7B18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 47"><unientity>7B31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 4A"><unientity>7B2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 4B"><unientity>7B37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 4D"><unientity>7B1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 52"><unientity>7B4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 53"><unientity>E9ED</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 6B 54"><unientity>E96C</unientity><unientityalt>7B04</unientityalt><desc>Variant of 2E6B54 which maps to 7B04</desc></character>
+<character hex="22 6B 55"><unientity>7B47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 59"><unientity>7B58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 5B"><unientity>7B6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 60"><unientity>7B48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 61"><unientity>7B45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 62"><unientity>7B4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 63"><unientity>7B4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 68"><unientity>7B66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 6C"><unientity>7B64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 6E"><unientity>7B69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 70"><unientity>7B6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 74"><unientity>7B62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 75"><unientity>7B6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 76"><unientity>7B74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 79"><unientity>7B72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 7A"><unientity>7B78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 7B"><unientity>7B6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 7C"><unientity>7B67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6B 7E"><unientity>7B65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 26"><unientity>7B71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 27"><unientity>7B70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 29"><unientity>7B73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 2D"><unientity>7B9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 33"><unientity>7B92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 34"><unientity>7B91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 35"><unientity>7B90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 38"><unientity>7BA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 3A"><unientity>7B8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 41"><unientity>7B85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 43"><unientity>7B8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 44"><unientity>7B98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 46"><unientity>7B86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 48"><unientity>7B99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 52"><unientity>7BB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 58"><unientity>7BCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 59"><unientity>7BB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 5A"><unientity>7BCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 5C"><unientity>7BD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 60"><unientity>7BBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6C 6F"><unientity>7BCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 22"><unientity>7BDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 24"><unientity>7BE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 29"><unientity>7BE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 2E"><unientity>7BF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 2F"><unientity>7BD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 32"><unientity>7BDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 35"><unientity>7BD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 37"><unientity>E9D1</unientity><unientityalt>7BEA</unientityalt><desc>Unrelated variant of EACC 3A6A7C which maps to 7BEA</desc></character>
+<character hex="22 6D 3B"><unientity>7C06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 3E"><unientity>7BF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 41"><unientity>7C0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 46"><unientity>7C0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 47"><unientity>7C00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 4B"><unientity>7C0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 4F"><unientity>7BF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 54"><unientity>7BF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 5A"><unientity>7C09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 5B"><unientity>7C03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 5C"><unientity>7BFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 5F"><unientity>7C1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 61"><unientity>7C26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 62"><unientity>7C28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 63"><unientity>7C20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 66"><unientity>7C1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 68"><unientity>7C2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6D 75"><unientity>7C30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 27"><unientity>7C35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 2A"><unientity>7C40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 30"><unientity>7C39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 34"><unientity>7C3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 35"><unientity>7C34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 3B"><unientity>7C42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 46"><unientity>7C4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 54"><unientity>7C5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 56"><unientity>7C5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 57"><unientity>7C5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 58"><unientity>7C5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 59"><unientity>7C59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 5B"><unientity>7C5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 5C"><unientity>7C67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 5E"><unientity>7C63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 61"><unientity>7C68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 62"><unientity>7C65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 6F"><unientity>7C6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 75"><unientity>7C75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 79"><unientity>7C7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 7A"><unientity>7C78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6E 7D"><unientity>7C7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 21"><unientity>7C81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 28"><unientity>7C8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 29"><unientity>7C91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 2A"><unientity>7C83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 2C"><unientity>7C8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 3A"><unientity>7C99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 3B"><unientity>7C98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 3E"><unientity>7C9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 40"><unientity>7C95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 42"><unientity>7CA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 43"><unientity>7CA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 45"><unientity>7C9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 46"><unientity>7CA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 48"><unientity>7CA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 49"><unientity>7CA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 4A"><unientity>7CAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 4C"><unientity>7CA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 54"><unientity>7CB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 58"><unientity>7CBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 59"><unientity>7CBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 5E"><unientity>7CBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 5F"><unientity>7CBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 64"><unientity>7CC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 66"><unientity>7CCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 68"><unientity>7CC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 69"><unientity>7CC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 6D"><unientity>7CCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 6F"><unientity>7CC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 71"><unientity>7CD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 75"><unientity>7CD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 77"><unientity>7CE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 6F 7B"><unientity>E96D</unientity><unientityalt>7CE8</unientityalt><desc>Variant of 4C6F7B which maps to 7CE8</desc></character>
+<character hex="22 70 22"><unientity>7CDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 28"><unientity>7CED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 2E"><unientity>7CF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 30"><unientity>7CF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 35"><unientity>7CF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 39"><unientity>7CF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 42"><unientity>7D06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 44"><unientity>7D03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 45"><unientity>7D08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 49"><unientity>7D0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 4A"><unientity>7D13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 50"><unientity>7D18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 51"><unientity>7D1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 52"><unientity>7D1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 59"><unientity>7D35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 5A"><unientity>7D3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 61"><unientity>7D3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 62"><unientity>7D32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 65"><unientity>7D31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 68"><unientity>7D45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 6A"><unientity>7D3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 6C"><unientity>7D29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 6F"><unientity>7D41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 71"><unientity>7D3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 7A"><unientity>7D5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 7C"><unientity>7D53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 70 7E"><unientity>7D5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 22"><unientity>7D70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 29"><unientity>7D67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 2B"><unientity>7D6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 2C"><unientity>7D6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 30"><unientity>7D73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 34"><unientity>7D4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 37"><unientity>7D8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 39"><unientity>7D88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 3B"><unientity>7D85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 3D"><unientity>7D8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 42"><unientity>7D7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 44"><unientity>7D86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 48"><unientity>7D8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 4B"><unientity>7D9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 4D"><unientity>7D83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 4F"><unientity>7D7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 54"><unientity>7D7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 58"><unientity>7D7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 59"><unientity>7D96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 5A"><unientity>7D5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 5B"><unientity>7D8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 61"><unientity>7DA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 62"><unientity>7DAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 67"><unientity>7DCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 69"><unientity>7DAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 6A"><unientity>7DCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 6B"><unientity>7DC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 6E"><unientity>7DC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 6F"><unientity>7DA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 74"><unientity>7DC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 78"><unientity>7DAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 71 7D"><unientity>7DB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 22"><unientity>7D9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 29"><unientity>7DE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 2A"><unientity>7DD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 2B"><unientity>7DE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 31"><unientity>7DD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 36"><unientity>7DF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 3A"><unientity>7E06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 3C"><unientity>7DF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 3E"><unientity>7DE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 46"><unientity>7DDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 47"><unientity>7DF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 48"><unientity>7DF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 49"><unientity>7DE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 4B"><unientity>7DF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 50"><unientity>7E17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 51"><unientity>7E1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 52"><unientity>7E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 53"><unientity>7E0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 55"><unientity>7E12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 56"><unientity>7E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 5B"><unientity>7E20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 5D"><unientity>7E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 5E"><unientity>7E09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 5F"><unientity>7E1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 65"><unientity>7E15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 69"><unientity>7E10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 6A"><unientity>7E0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 6D"><unientity>7E3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 71"><unientity>7E34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 72"><unientity>7E2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 73"><unientity>7E2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 75"><unientity>7E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 77"><unientity>7E3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 79"><unientity>7E39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 72 7D"><unientity>7E44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 21"><unientity>7E35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 26"><unientity>7E3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 28"><unientity>7E47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 2D"><unientity>7E52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 2F"><unientity>7E51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 33"><unientity>7E50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 34"><unientity>7E67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 37"><unientity>7E56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 48"><unientity>7E68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 49"><unientity>7E6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 4E"><unientity>7E70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 51"><unientity>7E6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 52"><unientity>7E73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 58"><unientity>7E7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 59"><unientity>7E7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 5B"><unientity>7E81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 5D"><unientity>7E8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 5E"><unientity>7E87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 60"><unientity>7E88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 64"><unientity>7E86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 6A"><unientity>7E91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 6B"><unientity>7E95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 6D"><unientity>7E94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 70"><unientity>7E9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 71"><unientity>7E9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 73"><unientity>7E99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 73 74"><unientity>7E98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 25"><unientity>7F43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 27"><unientity>7F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 28"><unientity>7F45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 2B"><unientity>7F4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 2E"><unientity>7F4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 2F"><unientity>7F4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 31"><unientity>7F4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 32"><unientity>7F4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 3E"><unientity>7F60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 3F"><unientity>7F61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 43"><unientity>7F5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 45"><unientity>7F5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 47"><unientity>7F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 50"><unientity>7F65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 51"><unientity>7F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 53"><unientity>7F6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 54"><unientity>7F6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 55"><unientity>7F67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 57"><unientity>7F68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 5E"><unientity>7F71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 60"><unientity>7F73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 63"><unientity>7F76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 6A"><unientity>7F7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 6B"><unientity>7F7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 6C"><unientity>7F7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 72"><unientity>7F86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 7A"><unientity>7F91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 74 7E"><unientity>7F96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 23"><unientity>7F97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 24"><unientity>7F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 2C"><unientity>7FA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 33"><unientity>7FA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 3B"><unientity>7FB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 3C"><unientity>7FAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 3F"><unientity>7FB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 40"><unientity>7FB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 42"><unientity>7FB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 4A"><unientity>7FBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 4C"><unientity>7FBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 51"><unientity>7FC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 57"><unientity>7FCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 67"><unientity>7FDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 68"><unientity>7FE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 6C"><unientity>7FE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 6F"><unientity>7FE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 72"><unientity>7FEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 73"><unientity>7FEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 77"><unientity>7FEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 75 7A"><unientity>7FEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 29"><unientity>7FFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 2A"><unientity>7FFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 2C"><unientity>7FFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 2E"><unientity>8004</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 31"><unientity>8008</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 33"><unientity>800B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 34"><unientity>800E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 35"><unientity>8011</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 36"><unientity>800F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 37"><unientity>8014</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 39"><unientity>8016</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 3B"><unientity>801F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 3D"><unientity>801E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 3E"><unientity>801D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 4B"><unientity>8025</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 4C"><unientity>8026</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 4D"><unientity>802A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 4E"><unientity>8029</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 4F"><unientity>8028</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 5B"><unientity>8030</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 5D"><unientity>8031</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 60"><unientity>8035</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 69"><unientity>8039</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 6B"><unientity>8041</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 70"><unientity>8043</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 7B"><unientity>8052</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 76 7E"><unientity>8062</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 28"><unientity>8063</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 32"><unientity>806C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 39"><unientity>8075</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 3E"><unientity>807B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 3F"><unientity>8079</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 47"><unientity>808A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 49"><unientity>808E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 4E"><unientity>809F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 5C"><unientity>670A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 60"><unientity>80A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 61"><unientity>80B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 68"><unientity>80B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 69"><unientity>80B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 6A"><unientity>80A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 73"><unientity>80E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 75"><unientity>6711</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 7B"><unientity>80DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 77 7D"><unientity>80C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 27"><unientity>80D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 2A"><unientity>80DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 2D"><unientity>80CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 2F"><unientity>80CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 30"><unientity>80D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 33"><unientity>80F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 34"><unientity>80FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 38"><unientity>80FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 3C"><unientity>8103</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 40"><unientity>80F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 41"><unientity>80EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 42"><unientity>80D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 49"><unientity>811D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 4B"><unientity>8118</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 50"><unientity>8130</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 54"><unientity>8124</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 55"><unientity>811B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 60"><unientity>812A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 61"><unientity>811E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 64"><unientity>8121</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 66"><unientity>8117</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 69"><unientity>813A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 6A"><unientity>815A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 6D"><unientity>8148</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 77"><unientity>814C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 7C"><unientity>8153</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 78 7D"><unientity>8141</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 25"><unientity>814D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 2E"><unientity>6720</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 32"><unientity>8160</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 3B"><unientity>8169</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 3C"><unientity>817C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 41"><unientity>8161</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 46"><unientity>8176</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 47"><unientity>8174</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 48"><unientity>8167</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 4B"><unientity>816F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 4D"><unientity>8182</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 51"><unientity>818B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 52"><unientity>8186</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 59"><unientity>8183</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 6A"><unientity>819F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 6B"><unientity>81A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 70"><unientity>8198</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 75"><unientity>8195</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 77"><unientity>8197</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 7C"><unientity>81AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 7D"><unientity>81A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 79 7E"><unientity>6725</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 2C"><unientity>81B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 2E"><unientity>81B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 2F"><unientity>81B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 33"><unientity>81B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 37"><unientity>81BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 38"><unientity>81C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 39"><unientity>81CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 3A"><unientity>81CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 3B"><unientity>81C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 40"><unientity>81D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 41"><unientity>81CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 43"><unientity>81D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 4B"><unientity>81DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 4F"><unientity>81DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 53"><unientity>81DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 56"><unientity>81E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 57"><unientity>81E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 5B"><unientity>81E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 60"><unientity>81EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 65"><unientity>81F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 68"><unientity>81F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 70"><unientity>8201</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 72"><unientity>E9EE</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="22 7A 74"><unientity>8203</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 75"><unientity>8204</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7A 77"><unientity>820B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 27"><unientity>821D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 29"><unientity>8220</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 2E"><unientity>822D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 2F"><unientity>822F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 32"><unientity>8238</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 34"><unientity>823A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 35"><unientity>8233</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 36"><unientity>8234</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 3A"><unientity>8232</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 42"><unientity>8248</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 43"><unientity>8249</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 45"><unientity>8244</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 47"><unientity>8240</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 48"><unientity>8241</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 4A"><unientity>8245</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 4B"><unientity>824B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 50"><unientity>824F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 53"><unientity>824E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 56"><unientity>8256</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 57"><unientity>8257</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 5E"><unientity>825A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 62"><unientity>825F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 67"><unientity>8262</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 6B"><unientity>8268</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 6F"><unientity>826D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 77"><unientity>8278</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7B 7D"><unientity>827F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 24"><unientity>828E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 25"><unientity>8291</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 27"><unientity>828F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 28"><unientity>8284</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 2D"><unientity>8283</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 2E"><unientity>828A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 31"><unientity>82AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 34"><unientity>82A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 38"><unientity>82AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 3A"><unientity>82B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 3C"><unientity>82A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 3F"><unientity>829A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 42"><unientity>82A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 44"><unientity>82B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 45"><unientity>E96E</unientity><unientityalt>82AE</unientityalt><desc>Variant of 4C7C45 which maps to 82AE</desc></character>
+<character hex="22 7C 46"><unientity>82A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 49"><unientity>82BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 4C"><unientity>82A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 4E"><unientity>82B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 50"><unientity>82A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 53"><unientity>82AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 55"><unientity>82D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 57"><unientity>82FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 5A"><unientity>82E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 5B"><unientity>82D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 5C"><unientity>8300</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 5F"><unientity>82EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 60"><unientity>82F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 62"><unientity>82EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 63"><unientity>833A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 64"><unientity>82E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 65"><unientity>82D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 67"><unientity>8307</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 68"><unientity>82FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 69"><unientity>82F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 6A"><unientity>82E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 6D"><unientity>82D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 6E"><unientity>8314</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 71"><unientity>82EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 72"><unientity>82D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 73"><unientity>82E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 75"><unientity>82F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 7B"><unientity>8310</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7C 7C"><unientity>82F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 21"><unientity>830C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 22"><unientity>82FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 24"><unientity>82FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 26"><unientity>8333</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 29"><unientity>8328</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 2B"><unientity>8344</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 2E"><unientity>8351</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 35"><unientity>831B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 3B"><unientity>8356</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 3F"><unientity>8322</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 40"><unientity>832C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 48"><unientity>833C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 4A"><unientity>834D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 4D"><unientity>E96F</unientity><unientityalt>8343</unientityalt><desc>Variant of 4C7D4D which maps to 8343</desc></character>
+<character hex="22 7D 52"><unientity>832F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 53"><unientity>8348</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 54"><unientity>8312</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 56"><unientity>8316</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 58"><unientity>831A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 5F"><unientity>8347</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 62"><unientity>83A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 67"><unientity>83AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 6D"><unientity>8373</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 72"><unientity>83B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 76"><unientity>831D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 7A"><unientity>838F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 7C"><unientity>8395</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7D 7E"><unientity>8375</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 21"><unientity>837F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 22"><unientity>8399</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 23"><unientity>83A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 25"><unientity>8387</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 26"><unientity>83B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 2B"><unientity>83A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 2F"><unientity>839B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 33"><unientity>83AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 37"><unientity>839C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 38"><unientity>839F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 41"><unientity>83CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 43"><unientity>83F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 45"><unientity>8421</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 51"><unientity>8423</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 52"><unientity>83EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 53"><unientity>8413</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 56"><unientity>83FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 57"><unientity>83F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 59"><unientity>8410</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 5A"><unientity>83E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 60"><unientity>83C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 61"><unientity>8407</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 63"><unientity>83EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 6A"><unientity>83BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 6B"><unientity>83E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 6D"><unientity>8401</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 71"><unientity>83D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 72"><unientity>83E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 74"><unientity>8418</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 79"><unientity>83CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 7B"><unientity>83D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="22 7E 7D"><unientity>83D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 23"><unientity>83FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 25"><unientity>841E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 29"><unientity>83C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 2A"><unientity>83DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 2C"><unientity>841F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 2E"><unientity>840F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 30"><unientity>8411</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 36"><unientity>839A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 3C"><unientity>83F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 43"><unientity>83D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 48"><unientity>8453</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 4A"><unientity>848E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 4C"><unientity>8439</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 4D"><unientity>8476</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 4E"><unientity>8479</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 5C"><unientity>8451</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 5F"><unientity>847D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 62"><unientity>845A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 66"><unientity>8459</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 69"><unientity>8473</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 6E"><unientity>843E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 71"><unientity>846D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 78"><unientity>847A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 7B"><unientity>8484</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 22 7C"><unientity>8478</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 24"><unientity>8432</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 29"><unientity>845C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 2D"><unientity>842A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 2E"><unientity>8429</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 32"><unientity>8471</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 35"><unientity>845F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 36"><unientity>8460</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 37"><unientity>846E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 3A"><unientity>8446</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 3C"><unientity>8452</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 3F"><unientity>844A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 45"><unientity>844E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 49"><unientity>8497</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 50"><unientity>84A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 53"><unientity>849F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 56"><unientity>84BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 58"><unientity>84B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 5C"><unientity>84B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 5E"><unientity>84C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 5F"><unientity>84BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 68"><unientity>84CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 70"><unientity>84B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 71"><unientity>849D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 72"><unientity>84D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 75"><unientity>8494</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 79"><unientity>84C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 7A"><unientity>84BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 23 7C"><unientity>84C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 21"><unientity>8495</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 27"><unientity>84AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 29"><unientity>84AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 32"><unientity>84A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 33"><unientity>84D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 35"><unientity>84DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 3A"><unientity>8493</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 3F"><unientity>84CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 41"><unientity>84CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 46"><unientity>8506</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 47"><unientity>850B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 4D"><unientity>8500</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 59"><unientity>851F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 5C"><unientity>853B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 5F"><unientity>84EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 66"><unientity>84F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 6A"><unientity>850C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 72"><unientity>852F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 75"><unientity>8515</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 77"><unientity>84F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 7A"><unientity>84FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 7C"><unientity>84EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 24 7D"><unientity>84FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 24"><unientity>851E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 2A"><unientity>8518</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 2D"><unientity>8526</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 2E"><unientity>E970</unientity><unientityalt>8507</unientityalt><desc>Variant of 2F252E which maps to 8507</desc></character>
+<character hex="23 25 2F"><unientity>84E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 34"><unientity>84F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 35"><unientity>84EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 36"><unientity>8556</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 46"><unientity>8541</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 4B"><unientity>8558</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 4D"><unientity>8553</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 4E"><unientity>8561</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 4F"><unientity>8540</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 5A"><unientity>8546</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 5C"><unientity>8564</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 5D"><unientity>855E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 5E"><unientity>8573</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 5F"><unientity>8551</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 64"><unientity>8562</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 6B"><unientity>8563</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 6C"><unientity>848D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 6D"><unientity>8542</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 71"><unientity>854E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 74"><unientity>8555</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 76"><unientity>855D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 25 77"><unientity>858C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 25"><unientity>8580</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 28"><unientity>858F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 2D"><unientity>8579</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 32"><unientity>857F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 33"><unientity>8577</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 34"><unientity>8578</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 35"><unientity>8598</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 36"><unientity>857B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 3D"><unientity>85A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 42"><unientity>857A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 44"><unientity>8597</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 45"><unientity>8557</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 49"><unientity>85A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 4E"><unientity>8586</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 50"><unientity>8599</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 51"><unientity>858A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 52"><unientity>85A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 54"><unientity>8590</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 56"><unientity>8585</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 57"><unientity>8588</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 5A"><unientity>85B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 5D"><unientity>85C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 61"><unientity>85BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 68"><unientity>85CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 6A"><unientity>85C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 6B"><unientity>85B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 6C"><unientity>85B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 6E"><unientity>85B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 6F"><unientity>85BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 70"><unientity>85C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 72"><unientity>85BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 75"><unientity>85BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 26 7E"><unientity>85B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 24"><unientity>8624</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 28"><unientity>85F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 2C"><unientity>85E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 2E"><unientity>85D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 31"><unientity>85ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 39"><unientity>85DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 43"><unientity>85DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 45"><unientity>85D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 4C"><unientity>85DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 4E"><unientity>85F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 52"><unientity>8622</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 54"><unientity>8610</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 57"><unientity>85FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 5B"><unientity>85FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 5E"><unientity>85FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 60"><unientity>8600</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 68"><unientity>8604</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 71"><unientity>8605</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 27 75"><unientity>862B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 22"><unientity>8627</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 26"><unientity>8629</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 32"><unientity>8637</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 38"><unientity>8636</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 3E"><unientity>863C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 3F"><unientity>8640</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 40"><unientity>863A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 4C"><unientity>8645</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 59"><unientity>864D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 5A"><unientity>8653</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 5E"><unientity>8659</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 66"><unientity>8661</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 69"><unientity>8662</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 6A"><unientity>8663</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 71"><unientity>8669</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 78"><unientity>866C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 7B"><unientity>8672</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 7C"><unientity>866F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 28 7E"><unientity>867B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 25"><unientity>867A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 26"><unientity>8673</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 27"><unientity>867C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 2E"><unientity>8696</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 2F"><unientity>86A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 36"><unientity>8691</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 37"><unientity>869C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 39"><unientity>8698</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 3C"><unientity>868D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 3D"><unientity>868B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 40"><unientity>86A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 42"><unientity>869D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 46"><unientity>86A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 48"><unientity>86A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 4B"><unientity>86BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 58"><unientity>86BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 59"><unientity>86B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 60"><unientity>86B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 62"><unientity>86C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 63"><unientity>86B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 67"><unientity>86D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 6E"><unientity>86E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 6F"><unientity>86E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 71"><unientity>86EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 74"><unientity>86D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 77"><unientity>86D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 7A"><unientity>86D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 29 7E"><unientity>86DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 25"><unientity>870B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 2F"><unientity>86FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 33"><unientity>86F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 34"><unientity>8706</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 36"><unientity>870E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 38"><unientity>8709</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 3A"><unientity>870A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 3E"><unientity>870D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 42"><unientity>874A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 43"><unientity>8723</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 44"><unientity>8737</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 45"><unientity>8728</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 49"><unientity>8740</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 4B"><unientity>872E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 4C"><unientity>873D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 4E"><unientity>871E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 53"><unientity>8743</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 55"><unientity>8744</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 57"><unientity>873E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 59"><unientity>8729</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 5A"><unientity>8739</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 5F"><unientity>871A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 64"><unientity>8731</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 65"><unientity>8711</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 66"><unientity>8712</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 6B"><unientity>874F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 6C"><unientity>8771</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 6D"><unientity>8763</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 71"><unientity>8764</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 73"><unientity>8765</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 74"><unientity>877D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 79"><unientity>8758</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2A 7B"><unientity>877B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 21"><unientity>8761</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 24"><unientity>876A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 27"><unientity>874E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 28"><unientity>875F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 2D"><unientity>876F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 2E"><unientity>875D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 30"><unientity>876E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 33"><unientity>874D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 35"><unientity>8753</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 3A"><unientity>87A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 3D"><unientity>8793</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 45"><unientity>8799</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 48"><unientity>8788</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 4C"><unientity>8798</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 53"><unientity>8785</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 54"><unientity>878B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 55"><unientity>8784</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 58"><unientity>87A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 5D"><unientity>8789</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 60"><unientity>87AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 66"><unientity>87BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 6E"><unientity>87C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 6F"><unientity>87AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 72"><unientity>87AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 78"><unientity>87AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2B 7E"><unientity>87BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 24"><unientity>87BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 2C"><unientity>87EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 30"><unientity>87F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 31"><unientity>87F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 34"><unientity>87EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 36"><unientity>87DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 37"><unientity>87E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 39"><unientity>87EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 3A"><unientity>87D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 3F"><unientity>87F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 47"><unientity>87E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 48"><unientity>87D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 49"><unientity>87DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 4C"><unientity>87E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 4D"><unientity>8801</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 4F"><unientity>8803</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 50"><unientity>880A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 55"><unientity>87F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 57"><unientity>87F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 5C"><unientity>880B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 5D"><unientity>8806</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 5F"><unientity>87FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 61"><unientity>8810</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 63"><unientity>8819</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 64"><unientity>8811</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 66"><unientity>8818</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 6A"><unientity>8813</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 6B"><unientity>8816</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 72"><unientity>8834</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 73"><unientity>881C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2C 7A"><unientity>881B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 23"><unientity>8828</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 2A"><unientity>8832</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 2E"><unientity>882E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 32"><unientity>882D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 3C"><unientity>883C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 41"><unientity>8841</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 42"><unientity>E9EF</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="23 2D 44"><unientity>8844</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 4B"><unientity>8847</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 51"><unientity>884A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 53"><unientity>884E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 56"><unientity>8852</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 57"><unientity>8850</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 59"><unientity>8856</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 5A"><unientity>8855</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 5E"><unientity>885C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 5F"><unientity>885A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 69"><unientity>8869</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 6D"><unientity>886D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 6E"><unientity>887A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 71"><unientity>8875</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 75"><unientity>8872</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 79"><unientity>887D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 7C"><unientity>8879</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 7D"><unientity>887F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2D 7E"><unientity>887E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 28"><unientity>88A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 2A"><unientity>88A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 2F"><unientity>88AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 34"><unientity>889A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 3A"><unientity>8890</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 3B"><unientity>888C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 3D"><unientity>88A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 40"><unientity>8899</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 45"><unientity>8897</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 48"><unientity>88C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 49"><unientity>88BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 4A"><unientity>88BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 4F"><unientity>88C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 51"><unientity>88B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 54"><unientity>88BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 57"><unientity>88B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 59"><unientity>88BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 5A"><unientity>88C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 5E"><unientity>88CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 60"><unientity>88CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 62"><unientity>88DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 64"><unientity>88CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 68"><unientity>88D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 71"><unientity>88F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 72"><unientity>88FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 75"><unientity>88F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 78"><unientity>8900</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2E 7A"><unientity>88F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 21"><unientity>88FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 23"><unientity>88EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 24"><unientity>8903</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 2D"><unientity>8909</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 2F"><unientity>8918</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 35"><unientity>8906</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 36"><unientity>890C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 37"><unientity>8919</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 3D"><unientity>890A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 43"><unientity>8915</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 45"><unientity>892F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 47"><unientity>8930</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 4E"><unientity>8921</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 4F"><unientity>8927</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 51"><unientity>891F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 53"><unientity>8931</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 54"><unientity>891E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 56"><unientity>8926</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 57"><unientity>8922</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 5A"><unientity>8935</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 5D"><unientity>8941</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 60"><unientity>8933</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 66"><unientity>8954</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 6F"><unientity>894F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 72"><unientity>8947</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 7A"><unientity>894C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 2F 7B"><unientity>8946</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 21"><unientity>894D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 23"><unientity>8962</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 24"><unientity>895A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 25"><unientity>895E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 29"><unientity>895B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 2C"><unientity>895C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 2D"><unientity>895D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 31"><unientity>8966</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 37"><unientity>896D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 3A"><unientity>896B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 3B"><unientity>896E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 3C"><unientity>896C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 41"><unientity>8976</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 42"><unientity>8974</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 49"><unientity>897B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 4A"><unientity>897C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 53"><unientity>8984</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 55"><unientity>8985</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 62"><unientity>8991</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 64"><unientity>8997</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 66"><unientity>8998</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 6B"><unientity>899C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 6F"><unientity>89A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 76"><unientity>89A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 79"><unientity>89A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 30 7D"><unientity>89AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 2A"><unientity>89B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 2B"><unientity>89B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 2C"><unientity>89B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 2F"><unientity>89BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 32"><unientity>89BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 3A"><unientity>89D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 3B"><unientity>89D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 3F"><unientity>89DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 43"><unientity>89E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 45"><unientity>89DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 47"><unientity>89E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 4C"><unientity>89E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 4D"><unientity>89EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 53"><unientity>89ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 58"><unientity>89F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 5C"><unientity>89F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 5E"><unientity>89F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 60"><unientity>89F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 64"><unientity>89F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 6B"><unientity>89FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 6C"><unientity>8A06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 6D"><unientity>8A07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 6E"><unientity>8A04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 70"><unientity>8A0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 71"><unientity>8A11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 72"><unientity>8A12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 73"><unientity>8A0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 7A"><unientity>8A27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 31 7D"><unientity>8A29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 25"><unientity>8A22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 27"><unientity>8A51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 28"><unientity>8A4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 2A"><unientity>8A4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 30"><unientity>8A56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 37"><unientity>8A57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 39"><unientity>8A48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 3B"><unientity>8A58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 3C"><unientity>8A52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 40"><unientity>8A3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 42"><unientity>8A45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 4F"><unientity>8A7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 50"><unientity>8A86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 56"><unientity>8A61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 58"><unientity>8A3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 59"><unientity>8A82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 5D"><unientity>8A84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 5E"><unientity>8A75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 69"><unientity>8A8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 6F"><unientity>8A96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 71"><unientity>8A9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 32 7E"><unientity>8AB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 21"><unientity>8ABE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 25"><unientity>8ACF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 27"><unientity>8AC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 2C"><unientity>8AD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 2D"><unientity>8AD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 31"><unientity>8AAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 33"><unientity>8AD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 36"><unientity>8ACD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 38"><unientity>8AB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 3B"><unientity>8ADB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 3F"><unientity>8AD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 40"><unientity>8AD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 44"><unientity>8AF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 45"><unientity>8AE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 49"><unientity>8B4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 4C"><unientity>8ADD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 4E"><unientity>8AF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 4F"><unientity>8AF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 50"><unientity>8AF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 53"><unientity>8ADF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 56"><unientity>8B03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 57"><unientity>8AE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 59"><unientity>8B14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 5D"><unientity>8AFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 62"><unientity>8ADE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 63"><unientity>8AE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 64"><unientity>8B07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 6B"><unientity>8B0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 6F"><unientity>8B1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 73"><unientity>8B16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 76"><unientity>8B1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 78"><unientity>8B0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 79"><unientity>8B06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 7A"><unientity>8B05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 7C"><unientity>8B0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 33 7D"><unientity>8B10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 22"><unientity>8B2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 2A"><unientity>8B37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 2D"><unientity>8B26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 30"><unientity>8B33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 38"><unientity>8B3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 3A"><unientity>8B29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 42"><unientity>8B48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 44"><unientity>8B54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 48"><unientity>8B53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 49"><unientity>8B4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 4A"><unientity>8B46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 4D"><unientity>8B56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 4F"><unientity>8B3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 59"><unientity>8B59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 5F"><unientity>8B4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 68"><unientity>8B6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 6B"><unientity>8B6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 70"><unientity>8B78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 73"><unientity>8B45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 78"><unientity>8B85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 79"><unientity>8B81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 34 7B"><unientity>8B7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 23"><unientity>8B8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 26"><unientity>8B87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 2D"><unientity>8B95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 2E"><unientity>8B94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 37"><unientity>8B9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 3A"><unientity>8B9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 3D"><unientity>8C3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 44"><unientity>8C40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 45"><unientity>8C42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 4B"><unientity>8C47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 4D"><unientity>8C4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 50"><unientity>8C4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 52"><unientity>8C55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 54"><unientity>8C57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 55"><unientity>8C5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 56"><unientity>8C5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 5C"><unientity>86C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 63"><unientity>8C68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 65"><unientity>8C6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 6D"><unientity>8C73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 6F"><unientity>8C74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 71"><unientity>8C75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 73"><unientity>8C77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 74"><unientity>8C76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 7B"><unientity>8C78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 35 7D"><unientity>8C7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 2A"><unientity>8C86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 2D"><unientity>8C85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 2E"><unientity>8C88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 39"><unientity>8C94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 41"><unientity>8C9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 43"><unientity>8C9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 44"><unientity>8CA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 4E"><unientity>8CB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 51"><unientity>8CBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 52"><unientity>8CB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 53"><unientity>8CB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 57"><unientity>8CCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 5E"><unientity>8CD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 5F"><unientity>8CD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 67"><unientity>8CE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 68"><unientity>8CE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 6A"><unientity>8CE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 6F"><unientity>8CEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 70"><unientity>8CDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 72"><unientity>8CDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 74"><unientity>8CD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 76"><unientity>8CEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 7B"><unientity>8CF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 7C"><unientity>8CF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 36 7E"><unientity>8CFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 21"><unientity>8CF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 25"><unientity>8D04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 26"><unientity>8CFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 2B"><unientity>8D07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 2D"><unientity>8D09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 32"><unientity>8D0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 39"><unientity>8D11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 3A"><unientity>8D10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 3B"><unientity>8D12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 3D"><unientity>8D14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 3E"><unientity>8D18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 48"><unientity>8D6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 52"><unientity>8D78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 5C"><unientity>8D7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 61"><unientity>8D84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 71"><unientity>8D94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 37 75"><unientity>8D8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 22"><unientity>8D96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 2F"><unientity>8DA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 33"><unientity>8DA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 52"><unientity>8DAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 59"><unientity>8DAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 5A"><unientity>8DB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 66"><unientity>8DB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 6E"><unientity>8DBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 6F"><unientity>8DBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 70"><unientity>8DB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 71"><unientity>8DC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 72"><unientity>8DC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 38 73"><unientity>8DBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 21"><unientity>8DCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 22"><unientity>8DD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 27"><unientity>8DD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 2B"><unientity>8DC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 2F"><unientity>8DE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 34"><unientity>8DEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 35"><unientity>8DEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 36"><unientity>8DF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 38"><unientity>8DE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 3A"><unientity>8DE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 3B"><unientity>8DE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 3D"><unientity>8DE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 3E"><unientity>8DF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 3F"><unientity>8E09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 41"><unientity>8DFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 44"><unientity>8DFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 46"><unientity>8E05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 49"><unientity>8E01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 4E"><unientity>8E04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 50"><unientity>8E06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 52"><unientity>8E2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 54"><unientity>8E23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 57"><unientity>8E2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 58"><unientity>8E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 5C"><unientity>8E1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 64"><unientity>8E16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 66"><unientity>8E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 67"><unientity>8E27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 68"><unientity>8E14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 69"><unientity>8E18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 6F"><unientity>8E41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 77"><unientity>8E40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 79"><unientity>8E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 39 7E"><unientity>8E3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 21"><unientity>8E30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 24"><unientity>8E47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 26"><unientity>8E46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 2E"><unientity>8E4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 30"><unientity>8E50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 32"><unientity>8E4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 34"><unientity>8E5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 35"><unientity>8E62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 36"><unientity>8E60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 3A"><unientity>8E54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 3B"><unientity>8E67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 3E"><unientity>8E5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 3F"><unientity>8E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 40"><unientity>8E55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 41"><unientity>8E61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 43"><unientity>8E5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 44"><unientity>8E75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 45"><unientity>8E74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 46"><unientity>8E95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 48"><unientity>8E6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 4B"><unientity>8E69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 52"><unientity>8E83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 53"><unientity>8E84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 57"><unientity>8E8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 5D"><unientity>8E94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 5E"><unientity>8E9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 5F"><unientity>8E92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 60"><unientity>8E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 62"><unientity>8E90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 63"><unientity>8E98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 64"><unientity>8E9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 6B"><unientity>8EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 6F"><unientity>8EA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 71"><unientity>8EA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 72"><unientity>8E99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 78"><unientity>8EB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 7A"><unientity>8EBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3A 7D"><unientity>8EB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 2E"><unientity>8EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 2F"><unientity>8ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 31"><unientity>8ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 33"><unientity>8ED5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 3F"><unientity>8EFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 42"><unientity>8EF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 4B"><unientity>8EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 4F"><unientity>8EEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 51"><unientity>8EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 56"><unientity>8F00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 59"><unientity>8F05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 5A"><unientity>8F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 5B"><unientity>8F07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 63"><unientity>8F27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 64"><unientity>8F2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 6B"><unientity>8F1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 6D"><unientity>8F25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 6E"><unientity>8F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 75"><unientity>8F17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 78"><unientity>8F36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 79"><unientity>8F2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 7A"><unientity>8F33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3B 7D"><unientity>8F2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 26"><unientity>8F39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 27"><unientity>8F34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 2D"><unientity>8F40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 30"><unientity>8F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 31"><unientity>8F4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 33"><unientity>8F47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 3D"><unientity>8F52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 48"><unientity>8F56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 49"><unientity>8F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 4B"><unientity>8F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 4C"><unientity>8F58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 4D"><unientity>8F5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 4E"><unientity>8F5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 53"><unientity>8F5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 57"><unientity>8F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 59"><unientity>8F63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 5A"><unientity>8F64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 65"><unientity>8FA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 66"><unientity>8FA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 6C"><unientity>8FB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 6D"><unientity>8FB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 6E"><unientity>8FBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 70"><unientity>8FBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 74"><unientity>8FBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 75"><unientity>8FD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 77"><unientity>8FCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 7A"><unientity>8FCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 7B"><unientity>8FD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3C 7D"><unientity>8FCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 21"><unientity>8FDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 22"><unientity>8FD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 2F"><unientity>8FE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 30"><unientity>8FEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 35"><unientity>8FF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 3C"><unientity>8FFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 3F"><unientity>9004</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 40"><unientity>9008</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 44"><unientity>9011</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 45"><unientity>900B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 48"><unientity>900C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 49"><unientity>9021</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 4A"><unientity>902D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 4E"><unientity>902C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 56"><unientity>9037</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 57"><unientity>9034</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 58"><unientity>902F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 59"><unientity>9036</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 5B"><unientity>9046</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 5D"><unientity>9052</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 67"><unientity>9049</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 6A"><unientity>9044</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 74"><unientity>9062</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 75"><unientity>905D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 78"><unientity>905B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3D 7B"><unientity>906B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 21"><unientity>9070</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 25"><unientity>906F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 26"><unientity>9079</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 28"><unientity>9076</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 2A"><unientity>907B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 2C"><unientity>9085</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 34"><unientity>9083</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 37"><unientity>9088</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 3A"><unientity>908B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 3F"><unientity>9099</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 40"><unientity>9097</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 43"><unientity>909B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 44"><unientity>909C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 48"><unientity>90A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 51"><unientity>90A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 54"><unientity>90A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 58"><unientity>90AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 59"><unientity>90B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 5B"><unientity>90B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 5D"><unientity>90B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 5F"><unientity>90AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 61"><unientity>90B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 68"><unientity>90C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 6A"><unientity>90BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 6F"><unientity>90D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 72"><unientity>90BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 75"><unientity>90C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 78"><unientity>90C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3E 79"><unientity>90C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 22"><unientity>90DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 23"><unientity>90DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 26"><unientity>90E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 27"><unientity>90D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 28"><unientity>90DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 2A"><unientity>90DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 2C"><unientity>90D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 2D"><unientity>90E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 2E"><unientity>90EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 2F"><unientity>90EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 32"><unientity>90F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 33"><unientity>90F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 34"><unientity>90F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 3E"><unientity>90EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 3F"><unientity>90F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 46"><unientity>90FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 47"><unientity>90FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 49"><unientity>9104</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 4A"><unientity>90FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 4C"><unientity>9106</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 4E"><unientity>9100</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 50"><unientity>9107</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 57"><unientity>910F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 58"><unientity>9111</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 5A"><unientity>9116</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 5C"><unientity>9114</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 60"><unientity>910B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 63"><unientity>9118</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 64"><unientity>911C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 66"><unientity>9120</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 67"><unientity>9122</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 6A"><unientity>911E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 71"><unientity>9124</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 72"><unientity>911A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 74"><unientity>9125</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 77"><unientity>912F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 3F 79"><unientity>912B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 21"><unientity>9132</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 24"><unientity>9126</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 2B"><unientity>9134</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 2C"><unientity>9136</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 31"><unientity>913A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 32"><unientity>913B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 3B"><unientity>9143</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 3E"><unientity>9146</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 3F"><unientity>9145</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 40"><unientity>9148</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 41"><unientity>9147</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 42"><unientity>9150</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 43"><unientity>914E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 48"><unientity>9159</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 49"><unientity>915C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 4D"><unientity>9156</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 50"><unientity>9158</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 52"><unientity>915A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 53"><unientity>9161</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 56"><unientity>9164</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 61"><unientity>916F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 62"><unientity>916E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 66"><unientity>917A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 68"><unientity>9172</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 69"><unientity>9179</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 6A"><unientity>9176</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 6B"><unientity>9174</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 6C"><unientity>9173</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 6D"><unientity>9185</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 6F"><unientity>9182</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 70"><unientity>918A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 71"><unientity>9186</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 72"><unientity>918C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 73"><unientity>9181</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 7B"><unientity>9191</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 7D"><unientity>9190</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 40 7E"><unientity>918E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 24"><unientity>918D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 25"><unientity>9193</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 2B"><unientity>919D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 2C"><unientity>919A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 30"><unientity>91A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 34"><unientity>E971</unientity><unientityalt>919B</unientityalt><desc>Variant of 4D4134 which maps to 919B</desc></character>
+<character hex="23 41 37"><unientity>91A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 3D"><unientity>91AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 41"><unientity>91AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 42"><unientity>91B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 47"><unientity>91AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 48"><unientity>91AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 4B"><unientity>91B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 4C"><unientity>91B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 4D"><unientity>91B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 56"><unientity>91BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 57"><unientity>91BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 5A"><unientity>91C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 5B"><unientity>91C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 5C"><unientity>91C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 61"><unientity>91D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 62"><unientity>91D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 63"><unientity>91D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 64"><unientity>91D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 68"><unientity>91E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 69"><unientity>91ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 6A"><unientity>91F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 6B"><unientity>91FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 6F"><unientity>91F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 71"><unientity>91E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 72"><unientity>91F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 73"><unientity>91EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 74"><unientity>91F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 77"><unientity>91F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 79"><unientity>91E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 41 7A"><unientity>91F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 21"><unientity>91F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 22"><unientity>91E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 23"><unientity>9204</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 25"><unientity>9201</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 26"><unientity>922B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 27"><unientity>920A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 28"><unientity>9225</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 2A"><unientity>9292</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 2C"><unientity>9228</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 2E"><unientity>9207</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 2F"><unientity>9203</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 31"><unientity>9200</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 32"><unientity>9218</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 33"><unientity>91FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 36"><unientity>9208</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 37"><unientity>9226</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 38"><unientity>921C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 3B"><unientity>9224</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 43"><unientity>9212</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 48"><unientity>91FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 4A"><unientity>9216</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 4B"><unientity>9211</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 4E"><unientity>9206</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 4F"><unientity>92A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 51"><unientity>9230</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 52"><unientity>9249</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 54"><unientity>924D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 55"><unientity>9248</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 58"><unientity>923A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 5C"><unientity>922E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 5F"><unientity>9233</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 61"><unientity>9266</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 64"><unientity>925E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 68"><unientity>9235</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 6B"><unientity>9250</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 6C"><unientity>926B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 6D"><unientity>9239</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 6F"><unientity>926D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 70"><unientity>926C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 71"><unientity>924F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 74"><unientity>923F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 77"><unientity>9260</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 42 7E"><unientity>9236</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 23"><unientity>924E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 26"><unientity>924C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 27"><unientity>9256</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 2B"><unientity>925A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 2E"><unientity>9241</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 2F"><unientity>9283</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 31"><unientity>92A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 33"><unientity>9282</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 35"><unientity>92A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 37"><unientity>927C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 38"><unientity>92A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 3E"><unientity>9276</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 3F"><unientity>928D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 40"><unientity>92EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 42"><unientity>9288</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 43"><unientity>927A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 45"><unientity>928E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 46"><unientity>92A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 47"><unientity>9277</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 49"><unientity>92AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 50"><unientity>92A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 54"><unientity>927E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 55"><unientity>929A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 58"><unientity>92AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 5B"><unientity>9291</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 5D"><unientity>929B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 62"><unientity>927F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 64"><unientity>92A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 66"><unientity>92C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 6A"><unientity>92C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 6F"><unientity>92D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 71"><unientity>92F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 72"><unientity>92DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 75"><unientity>92E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 76"><unientity>92B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 77"><unientity>92C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 79"><unientity>92BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 7A"><unientity>92D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 43 7E"><unientity>92D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 21"><unientity>92C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 25"><unientity>92F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 27"><unientity>92CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 2A"><unientity>92B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 2C"><unientity>92E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 2D"><unientity>92C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 2E"><unientity>92F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 2F"><unientity>92DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 30"><unientity>92DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 31"><unientity>92D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 33"><unientity>92E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 35"><unientity>92DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 39"><unientity>92D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 3A"><unientity>92CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 3C"><unientity>92C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 3E"><unientity>92CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 40"><unientity>92EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 41"><unientity>92E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 43"><unientity>92EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 45"><unientity>92F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 48"><unientity>92F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 4C"><unientity>9303</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 4D"><unientity>9307</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 4E"><unientity>931E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 4F"><unientity>9344</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 53"><unientity>931D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 54"><unientity>92FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 58"><unientity>931F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 5A"><unientity>9331</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 5B"><unientity>9306</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 5D"><unientity>92F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 5F"><unientity>930F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 62"><unientity>9302</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 64"><unientity>9324</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 66"><unientity>9312</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 69"><unientity>9338</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 6A"><unientity>9323</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 6C"><unientity>9321</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 71"><unientity>9340</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 72"><unientity>9301</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 74"><unientity>9315</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 76"><unientity>9329</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 78"><unientity>932E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 79"><unientity>932A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 7B"><unientity>933F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 7C"><unientity>933A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 44 7E"><unientity>9335</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 22"><unientity>9314</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 28"><unientity>92FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 2F"><unientity>9342</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 31"><unientity>9341</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 32"><unientity>9319</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 35"><unientity>934C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 41"><unientity>9379</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 44"><unientity>9386</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 47"><unientity>936A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 48"><unientity>935C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 4C"><unientity>934F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 4D"><unientity>9347</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 51"><unientity>937A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 53"><unientity>9356</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 54"><unientity>9371</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 56"><unientity>937C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 5C"><unientity>9377</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 5D"><unientity>9349</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 5E"><unientity>9358</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 5F"><unientity>935A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 60"><unientity>E9F0</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="23 45 62"><unientity>935F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 64"><unientity>9376</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 66"><unientity>9355</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 67"><unientity>9354</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 6A"><unientity>9348</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 6B"><unientity>9374</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 6E"><unientity>9351</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 6F"><unientity>9364</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 71"><unientity>936B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 72"><unientity>936D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 73"><unientity>9360</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 77"><unientity>936E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 79"><unientity>938F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 7A"><unientity>93AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 7B"><unientity>9395</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 45 7E"><unientity>938B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 21"><unientity>93B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 22"><unientity>938C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 23"><unientity>9388</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 25"><unientity>93B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 27"><unientity>93A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 28"><unientity>93B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 29"><unientity>93A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 2A"><unientity>93B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 2B"><unientity>939B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 2D"><unientity>9398</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 3C"><unientity>9389</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 3D"><unientity>93A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 40"><unientity>93BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 42"><unientity>93A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 44"><unientity>93BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 47"><unientity>93A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 48"><unientity>939A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 4A"><unientity>93AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 4D"><unientity>939E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 4F"><unientity>9397</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 51"><unientity>93BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 53"><unientity>93F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 56"><unientity>93DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 57"><unientity>93EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 5A"><unientity>93C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 5B"><unientity>93F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 5D"><unientity>93D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 5F"><unientity>93E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 62"><unientity>93F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 63"><unientity>93CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 64"><unientity>93C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 66"><unientity>93E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 67"><unientity>93E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 72"><unientity>93DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 73"><unientity>93D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 74"><unientity>93EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 75"><unientity>93DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 46 7C"><unientity>93CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 2C"><unientity>93D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 2F"><unientity>93A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 30"><unientity>93E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 32"><unientity>940B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 34"><unientity>9413</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 3B"><unientity>940F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 3C"><unientity>E9F1</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="23 47 3D"><unientity>93FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 49"><unientity>93FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 4D"><unientity>9419</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 4E"><unientity>940D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 50"><unientity>9426</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 51"><unientity>9427</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 55"><unientity>9409</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 58"><unientity>9414</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 59"><unientity>9404</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 5C"><unientity>9422</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 5D"><unientity>9406</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 60"><unientity>9410</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 62"><unientity>9423</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 67"><unientity>93F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 69"><unientity>93F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 6A"><unientity>9407</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 6F"><unientity>940E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 71"><unientity>9411</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 74"><unientity>943F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 79"><unientity>9429</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 47 7C"><unientity>943D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 27"><unientity>93F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 28"><unientity>9436</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 2B"><unientity>943B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 2D"><unientity>9424</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 30"><unientity>9437</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 32"><unientity>9440</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 35"><unientity>942B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 36"><unientity>942D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 37"><unientity>9441</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 38"><unientity>9431</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 3D"><unientity>9467</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 3E"><unientity>944C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 40"><unientity>9445</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 42"><unientity>9450</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 4A"><unientity>944A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 53"><unientity>9466</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 57"><unientity>9464</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 58"><unientity>9462</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 5C"><unientity>9465</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 5D"><unientity>9455</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 5E"><unientity>945E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 62"><unientity>946A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 68"><unientity>946B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 69"><unientity>946D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 6C"><unientity>946F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 6D"><unientity>9471</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 71"><unientity>9477</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 7B"><unientity>9482</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 48 7C"><unientity>9481</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 2E"><unientity>9585</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 30"><unientity>9588</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 31"><unientity>958C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 34"><unientity>9597</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 36"><unientity>958E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 38"><unientity>959F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 3A"><unientity>95A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 42"><unientity>95AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 44"><unientity>95AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 48"><unientity>95BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 49"><unientity>95BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 4A"><unientity>95CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 4D"><unientity>95B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 4E"><unientity>95BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 4F"><unientity>95B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 50"><unientity>95BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 52"><unientity>95BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 59"><unientity>95C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 5D"><unientity>95CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 60"><unientity>95D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 62"><unientity>95D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 63"><unientity>95D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 64"><unientity>95D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 65"><unientity>95C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 66"><unientity>95DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 69"><unientity>95DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 6A"><unientity>95E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 6F"><unientity>95E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 72"><unientity>95E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 76"><unientity>95E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 7A"><unientity>961E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 7B"><unientity>9624</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 49 7C"><unientity>9622</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 21"><unientity>9627</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 2F"><unientity>9642</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 30"><unientity>963D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 32"><unientity>963C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 3C"><unientity>9651</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 42"><unientity>9660</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 44"><unientity>965C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 46"><unientity>9658</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 4A"><unientity>965F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 4B"><unientity>9656</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 51"><unientity>966C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 5D"><unientity>967B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 5E"><unientity>967F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 62"><unientity>967E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 63"><unientity>9684</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 65"><unientity>9688</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 6C"><unientity>9689</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 6D"><unientity>9682</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 6E"><unientity>9683</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 79"><unientity>9696</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4A 7A"><unientity>9697</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 2F"><unientity>96A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 35"><unientity>96A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 37"><unientity>96AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 3B"><unientity>96B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 3C"><unientity>96B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 3E"><unientity>96B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 48"><unientity>96B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 49"><unientity>96BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 52"><unientity>96CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 53"><unientity>96CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 57"><unientity>96D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 64"><unientity>96DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 66"><unientity>96D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 67"><unientity>96DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 71"><unientity>96E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 74"><unientity>96F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 76"><unientity>96F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 77"><unientity>96F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 78"><unientity>96FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4B 7A"><unientity>96F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 22"><unientity>96FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 27"><unientity>9702</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 29"><unientity>9708</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 2A"><unientity>9705</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 38"><unientity>971B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 3D"><unientity>971D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 3E"><unientity>9719</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 47"><unientity>9723</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 49"><unientity>9722</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 4A"><unientity>9724</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 4E"><unientity>9728</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 50"><unientity>9726</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 52"><unientity>9731</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 58"><unientity>9730</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 5C"><unientity>9736</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 6A"><unientity>9741</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 6B"><unientity>9747</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 6C"><unientity>9746</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 6E"><unientity>9749</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 75"><unientity>9758</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 76"><unientity>975A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 78"><unientity>975D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 7B"><unientity>975F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4C 7D"><unientity>9764</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 25"><unientity>9767</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 2C"><unientity>976B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 30"><unientity>976E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 31"><unientity>9777</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 32"><unientity>9778</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 35"><unientity>9773</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 37"><unientity>9783</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 38"><unientity>977A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 3A"><unientity>9780</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 3C"><unientity>9781</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 40"><unientity>9784</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 43"><unientity>977F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 49"><unientity>9789</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 54"><unientity>9794</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 59"><unientity>979B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 5A"><unientity>979F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 5C"><unientity>979A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 62"><unientity>979C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 6A"><unientity>97AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 70"><unientity>97AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 71"><unientity>97A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 74"><unientity>97AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 78"><unientity>97A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 7A"><unientity>97B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4D 7C"><unientity>97B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 24"><unientity>97B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 26"><unientity>97B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 29"><unientity>97B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 2D"><unientity>97B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 35"><unientity>97BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 38"><unientity>97C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 3B"><unientity>97C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 43"><unientity>97C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 4B"><unientity>97CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 4C"><unientity>97CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 4E"><unientity>97D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 51"><unientity>97D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 53"><unientity>97D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 54"><unientity>97D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 59"><unientity>97DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 5C"><unientity>97DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 5E"><unientity>97E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 60"><unientity>97E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 6C"><unientity>97F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 73"><unientity>97FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 79"><unientity>9807</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 7B"><unientity>980F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4E 7E"><unientity>980D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 23"><unientity>980E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 26"><unientity>9816</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 2C"><unientity>9826</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 2D"><unientity>981E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 34"><unientity>982B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 37"><unientity>9820</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 38"><unientity>981F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 3D"><unientity>9833</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 40"><unientity>982E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 44"><unientity>982F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 45"><unientity>9832</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 4B"><unientity>9847</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 4E"><unientity>9844</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 60"><unientity>9852</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 62"><unientity>984B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 66"><unientity>983F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 6A"><unientity>985C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 6B"><unientity>9859</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 6F"><unientity>9857</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 72"><unientity>9856</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 77"><unientity>9862</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 4F 7E"><unientity>9868</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 21"><unientity>9865</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 22"><unientity>9866</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 29"><unientity>986C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 30"><unientity>9873</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 31"><unientity>9874</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 39"><unientity>98AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 40"><unientity>98B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 48"><unientity>98B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 4A"><unientity>98BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 4D"><unientity>98BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 4E"><unientity>98C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 53"><unientity>98C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 5F"><unientity>98E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 60"><unientity>98E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 61"><unientity>98E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 63"><unientity>98E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 68"><unientity>98F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 50 6C"><unientity>98EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 24"><unientity>9907</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 28"><unientity>9902</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 2F"><unientity>9916</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 30"><unientity>9914</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 31"><unientity>9917</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 32"><unientity>9911</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 38"><unientity>9915</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 3A"><unientity>9924</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 3B"><unientity>991F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 40"><unientity>991C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 43"><unientity>9929</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 45"><unientity>9927</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 47"><unientity>991A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 4F"><unientity>992E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 50"><unientity>992C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 51"><unientity>992A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 53"><unientity>9933</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 54"><unientity>E972</unientity><unientityalt>9942</unientityalt><desc>Variant of 4D5154 which maps to 9942</desc></character>
+<character hex="23 51 55"><unientity>9932</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 56"><unientity>992B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 58"><unientity>9931</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 5C"><unientity>993B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 60"><unientity>993A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 61"><unientity>9941</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 64"><unientity>9940</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 66"><unientity>993C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 6A"><unientity>9948</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 6C"><unientity>9947</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 6D"><unientity>9949</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 70"><unientity>9943</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 71"><unientity>994D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 72"><unientity>994C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 73"><unientity>994E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 74"><unientity>9950</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 7A"><unientity>9958</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 7B"><unientity>9954</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 51 7E"><unientity>9955</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 22"><unientity>E973</unientity><unientityalt>9957</unientityalt><desc>Variant of 475222 which maps to 9957</desc></character>
+<character hex="23 52 29"><unientity>995D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 2B"><unientity>995F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 2F"><unientity>9997</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 30"><unientity>9998</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 3B"><unientity>99A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 3C"><unientity>99A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 3E"><unientity>99A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 41"><unientity>99A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 42"><unientity>99AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 49"><unientity>99B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 4D"><unientity>99BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 4E"><unientity>99BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 4F"><unientity>99C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 53"><unientity>99B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 54"><unientity>99BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 61"><unientity>99D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 63"><unientity>99D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 65"><unientity>99C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 69"><unientity>99D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 74"><unientity>99EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 7A"><unientity>99F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 7B"><unientity>99E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 52 7C"><unientity>99EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 24"><unientity>9A02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 29"><unientity>99F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 2A"><unientity>99F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 30"><unientity>99FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 31"><unientity>99FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 3D"><unientity>9A0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 3E"><unientity>9A0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 3F"><unientity>9A09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 44"><unientity>9A04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 45"><unientity>9A11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 47"><unientity>9A05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 48"><unientity>9A10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 4C"><unientity>9A24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 4D"><unientity>9A22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 4F"><unientity>9A20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 52"><unientity>9A27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 59"><unientity>9A2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 5A"><unientity>9A38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 60"><unientity>9A2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 61"><unientity>9A35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 64"><unientity>9A32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 69"><unientity>9A36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 6A"><unientity>9A2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 70"><unientity>9A41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 74"><unientity>9A3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 79"><unientity>9A42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 7A"><unientity>9A44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 7D"><unientity>9A48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 53 7E"><unientity>9A4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 22"><unientity>9A4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 24"><unientity>9A52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 27"><unientity>9A4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 2A"><unientity>9A58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 2C"><unientity>9A56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 33"><unientity>9A64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 34"><unientity>9A66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 3A"><unientity>9A6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 3F"><unientity>9AAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 41"><unientity>9AAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 43"><unientity>9AB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 45"><unientity>9AB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 49"><unientity>9AB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 4C"><unientity>9ABB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 50"><unientity>9ABA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 54"><unientity>9ABD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 57"><unientity>9AC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 59"><unientity>9AC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 5A"><unientity>9AC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 5D"><unientity>9AC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 66"><unientity>9AD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 6A"><unientity>9AD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 6D"><unientity>9AD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 72"><unientity>9ADC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 74"><unientity>9ADF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 76"><unientity>9AE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 54 77"><unientity>9AE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 21"><unientity>9AE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 27"><unientity>9AEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 28"><unientity>9AF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 2A"><unientity>9AEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 32"><unientity>9AF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 35"><unientity>9AFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 36"><unientity>9B01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 38"><unientity>9B02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 3B"><unientity>9B00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 3C"><unientity>9B08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 3E"><unientity>9B04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 41"><unientity>9B05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 43"><unientity>9B0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 47"><unientity>9B0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 4E"><unientity>9B11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 4F"><unientity>9B10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 54"><unientity>9B18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 56"><unientity>9B1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 5E"><unientity>9B1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 66"><unientity>9B23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 6C"><unientity>9B29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 73"><unientity>9B2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 74"><unientity>E9F2</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="23 55 76"><unientity>9B2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 55 7D"><unientity>9B34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 22"><unientity>9B35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 23"><unientity>9B37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 36"><unientity>9B43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 3A"><unientity>9B48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 3C"><unientity>9B4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 3E"><unientity>9B4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 41"><unientity>9B4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 47"><unientity>9B51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 5D"><unientity>9B74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 63"><unientity>9B68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 72"><unientity>9B80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 73"><unientity>9B8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 7A"><unientity>9B95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 56 7B"><unientity>9B7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 21"><unientity>9B83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 29"><unientity>9B8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 2B"><unientity>9B90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 2E"><unientity>9B93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 2F"><unientity>9B97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 31"><unientity>9B92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 32"><unientity>9B98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 36"><unientity>9B9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 39"><unientity>9B9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 3C"><unientity>9BAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 3D"><unientity>9B9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 3F"><unientity>9BA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 42"><unientity>9B9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 43"><unientity>9B99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 49"><unientity>9B86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 4E"><unientity>9BA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 56"><unientity>9BC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 59"><unientity>9BD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 5D"><unientity>9BC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 5E"><unientity>9BBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 5F"><unientity>9BC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 66"><unientity>9BB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 6B"><unientity>9BBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 6C"><unientity>9BD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 6E"><unientity>9BC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 72"><unientity>9BC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 77"><unientity>9BD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 7A"><unientity>9BD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 57 7C"><unientity>9BEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 23"><unientity>9BD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 27"><unientity>9BE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 2B"><unientity>9BF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 2C"><unientity>9BE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 2D"><unientity>9BDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 2F"><unientity>9BE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 31"><unientity>9BF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 34"><unientity>9BD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 3E"><unientity>9BFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 43"><unientity>9C06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 44"><unientity>9C15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 49"><unientity>9C0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 4B"><unientity>9C08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 4C"><unientity>9C14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 4D"><unientity>9C04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 52"><unientity>9C02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 54"><unientity>9C10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 59"><unientity>9C12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 5C"><unientity>9C09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 66"><unientity>9C1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 69"><unientity>9C2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 6E"><unientity>9C23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 70"><unientity>9C2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 71"><unientity>9C28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 78"><unientity>9C21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 79"><unientity>9C24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 58 7E"><unientity>9C46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 25"><unientity>9C32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 26"><unientity>9C44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 28"><unientity>9C48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 29"><unientity>9C39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 2A"><unientity>9C33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 30"><unientity>9C47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 32"><unientity>9C35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 34"><unientity>9C37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 38"><unientity>9C52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 3B"><unientity>9C58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 45"><unientity>9C51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 49"><unientity>9C63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 4F"><unientity>9C67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 55"><unientity>9C5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 56"><unientity>9C60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 58"><unientity>9C6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 5B"><unientity>9C68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 5C"><unientity>9C6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 5E"><unientity>9C6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 6B"><unientity>9C7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 73"><unientity>9CE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 74"><unientity>9CF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 59 77"><unientity>9CF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 21"><unientity>9D02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 22"><unientity>9D03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 23"><unientity>9CF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 24"><unientity>9D04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 28"><unientity>9D07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 2C"><unientity>9CF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 2F"><unientity>9D2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 30"><unientity>9D25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 3F"><unientity>9D1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 44"><unientity>9D1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 48"><unientity>9D1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 4F"><unientity>9D41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 53"><unientity>9D36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 63"><unientity>9D3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 65"><unientity>9D30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 68"><unientity>9D42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 69"><unientity>9D40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 6B"><unientity>9D3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 70"><unientity>9D5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 75"><unientity>9D53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5A 7B"><unientity>9D59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 26"><unientity>9D5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 2A"><unientity>9D52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 2C"><unientity>9D77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 2E"><unientity>9D8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 2F"><unientity>9D7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 35"><unientity>9D87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 3F"><unientity>9D78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 42"><unientity>9D7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 47"><unientity>9D69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 4D"><unientity>9D7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 4F"><unientity>9D83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 52"><unientity>9D6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 59"><unientity>9DA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 5E"><unientity>9D92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 60"><unientity>9D98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 66"><unientity>9DA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 67"><unientity>9DAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 6A"><unientity>9DA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 6B"><unientity>9D9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 70"><unientity>9D96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 74"><unientity>9DB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 76"><unientity>9DB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 77"><unientity>9DBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 79"><unientity>9DC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 7A"><unientity>9DC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 7B"><unientity>9DB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 7C"><unientity>9DBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5B 7E"><unientity>9DCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 22"><unientity>9DC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 27"><unientity>9DC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 28"><unientity>9DBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 32"><unientity>9DB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 34"><unientity>9DAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 36"><unientity>9DB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 3A"><unientity>9DDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 3E"><unientity>9DD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 45"><unientity>9DD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 46"><unientity>9DDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 4F"><unientity>9DE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 57"><unientity>9DF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 5B"><unientity>9DF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 5C"><unientity>9DFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 5F"><unientity>9DEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 65"><unientity>9DEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 6A"><unientity>9DED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 6C"><unientity>9DE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 6D"><unientity>9DEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 71"><unientity>9E07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5C 7E"><unientity>9DFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 27"><unientity>9E0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 2B"><unientity>9E11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 36"><unientity>9E15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 37"><unientity>9E18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 39"><unientity>9E1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 3A"><unientity>9E1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 3B"><unientity>9E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 3C"><unientity>9E75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 42"><unientity>9E7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 43"><unientity>9E7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 47"><unientity>9E80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 48"><unientity>9E83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 49"><unientity>9E84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 4B"><unientity>9E88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 4F"><unientity>9E87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 55"><unientity>9E90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 58"><unientity>9E8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 5A"><unientity>9E95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 5C"><unientity>9E91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 5D"><unientity>9E9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 66"><unientity>9E9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 77"><unientity>9EAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 79"><unientity>9EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5D 7A"><unientity>9EB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 30"><unientity>9EC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 35"><unientity>9EC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 37"><unientity>9EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 42"><unientity>9ECC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 4A"><unientity>9ED0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 4C"><unientity>9ED3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 53"><unientity>9EDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 55"><unientity>9EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 57"><unientity>9EE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 59"><unientity>9EE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 5C"><unientity>9EE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 60"><unientity>9EEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 66"><unientity>9EF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 6F"><unientity>9EF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 74"><unientity>9EF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 76"><unientity>9EFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 77"><unientity>9EFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 7A"><unientity>9EFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 7B"><unientity>E9F3</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="23 5E 7C"><unientity>9EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5E 7D"><unientity>9F02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 2F"><unientity>9F0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 31"><unientity>9F10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 32"><unientity>9F12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 33"><unientity>9F16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 34"><unientity>9F17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 37"><unientity>9F1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 45"><unientity>9F22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 48"><unientity>9F2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 49"><unientity>9F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 53"><unientity>9F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 5E"><unientity>9F39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 5F"><unientity>9F37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 64"><unientity>9F3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 69"><unientity>9F41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 6D"><unientity>9F45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 6F"><unientity>9F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 71"><unientity>9F48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 73"><unientity>9F49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 79"><unientity>9F4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 7B"><unientity>9F4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 7C"><unientity>9F54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 5F 7E"><unientity>9F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 23"><unientity>9F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 28"><unientity>9F60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 3F"><unientity>9F6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 40"><unientity>9F6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 47"><unientity>9F76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 5B"><unientity>9F8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 61"><unientity>9F93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 62"><unientity>9F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 6B"><unientity>9FA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 71"><unientity>9FA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="23 60 72"><unientity>9FA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 30 32"><unientity>5E76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 30 4C"><unientity>5E72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 30 4D"><unientity>4E71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 30 58"><unientity>4E9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 38"><unientity>5E03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 3C"><unientity>5360</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 4C"><unientity>6765</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 4F"><unientity>4ED1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 5D"><unientity>4FA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 69"><unientity>E901</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 31 6C"><unientity>4ED3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 73"><unientity>4EEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 31 79"><unientity>4FE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 24"><unientity>4E2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 26"><unientity>4F25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 2D"><unientity>4F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 2E"><unientity>E902</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 32 33"><unientity>4F1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 35"><unientity>4FA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 38"><unientity>4FA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 3E"><unientity>5BB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 40"><unientity>5907</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 41"><unientity>6770</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 43"><unientity>4F27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 44"><unientity>4F1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 46"><unientity>4F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 47"><unientity>503A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 49"><unientity>4EC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 4A"><unientity>503E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 4C"><unientity>4F24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 51"><unientity>4FA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 55"><unientity>4EC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 56"><unientity>4F2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 57"><unientity>8C61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 58"><unientity>4FA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 59"><unientity>4EEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 5A"><unientity>4EBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 5D"><unientity>4EF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 5E"><unientity>4FAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 60"><unientity>4FA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 61"><unientity>4FED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 62"><unientity>50A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 63"><unientity>E903</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 32 65"><unientity>4FE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 66"><unientity>4F18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 67"><unientity>507F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 69"><unientity>50A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 6A"><unientity>4FEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 6B"><unientity>4FE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 73"><unientity>51F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 7A"><unientity>513F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 32 7B"><unientity>5156</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 23"><unientity>4E24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 40"><unientity>51BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 48"><unientity>51EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 6B"><unientity>514B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 6D"><unientity>5219</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 70"><unientity>521A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 76"><unientity>5240</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 78"><unientity>521B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 7C"><unientity>5212</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 33 7E"><unientity>5267</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 21"><unientity>5251</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 22"><unientity>5218</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 23"><unientity>5242</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 2F"><unientity>52B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 33"><unientity>52A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 34"><unientity>52A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 35"><unientity>52B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 36"><unientity>52CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 37"><unientity>80DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 38"><unientity>52BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 3C"><unientity>52B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 3D"><unientity>529D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 51"><unientity>6C47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 52"><unientity>532E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 55"><unientity>533A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 5F"><unientity>5346</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 60"><unientity>534F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 7A"><unientity>538C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 7B"><unientity>5389</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 34 7D"><unientity>53C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 35 2B"><unientity>4E1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 3E"><unientity>5458</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 48"><unientity>95EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 49"><unientity>54D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 63"><unientity>4E27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 68"><unientity>5355</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 6D"><unientity>5524</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 6F"><unientity>4E54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 71"><unientity>54DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 78"><unientity>556C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 36 7A"><unientity>5417</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 21"><unientity>545C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 22"><unientity>545B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 27"><unientity>5567</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 2C"><unientity>53F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 2E"><unientity>5455</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 30"><unientity>5C1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 31"><unientity>55BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 32"><unientity>5520</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 33"><unientity>5578</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 3D"><unientity>5480</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 40"><unientity>53FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 44"><unientity>5428</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 45"><unientity>55B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 46"><unientity>E904</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 37 47"><unientity>54DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 4B"><unientity>55F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 4E"><unientity>549B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 51"><unientity>5413</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 54"><unientity>565C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 55"><unientity>5411</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 56"><unientity>5499</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 5A"><unientity>4E25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 5B"><unientity>5624</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 5C"><unientity>556D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 5D"><unientity>55EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 5E"><unientity>56A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 61"><unientity>E905</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 37 62"><unientity>5453</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 64"><unientity>5631</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 6F"><unientity>56EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 70"><unientity>56F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 71"><unientity>56ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 72"><unientity>5706</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 73"><unientity>56E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 37 74"><unientity>56FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 3B"><unientity>6267</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 3E"><unientity>57A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 44"><unientity>62A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 45"><unientity>5C27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 4A"><unientity>573A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 4D"><unientity>6D82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 55"><unientity>575E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 56"><unientity>5757</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 59"><unientity>5C18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 5A"><unientity>57AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 5B"><unientity>5811</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 60"><unientity>575F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 61"><unientity>5760</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 62"><unientity>5815</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 64"><unientity>575B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 67"><unientity>57A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 69"><unientity>538B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 6B"><unientity>5739</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 6C"><unientity>5792</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 6D"><unientity>5784</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 6E"><unientity>574F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 6F"><unientity>575C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 71"><unientity>575D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 74"><unientity>58EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 76"><unientity>58F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 38 77"><unientity>5BFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 23"><unientity>4F19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 24"><unientity>68A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 2E"><unientity>5939</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 3F"><unientity>5941</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 40"><unientity>593A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 41"><unientity>594B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 39 53"><unientity>5986</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 27"><unientity>5987</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 28"><unientity>5A04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 36"><unientity>5988</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 3B"><unientity>59AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 41"><unientity>5A34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 43"><unientity>5A75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 44"><unientity>5A07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 45"><unientity>59A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 48"><unientity>5AD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 4A"><unientity>5A74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 4B"><unientity>5A76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 5B"><unientity>5B59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 5F"><unientity>5B5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 60"><unientity>5B66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3A 63"><unientity>5B6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 2E"><unientity>5BDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 31"><unientity>5B9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 32"><unientity>5B81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 35"><unientity>5BBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 36"><unientity>5BA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 37"><unientity>5199</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 38"><unientity>5BA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 39"><unientity>5B9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 3F"><unientity>4E13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 40"><unientity>5C06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 42"><unientity>5BFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 43"><unientity>5BF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 44"><unientity>5BFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 4C"><unientity>5C34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 60"><unientity>5C61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 61"><unientity>5C42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 63"><unientity>5C5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 6E"><unientity>5188</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 74"><unientity>5CE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3B 79"><unientity>5C9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 28"><unientity>5C9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 2A"><unientity>5D2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 2B"><unientity>5C96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 2D"><unientity>5C7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 2E"><unientity>5CB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 31"><unientity>5CE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 32"><unientity>5DC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 33"><unientity>5CA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 4F"><unientity>5E05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 51"><unientity>5E08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 52"><unientity>5E10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 53"><unientity>5E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 58"><unientity>5E27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 5C"><unientity>5E3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 5E"><unientity>5E01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 60"><unientity>5E1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 61"><unientity>5E2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 6B"><unientity>51E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 76"><unientity>5E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 77"><unientity>5750</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3C 7E"><unientity>5395</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 27"><unientity>5E9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2A"><unientity>5E7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2B"><unientity>5E99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2C"><unientity>5382</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2D"><unientity>5E9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2E"><unientity>5E90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 2F"><unientity>5385</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 47"><unientity>5F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 4B"><unientity>5F39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 4C"><unientity>5F25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 4D"><unientity>5F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 4F"><unientity>E906</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 3D 65"><unientity>540E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 67"><unientity>5F84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 6C"><unientity>4ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 6F"><unientity>590D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 74"><unientity>5F7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3D 76"><unientity>5F81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 57"><unientity>5FF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 5C"><unientity>95F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 5E"><unientity>6005</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 61"><unientity>6076</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 6C"><unientity>60EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 70"><unientity>607B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 77"><unientity>7231</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3E 7E"><unientity>607C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 28"><unientity>6001</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 29"><unientity>5FFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 2B"><unientity>6006</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 2E"><unientity>5E86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 31"><unientity>60ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 33"><unientity>5FE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 36"><unientity>8651</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 38"><unientity>60E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 39"><unientity>60EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 3A"><unientity>6078</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 3B"><unientity>6002</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 3C"><unientity>6B32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 3E"><unientity>5BAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 3F"><unientity>51ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 41"><unientity>60AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 42"><unientity>6124</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 44"><unientity>60EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 45"><unientity>6187</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 47"><unientity>60EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 48"><unientity>5FC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 4A"><unientity>5E94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 4B"><unientity>601C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 4E"><unientity>6073</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 54"><unientity>6000</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 55"><unientity>61D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 56"><unientity>60AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 58"><unientity>5FCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 59"><unientity>6151</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 5B"><unientity>60E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 5C"><unientity>604B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 6E"><unientity>6218</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 3F 6F"><unientity>620F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 40 6C"><unientity>631F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 40 7B"><unientity>5377</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 40 7D"><unientity>626B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 40 7E"><unientity>626A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 23"><unientity>6302</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 36"><unientity>62A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 3C"><unientity>62E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 3F"><unientity>626C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 42"><unientity>6325</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 4F"><unientity>635F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 53"><unientity>6363</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 55"><unientity>62A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 5A"><unientity>5C4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 5B"><unientity>631A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 5F"><unientity>6402</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 60"><unientity>63B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 65"><unientity>635E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 66"><unientity>62E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 68"><unientity>6320</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 6E"><unientity>6251</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 71"><unientity>629A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 74"><unientity>62E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 76"><unientity>51FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 77"><unientity>631E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 7A"><unientity>6321</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 7C"><unientity>636E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 7D"><unientity>63B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 41 7E"><unientity>62E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 22"><unientity>62C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 24"><unientity>6361</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 25"><unientity>6324</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 26"><unientity>62E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 28"><unientity>62DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 29"><unientity>6401</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 2A"><unientity>6269</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 2B"><unientity>63B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 2C"><unientity>64B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 2E"><unientity>6270</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 2F"><unientity>64DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 30"><unientity>6446</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 31"><unientity>62E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 33"><unientity>62E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 34"><unientity>6400</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 35"><unientity>6444</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 37"><unientity>631B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 38"><unientity>644A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 3A"><unientity>6405</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 3B"><unientity>63FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 47"><unientity>8D25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 4F"><unientity>542F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 52"><unientity>654C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 54"><unientity>6570</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 56"><unientity>655B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 57"><unientity>6BD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 63"><unientity>65A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 42 66"><unientity>65AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 2D"><unientity>65F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 32"><unientity>663C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 40"><unientity>6656</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 41"><unientity>6655</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 43"><unientity>7545</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 44"><unientity>6682</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 48"><unientity>6653</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 49"><unientity>E907</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 43 4B"><unientity>66A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 4D"><unientity>65F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 55"><unientity>4E66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 5A"><unientity>4F1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 43 66"><unientity>80E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 26"><unientity>4E1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 63"><unientity>6761</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 68"><unientity>67AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 69"><unientity>6800</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 6D"><unientity>5F03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 6E"><unientity>6816</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 71"><unientity>680B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 76"><unientity>6808</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 7A"><unientity>67A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 44 7C"><unientity>832D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 26"><unientity>6781</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 2A"><unientity>6768</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 2B"><unientity>6862</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 2D"><unientity>4E1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 2F"><unientity>67AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 37"><unientity>8363</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 39"><unientity>6784</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 40"><unientity>67AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 44"><unientity>6837</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 46"><unientity>6869</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 47"><unientity>6807</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 49"><unientity>67A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 4A"><unientity>697C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 4C"><unientity>6868</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 4E"><unientity>4E50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 4F"><unientity>679E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 53"><unientity>692D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 55"><unientity>6811</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 57"><unientity>6866</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 58"><unientity>6734</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 5B"><unientity>6865</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 5D"><unientity>673A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 5F"><unientity>6863</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 61"><unientity>68C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 62"><unientity>6867</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 63"><unientity>67E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 64"><unientity>69DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 65"><unientity>67DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 66"><unientity>69DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6A"><unientity>6988</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6B"><unientity>691F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6C"><unientity>6809</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6D"><unientity>6A79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6E"><unientity>680F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 6F"><unientity>6A31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 70"><unientity>6743</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 71"><unientity>6984</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 78"><unientity>94A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 7A"><unientity>E908</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 45 7C"><unientity>6B27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 45 7E"><unientity>6B24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 21"><unientity>6B22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 29"><unientity>5C81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 2A"><unientity>5386</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 2B"><unientity>5F52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 33"><unientity>6B8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 35"><unientity>6B87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 36"><unientity>6B93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 37"><unientity>6BA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 38"><unientity>6B7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 3B"><unientity>6740</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 3C"><unientity>58F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 40"><unientity>6BB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 55"><unientity>6C14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 46 58"><unientity>6C22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 4E"><unientity>6CFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 59"><unientity>6CEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 68"><unientity>6D45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 74"><unientity>6E0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 77"><unientity>6CA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 47 7D"><unientity>6D8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 2D"><unientity>6C64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 30"><unientity>6D4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 31"><unientity>6DA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 33"><unientity>6D51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 3D"><unientity>6C9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 41"><unientity>6C85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 42"><unientity>706D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 44"><unientity>6E7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 48"><unientity>6CA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 4B"><unientity>51C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 4F"><unientity>6CAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 54"><unientity>6E0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 55"><unientity>6DA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 57"><unientity>6C49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 58"><unientity>6EE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 59"><unientity>6D9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 5A"><unientity>6E10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 5F"><unientity>6EDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 63"><unientity>6D46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 64"><unientity>6E17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 65"><unientity>6E14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 6C"><unientity>6CFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 6D"><unientity>6DA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 6E"><unientity>6DA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 6F"><unientity>6D01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 71"><unientity>6D47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 78"><unientity>6E83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 7B"><unientity>6DC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 48 7C"><unientity>6D53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 21"><unientity>6CFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 22"><unientity>6D4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 26"><unientity>6D4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 27"><unientity>6CDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 28"><unientity>6EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 2B"><unientity>6EE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 2D"><unientity>6D9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 2E"><unientity>6DA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 31"><unientity>6C88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 32"><unientity>6CFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 33"><unientity>6E0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 34"><unientity>6E85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 36"><unientity>6EE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 37"><unientity>6D4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 3A"><unientity>6FD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 3B"><unientity>6CA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 3C"><unientity>6FD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 3D"><unientity>6F47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 3F"><unientity>6F9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 41"><unientity>6D12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 42"><unientity>6EE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 43"><unientity>6E7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 44"><unientity>6EE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 4A"><unientity>707E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 51"><unientity>4E3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 5D"><unientity>4E4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 66"><unientity>65E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 6A"><unientity>70BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 6D"><unientity>70E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 6F"><unientity>7080</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 75"><unientity>6247</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 7D"><unientity>70ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 49 7E"><unientity>70EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 21"><unientity>70BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 22"><unientity>7096</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 24"><unientity>706F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 25"><unientity>7116</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 26"><unientity>70E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 2E"><unientity>8425</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 30"><unientity>70DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 31"><unientity>707F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 33"><unientity>70E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 36"><unientity>70C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 37"><unientity>7089</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 38"><unientity>70C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 42"><unientity>7237</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 45"><unientity>5C14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 46"><unientity>5899</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 4C"><unientity>724D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 53"><unientity>5B83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 5A"><unientity>7275</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 5E"><unientity>8366</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 61"><unientity>728A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 62"><unientity>727A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 68"><unientity>72B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 70"><unientity>72ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 72"><unientity>72C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 79"><unientity>72B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4A 7E"><unientity>72F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 22"><unientity>72EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 23"><unientity>72EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 27"><unientity>72EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 28"><unientity>72DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 29"><unientity>83B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2A"><unientity>72B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2B"><unientity>517D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2C"><unientity>730E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2D"><unientity>736D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2E"><unientity>732E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 2F"><unientity>7321</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 47"><unientity>73B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 57"><unientity>73F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 5E"><unientity>739B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 5F"><unientity>7410</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 64"><unientity>7391</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 67"><unientity>73AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 68"><unientity>7477</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 69"><unientity>73BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 6B"><unientity>73D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 74"><unientity>74EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4B 7A"><unientity>4EA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 2D"><unientity>4EA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 31"><unientity>7544</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 33"><unientity>6BD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 34"><unientity>5F02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 36"><unientity>753B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 39"><unientity>5F53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 3B"><unientity>7574</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 3C"><unientity>8FED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 56"><unientity>75C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 60"><unientity>75A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 61"><unientity>759F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 62"><unientity>75EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 63"><unientity>75AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 6A"><unientity>75AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 6D"><unientity>75E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 6E"><unientity>7597</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 71"><unientity>75A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 73"><unientity>75D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 75"><unientity>765E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 76"><unientity>763E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 77"><unientity>7663</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 78"><unientity>762B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 79"><unientity>766B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4C 7B"><unientity>53D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 29"><unientity>7691</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 2D"><unientity>76B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 3A"><unientity>76CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 3C"><unientity>5C3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 3D"><unientity>76D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 3E"><unientity>76D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 3F"><unientity>5362</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 56"><unientity>4F17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 57"><unientity>56F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 5D"><unientity>7750</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 73"><unientity>4E86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4D 7C"><unientity>77A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 27"><unientity>77EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 3B"><unientity>781A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 3E"><unientity>7815</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 45"><unientity>7855</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 49"><unientity>786E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 4C"><unientity>7801</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 53"><unientity>7816</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 58"><unientity>77F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 59"><unientity>7840</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 5A"><unientity>788D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 5B"><unientity>77FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 5C"><unientity>77FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 5D"><unientity>783A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 5E"><unientity>783E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 6F"><unientity>E909</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 4E 77"><unientity>7978</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 78"><unientity>796F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 7B"><unientity>7985</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 7C"><unientity>793C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4E 7D"><unientity>7977</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 22"><unientity>4E07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 25"><unientity>53B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 36"><unientity>5E0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 3C"><unientity>79F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 3D"><unientity>79CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 40"><unientity>8C37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 44"><unientity>79EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 46"><unientity>7A23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 49"><unientity>7A51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 4A"><unientity>79FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 4B"><unientity>E90A</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 4F 4C"><unientity>7A33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 5C"><unientity>6D3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 5D"><unientity>7A9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 5F"><unientity>7A77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 60"><unientity>7AA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 61"><unientity>7A8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 62"><unientity>7A9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 63"><unientity>7AA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 64"><unientity>7A83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 6B"><unientity>7ADE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 4F 70"><unientity>E90B</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 4F 79"><unientity>7B14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 21"><unientity>7B0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 23"><unientity>8345</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 2A"><unientity>94B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 2B"><unientity>7B3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 30"><unientity>8303</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 33"><unientity>8282</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 38"><unientity>7BAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 39"><unientity>7B03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 3A"><unientity>7B51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 3C"><unientity>7B5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 3E"><unientity>7BD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 41"><unientity>7B80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 42"><unientity>7BAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 45"><unientity>7BAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 46"><unientity>7BD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 48"><unientity>5E18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 4B"><unientity>7B7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 4C"><unientity>7BEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 4D"><unientity>7B79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 50"><unientity>7B3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 51"><unientity>7C41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 52"><unientity>E90C</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 50 53"><unientity>7BF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 54"><unientity>7BA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 55"><unientity>5401</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 60"><unientity>7C8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 62"><unientity>E90D</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 50 68"><unientity>7CAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 6B"><unientity>7CAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 6F"><unientity>7EA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 70"><unientity>7EAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 71"><unientity>7EA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 72"><unientity>7EA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 73"><unientity>7EAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 74"><unientity>7EA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 75"><unientity>7EA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 76"><unientity>7EBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 77"><unientity>7EB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 7A"><unientity>7EAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 7C"><unientity>7EB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 7D"><unientity>7EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 50 7E"><unientity>7EBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 21"><unientity>7EB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 22"><unientity>7EB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 23"><unientity>7EA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 24"><unientity>7EB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 25"><unientity>7EB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 26"><unientity>7ECA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 28"><unientity>7ECB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 29"><unientity>624E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 2A"><unientity>7ECD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 2B"><unientity>7EC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 2C"><unientity>7EC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 2D"><unientity>7EC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 2F"><unientity>7ECC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 30"><unientity>7EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 31"><unientity>7EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 32"><unientity>7EDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 33"><unientity>7ED2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 34"><unientity>7ED3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 36"><unientity>7EDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 37"><unientity>7EDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 38"><unientity>7EDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 39"><unientity>7ED9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 3B"><unientity>4E1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 3C"><unientity>7ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 3D"><unientity>6346</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 3E"><unientity>7EE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 3F"><unientity>7EE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 40"><unientity>7ED1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 41"><unientity>7EFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 42"><unientity>7EFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 43"><unientity>7EFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 44"><unientity>7D27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 45"><unientity>7EEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 46"><unientity>7F00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 48"><unientity>7F51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 49"><unientity>7EB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 4A"><unientity>7EF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 4C"><unientity>7EFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 4D"><unientity>7EF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 4E"><unientity>7EF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 4F"><unientity>7EF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 50"><unientity>7EB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 51"><unientity>7F01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 52"><unientity>7F14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 53"><unientity>7EAC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 54"><unientity>7EC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 55"><unientity>7EEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 56"><unientity>7F04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 57"><unientity>7F05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 58"><unientity>7F09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 59"><unientity>7F13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5A"><unientity>7F18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5B"><unientity>7F16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5C"><unientity>7EBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5D"><unientity>7F0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5E"><unientity>7F0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 5F"><unientity>7F23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 60"><unientity>7F22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 61"><unientity>8426</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 62"><unientity>7F1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 63"><unientity>81F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 64"><unientity>E974</unientity><unientityalt>53BF</unientityalt><desc>Variant of 455164 which maps to 53BF</desc></character>
+<character hex="27 51 65"><unientity>7F29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 66"><unientity>7EE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 67"><unientity>7F2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 68"><unientity>7F15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 69"><unientity>7F27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 6C"><unientity>7F1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 6D"><unientity>603B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 6E"><unientity>7EB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 6F"><unientity>7F2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 70"><unientity>7F2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 71"><unientity>7EC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 72"><unientity>7EE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 73"><unientity>7ED5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 74"><unientity>7F2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 75"><unientity>E90E</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 51 76"><unientity>7EF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 77"><unientity>8327</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 78"><unientity>7ECE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 79"><unientity>7ED8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 7A"><unientity>8FAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 7B"><unientity>7F24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 7D"><unientity>7EE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 51 7E"><unientity>7F20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 21"><unientity>7EED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 22"><unientity>7F28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 23"><unientity>7EA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 24"><unientity>7F06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 33"><unientity>7F5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 34"><unientity>9A82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 35"><unientity>7F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 37"><unientity>7F57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 38"><unientity>7F81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 42"><unientity>4E49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 4D"><unientity>4E60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 51"><unientity>7FC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 58"><unientity>7FD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 6F"><unientity>5723</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 71"><unientity>95FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 74"><unientity>58F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 75"><unientity>8038</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 76"><unientity>806A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 77"><unientity>8054</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 78"><unientity>804C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 79"><unientity>8042</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 7A"><unientity>804B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 52 7B"><unientity>542C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 21"><unientity>8083</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 44"><unientity>80C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 4A"><unientity>8090</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 4D"><unientity>8109</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 58"><unientity>80BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 59"><unientity>80C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 5E"><unientity>80A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 62"><unientity>80BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 65"><unientity>8111</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 6C"><unientity>80F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 6E"><unientity>80A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 71"><unientity>817B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 78"><unientity>8113</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 79"><unientity>80C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 7A"><unientity>8138</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 7B"><unientity>810D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 7C"><unientity>8110</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 7D"><unientity>8191</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 53 7E"><unientity>814A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 21"><unientity>80EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 22"><unientity>E90F</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 54 25"><unientity>4E34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 2B"><unientity>53F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 32"><unientity>4E0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 33"><unientity>5174</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 34"><unientity>4E3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 35"><unientity>65E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 4A"><unientity>8231</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 4B"><unientity>8230</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 4E"><unientity>8270</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 54 58"><unientity>E910</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 54 5C"><unientity>520D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 28"><unientity>835A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 29"><unientity>830E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 2A"><unientity>82CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 2D"><unientity>5E84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 3C"><unientity>534E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 41"><unientity>83B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 4D"><unientity>82C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 4F"><unientity>53F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 51"><unientity>E911</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 55 53"><unientity>8364</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 55"><unientity>83B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 5D"><unientity>5E2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 63"><unientity>836A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 64"><unientity>82CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 67"><unientity>82CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 68"><unientity>8298</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 6C"><unientity>83B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 6E"><unientity>836B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 71"><unientity>848B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 73"><unientity>535C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 76"><unientity>8361</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 55 7C"><unientity>829C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 22"><unientity>8427</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 24"><unientity>59DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 26"><unientity>8537</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 29"><unientity>84DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 2A"><unientity>8428</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 2E"><unientity>501F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 31"><unientity>827A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 32"><unientity>85AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 35"><unientity>836F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 37"><unientity>853C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 39"><unientity>853A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 3A"><unientity>82A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 3B"><unientity>82F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 3C"><unientity>82CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 3D"><unientity>8574</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 3E"><unientity>5170</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 40"><unientity>85D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 42"><unientity>841D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 44"><unientity>4E47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 47"><unientity>5904</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 48"><unientity>864F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 4A"><unientity>53F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 4C"><unientity>4E8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 5A"><unientity>65E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 76"><unientity>8680</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 56 79"><unientity>E912</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 56 7A"><unientity>867E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 24"><unientity>8424</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 25"><unientity>8682</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 2C"><unientity>877C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 32"><unientity>86F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 33"><unientity>866B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 34"><unientity>8749</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 35"><unientity>8681</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 36"><unientity>8747</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 3C"><unientity>86CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 3E"><unientity>8721</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 3F"><unientity>86CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 41"><unientity>8695</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 42"><unientity>86EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 46"><unientity>672E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 47"><unientity>4E8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 49"><unientity>536B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 4A"><unientity>E913</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 57 62"><unientity>8865</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 63"><unientity>91CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 65"><unientity>88C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 6C"><unientity>5236</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 71"><unientity>8934</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 73"><unientity>88E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 77"><unientity>4EB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 79"><unientity>891B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 7C"><unientity>88C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 57 7D"><unientity>8884</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 21"><unientity>889C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 22"><unientity>886C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 23"><unientity>88AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 28"><unientity>89C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 29"><unientity>89C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2A"><unientity>89C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2B"><unientity>89C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2C"><unientity>4EB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2D"><unientity>89CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2E"><unientity>89CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 2F"><unientity>89D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 30"><unientity>89C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 31"><unientity>89C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 32"><unientity>89C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 35"><unientity>89DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 38"><unientity>8BA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 39"><unientity>8BA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3A"><unientity>8BA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3B"><unientity>8BA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3C"><unientity>8BB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3D"><unientity>8BA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3E"><unientity>8BA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 3F"><unientity>8BAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 40"><unientity>8BAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 41"><unientity>8BAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 43"><unientity>8BAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 44"><unientity>8BBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 45"><unientity>8BC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 46"><unientity>8BB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 47"><unientity>8BB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 48"><unientity>8BB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 49"><unientity>8BBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 4A"><unientity>8BB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 4B"><unientity>8BBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 4C"><unientity>6CE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 4E"><unientity>8BC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 4F"><unientity>8BCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 51"><unientity>8BC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 52"><unientity>8BCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 53"><unientity>8BC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 54"><unientity>8BC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 55"><unientity>8BCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 56"><unientity>8BC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 57"><unientity>8BCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 58"><unientity>8BE7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 59"><unientity>8BE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5A"><unientity>8BE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5B"><unientity>8BD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5C"><unientity>8BD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5D"><unientity>8BD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5E"><unientity>8BE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 5F"><unientity>8BD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 60"><unientity>8BDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 61"><unientity>5938</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 62"><unientity>8BDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 63"><unientity>8BE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 65"><unientity>8BE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 66"><unientity>8BDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 67"><unientity>8BE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 68"><unientity>8BDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 69"><unientity>8BF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 6A"><unientity>8BF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 6B"><unientity>8BEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 6C"><unientity>8BED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 6D"><unientity>5FD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 6F"><unientity>8BEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 70"><unientity>8BA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 71"><unientity>8BEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 72"><unientity>8BF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 73"><unientity>8BF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 74"><unientity>8BF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 75"><unientity>8BF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 76"><unientity>8C0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 77"><unientity>8C06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 78"><unientity>8C05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 79"><unientity>8C08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 7A"><unientity>8BF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 7B"><unientity>8BF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 7C"><unientity>8BFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 7D"><unientity>8C03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 58 7E"><unientity>8BFF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 21"><unientity>8C04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 22"><unientity>8C01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 23"><unientity>8BDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 24"><unientity>8BBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 25"><unientity>8C1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 26"><unientity>8C1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 27"><unientity>8C0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 28"><unientity>8BB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 29"><unientity>8C10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2A"><unientity>8C0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2B"><unientity>8C0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2C"><unientity>8C12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2D"><unientity>8C13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2E"><unientity>8BFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 2F"><unientity>8BBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 30"><unientity>8C15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 31"><unientity>8C24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 32"><unientity>8C26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 33"><unientity>8C1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 34"><unientity>8BB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 35"><unientity>8C0E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 36"><unientity>8C23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 37"><unientity>8A8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 38"><unientity>8C22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 39"><unientity>8C28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3A"><unientity>8C2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3B"><unientity>8C1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3C"><unientity>8BC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3D"><unientity>8C31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3E"><unientity>8C32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 3F"><unientity>8BC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 40"><unientity>8C2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 42"><unientity>8BA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 43"><unientity>8BAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 46"><unientity>8BD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 47"><unientity>8C34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 48"><unientity>62A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 49"><unientity>8A89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 4A"><unientity>8BFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 4B"><unientity>53D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 4C"><unientity>8BA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 4D"><unientity>8C36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 4E"><unientity>8C17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 54"><unientity>5C82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 57"><unientity>7AD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 58"><unientity>4E30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 5E"><unientity>4E88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 66"><unientity>7683</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 68"><unientity>8D1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 69"><unientity>8D1E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6A"><unientity>8D1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6B"><unientity>8D21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6C"><unientity>8D22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6D"><unientity>8D23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6E"><unientity>8D2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 6F"><unientity>8D27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 70"><unientity>8D2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 71"><unientity>8D2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 72"><unientity>8D29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 75"><unientity>8D39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 76"><unientity>8D32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 77"><unientity>8D3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 78"><unientity>8D35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 79"><unientity>8D34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 7A"><unientity>4E70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 7B"><unientity>8D2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 7C"><unientity>8D3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 7D"><unientity>8D37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 59 7E"><unientity>8D38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 21"><unientity>8D45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 22"><unientity>8D44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 23"><unientity>8D3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 24"><unientity>8D3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 25"><unientity>8D3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 26"><unientity>8D40</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 27"><unientity>8D41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 28"><unientity>8D42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 29"><unientity>5BBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 2A"><unientity>8D48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 2B"><unientity>8D4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 2C"><unientity>8D54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 2D"><unientity>8D4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 2F"><unientity>5356</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 30"><unientity>8D24</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 31"><unientity>8D31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 32"><unientity>8D4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 33"><unientity>8D50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 34"><unientity>8D28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 35"><unientity>8D4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 36"><unientity>8D56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 37"><unientity>8D5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 38"><unientity>8D5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 39"><unientity>8D58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3A"><unientity>8D2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3B"><unientity>8D60</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3C"><unientity>8D5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3D"><unientity>8D5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3E"><unientity>8D62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 3F"><unientity>8D61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 40"><unientity>8D43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 41"><unientity>8D4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 42"><unientity>8D63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 4F"><unientity>8D75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 50"><unientity>8D76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 53"><unientity>8D8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 68"><unientity>8DF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 71"><unientity>8E0A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 78"><unientity>8E52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5A 7E"><unientity>8DF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 26"><unientity>8DB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 28"><unientity>8E0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 29"><unientity>8DC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 2A"><unientity>8E2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 2B"><unientity>8E51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 2C"><unientity>8E8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 31"><unientity>8EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 32"><unientity>8F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 33"><unientity>8F67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 34"><unientity>519B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 35"><unientity>8F68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 36"><unientity>8F69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 37"><unientity>8F6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 38"><unientity>8F6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 39"><unientity>8F6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3A"><unientity>8F72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3B"><unientity>8F74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3C"><unientity>8F76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3D"><unientity>8F83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3E"><unientity>8F7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 3F"><unientity>8F7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 40"><unientity>8F7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 41"><unientity>8F85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 42"><unientity>8F84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 43"><unientity>8F7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 45"><unientity>8F87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 46"><unientity>8F86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 47"><unientity>8F8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 48"><unientity>8F89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 49"><unientity>8F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4A"><unientity>8F6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4B"><unientity>8F8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4C"><unientity>8F90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4D"><unientity>8F91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4E"><unientity>8F93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 4F"><unientity>8F96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 50"><unientity>8F97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 51"><unientity>8F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 52"><unientity>6BC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 53"><unientity>8206</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 54"><unientity>8F99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 55"><unientity>8F6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 56"><unientity>8F9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 57"><unientity>8F7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 58"><unientity>8F70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 59"><unientity>8F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 5F"><unientity>529E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 60"><unientity>8F9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 61"><unientity>8FA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 64"><unientity>519C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 6D"><unientity>8FF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 7D"><unientity>8FD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5B 7E"><unientity>8FDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 33"><unientity>8FDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 34"><unientity>8FD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 39"><unientity>8FBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 3A"><unientity>8FDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 3C"><unientity>8FC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 3E"><unientity>8FC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 44"><unientity>8FDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 45"><unientity>900A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 48"><unientity>9012</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 49"><unientity>9002</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 4F"><unientity>9009</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 50"><unientity>8FDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 51"><unientity>8FC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 52"><unientity>8FBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 53"><unientity>9057</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 56"><unientity>8FC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 57"><unientity>8FD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 5A"><unientity>E975</unientity><unientityalt>8FE9</unientityalt><desc>Variant of 2D5C5A which maps to 8FE9</desc></character>
+<character hex="27 5C 5B"><unientity>8FB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 5C"><unientity>9026</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 5D"><unientity>903B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 6B"><unientity>5369</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 6D"><unientity>90AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 70"><unientity>4E61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 71"><unientity>90B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 73"><unientity>90D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 74"><unientity>90BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5C 75"><unientity>9093</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 2A"><unientity>9154</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 2F"><unientity>915D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 30"><unientity>4E11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 31"><unientity>533B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 32"><unientity>9171</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 34"><unientity>917F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 35"><unientity>8845</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 38"><unientity>91CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 3D"><unientity>5398</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 3F"><unientity>9488</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 40"><unientity>9489</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 41"><unientity>948A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 43"><unientity>9497</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 45"><unientity>9493</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 46"><unientity>948F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 47"><unientity>9499</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 48"><unientity>949D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 49"><unientity>94AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 4A"><unientity>94A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 4B"><unientity>949E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 4C"><unientity>94A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 4D"><unientity>94A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 4F"><unientity>94B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 50"><unientity>94B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 51"><unientity>94B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 52"><unientity>94C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 53"><unientity>94BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 55"><unientity>94C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 56"><unientity>94A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 57"><unientity>94C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 58"><unientity>94C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 59"><unientity>94F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5A"><unientity>94F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5B"><unientity>94D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5C"><unientity>94DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5D"><unientity>94ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5E"><unientity>94E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 5F"><unientity>94EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 60"><unientity>94E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 61"><unientity>8854</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 62"><unientity>950C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 63"><unientity>9511</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 64"><unientity>9510</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 65"><unientity>94FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 66"><unientity>9500</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 67"><unientity>94DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 68"><unientity>9504</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 69"><unientity>9509</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 6A"><unientity>950B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 6B"><unientity>952D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 6D"><unientity>952F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 6E"><unientity>9530</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 6F"><unientity>9519</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 70"><unientity>94B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 71"><unientity>94A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 72"><unientity>9521</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 73"><unientity>94EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 74"><unientity>5F55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 75"><unientity>9525</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 76"><unientity>9526</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 77"><unientity>9540</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 78"><unientity>9541</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 79"><unientity>952E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 7A"><unientity>9532</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 7C"><unientity>9505</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 7D"><unientity>951A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5D 7E"><unientity>953E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 21"><unientity>949F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 22"><unientity>9524</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 23"><unientity>9539</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 24"><unientity>953B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 25"><unientity>9551</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 27"><unientity>9547</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 28"><unientity>9501</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 29"><unientity>94A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 2A"><unientity>954D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 2B"><unientity>955C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 2C"><unientity>955D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 2E"><unientity>955E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 2F"><unientity>94F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 30"><unientity>94FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 31"><unientity>94FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 32"><unientity>9556</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 33"><unientity>9557</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 34"><unientity>9542</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 35"><unientity>9558</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 36"><unientity>9559</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 37"><unientity>9535</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 39"><unientity>94D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3A"><unientity>9570</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3B"><unientity>9508</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3C"><unientity>956D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3D"><unientity>94C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3E"><unientity>94DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 3F"><unientity>94CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 40"><unientity>956F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 43"><unientity>94F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 44"><unientity>9573</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 45"><unientity>94C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 46"><unientity>9576</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 47"><unientity>94A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 48"><unientity>92AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 49"><unientity>9523</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4A"><unientity>94BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4B"><unientity>51FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4C"><unientity>957F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4D"><unientity>95E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4E"><unientity>95E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 4F"><unientity>95EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 50"><unientity>95ED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 51"><unientity>95F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 52"><unientity>95F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 53"><unientity>5F00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 54"><unientity>95F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 55"><unientity>95F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 57"><unientity>95F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 58"><unientity>9602</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 59"><unientity>95FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5A"><unientity>95FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5B"><unientity>9601</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5C"><unientity>9600</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5D"><unientity>5408</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5E"><unientity>9605</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 5F"><unientity>95FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 60"><unientity>960E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 61"><unientity>9614</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 62"><unientity>9615</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 63"><unientity>9611</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 64"><unientity>95F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 65"><unientity>677F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 67"><unientity>95EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 68"><unientity>9617</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 69"><unientity>5173</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 6A"><unientity>9610</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5E 6B"><unientity>E914</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 5E 7B"><unientity>9635</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 23"><unientity>9648</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 24"><unientity>9646</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 2A"><unientity>9634</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 2B"><unientity>961F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 2C"><unientity>9636</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 2E"><unientity>9633</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 37"><unientity>9645</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 39"><unientity>968F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 3A"><unientity>9669</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 3B"><unientity>9690</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 3C"><unientity>9647</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 3D"><unientity>96B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 3E"><unientity>E915</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 5F 4A"><unientity>867D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 4B"><unientity>6742</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 4C"><unientity>9E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 4D"><unientity>96CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 4E"><unientity>53CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 4F"><unientity>79BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 50"><unientity>96BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 54"><unientity>4E91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 55"><unientity>7535</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 67"><unientity>96FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 6B"><unientity>9701</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 6D"><unientity>972D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 6E"><unientity>96F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 6F"><unientity>7075</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 5F 79"><unientity>9765</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 23"><unientity>5DE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 29"><unientity>9791</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 2C"><unientity>97E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 2D"><unientity>97E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 2E"><unientity>97E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 2F"><unientity>97EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 30"><unientity>827D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 36"><unientity>54CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 37"><unientity>9875</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 38"><unientity>9876</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 39"><unientity>9877</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3A"><unientity>9879</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3B"><unientity>987A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3C"><unientity>987B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3D"><unientity>9884</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3E"><unientity>987C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 3F"><unientity>987D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 40"><unientity>987F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 41"><unientity>9881</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 42"><unientity>9882</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 43"><unientity>9887</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 44"><unientity>9886</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 45"><unientity>9889</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 46"><unientity>5934</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 47"><unientity>988A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 48"><unientity>9888</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 49"><unientity>9891</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4A"><unientity>9893</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4B"><unientity>9894</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4C"><unientity>9890</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4D"><unientity>9897</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4E"><unientity>989C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 4F"><unientity>989D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 50"><unientity>9898</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 51"><unientity>989A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 52"><unientity>989B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 53"><unientity>7C7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 54"><unientity>98A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 55"><unientity>613F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 56"><unientity>987E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 57"><unientity>98A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 58"><unientity>663E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 59"><unientity>9885</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 5A"><unientity>98A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 5B"><unientity>98CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 5C"><unientity>98D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 5D"><unientity>E916</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 60 5E"><unientity>522E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 5F"><unientity>98D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 61"><unientity>98D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 62"><unientity>98D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 63"><unientity>98DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 65"><unientity>9965</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 67"><unientity>9968</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 68"><unientity>996C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 69"><unientity>996A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6A"><unientity>996E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6B"><unientity>996D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6C"><unientity>9972</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6D"><unientity>9974</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6E"><unientity>9971</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 6F"><unientity>9970</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 70"><unientity>997A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 71"><unientity>517B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 72"><unientity>9975</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 73"><unientity>9977</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 75"><unientity>9981</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 76"><unientity>4F59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 77"><unientity>997F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 78"><unientity>997C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 79"><unientity>9986</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 7A"><unientity>996F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 7B"><unientity>9984</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 7C"><unientity>9985</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 60 7E"><unientity>998F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 21"><unientity>998A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 23"><unientity>9992</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 24"><unientity>9976</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 26"><unientity>990D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 27"><unientity>998B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 2C"><unientity>9A6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 2D"><unientity>51AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 2E"><unientity>9A6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 2F"><unientity>9A70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 30"><unientity>9A6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 31"><unientity>9A6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 32"><unientity>9A73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 33"><unientity>9A7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 34"><unientity>9A7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 35"><unientity>9A7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 36"><unientity>9A77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 37"><unientity>9A76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 38"><unientity>9A79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 39"><unientity>9A78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3A"><unientity>9A7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3B"><unientity>9A87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3C"><unientity>9A86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3D"><unientity>9A8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3E"><unientity>9A8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 3F"><unientity>9A88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 40"><unientity>9A91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 41"><unientity>9A97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 42"><unientity>9A9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 43"><unientity>9A9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 44"><unientity>817E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 45"><unientity>9A9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 46"><unientity>9AA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 47"><unientity>9A71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 48"><unientity>84E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 49"><unientity>9AA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4A"><unientity>9A84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4B"><unientity>60CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4C"><unientity>9A7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4D"><unientity>9A8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4E"><unientity>9AA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 4F"><unientity>9A74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 50"><unientity>9AA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 51"><unientity>9A8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 53"><unientity>80AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 58"><unientity>9AC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 5A"><unientity>4F53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 5B"><unientity>810F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 5F"><unientity>E917</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 61 63"><unientity>E918</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 61 64"><unientity>E919</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 61 65"><unientity>E91A</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 61 66"><unientity>9B13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 67"><unientity>6597</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 68"><unientity>95F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 6A"><unientity>90C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 73"><unientity>9B47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 74"><unientity>9C7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 75"><unientity>9C7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 76"><unientity>9C81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 77"><unientity>9C8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 78"><unientity>9C9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 79"><unientity>9C9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 7A"><unientity>9C94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 7B"><unientity>9CA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 7C"><unientity>9CA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 7D"><unientity>9CB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 61 7E"><unientity>9CB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 21"><unientity>9CC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 22"><unientity>9CC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 23"><unientity>9CAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 24"><unientity>9CCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 25"><unientity>9CCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 26"><unientity>9CA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 27"><unientity>9CD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 28"><unientity>9CD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 29"><unientity>9CDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 2A"><unientity>9CDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 2B"><unientity>9CDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 2C"><unientity>9CD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 2E"><unientity>9C88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 2F"><unientity>9E1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 30"><unientity>9E20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 31"><unientity>9E22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 32"><unientity>9E23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 33"><unientity>51E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 34"><unientity>9E29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 35"><unientity>9E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 36"><unientity>9E35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 37"><unientity>9E2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 38"><unientity>9E2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 39"><unientity>9E2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 3A"><unientity>9E33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 3C"><unientity>9E3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 3D"><unientity>9E3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 3E"><unientity>9E49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 3F"><unientity>9E43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 40"><unientity>9E44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 41"><unientity>9E45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 42"><unientity>9E51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 43"><unientity>9E4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 44"><unientity>9E4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 45"><unientity>9E4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 46"><unientity>9E64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 47"><unientity>83BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 48"><unientity>9E5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 49"><unientity>9E67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4A"><unientity>9E25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4B"><unientity>9E36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4C"><unientity>9E70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4D"><unientity>9E6D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4E"><unientity>9E66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 4F"><unientity>9E3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 50"><unientity>54B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 51"><unientity>76D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 52"><unientity>7877</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 56"><unientity>4E3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 5B"><unientity>9EA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 5C"><unientity>9EB8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 5E"><unientity>9762</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 60"><unientity>4E48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 6A"><unientity>70B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 6F"><unientity>515A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 72"><unientity>9EE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 76"><unientity>51AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 7D"><unientity>9F50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 62 7E"><unientity>658E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 21"><unientity>9F7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 22"><unientity>9F83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 24"><unientity>9F84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 25"><unientity>9F88</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 26"><unientity>9F87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 27"><unientity>9F89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 28"><unientity>9F8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 29"><unientity>9F8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 2A"><unientity>9F8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 2B"><unientity>9F99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 2C"><unientity>9F9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 63 2D"><unientity>9F9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 66 49"><unientity>4F1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 67 75"><unientity>4F65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 67 7C"><unientity>4F1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 68 22"><unientity>507B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 68 42"><unientity>507E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 68 71"><unientity>4FAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 69 44"><unientity>50A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 69 48"><unientity>50A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6B 3E"><unientity>522D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6B 5B"><unientity>5250</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6B 5F"><unientity>672D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6B 79"><unientity>523F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6B 7A"><unientity>523D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6D 2E"><unientity>5326</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6D 6D"><unientity>538D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6E 2A"><unientity>53A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 6F 69"><unientity>5459</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 70 30"><unientity>5457</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 71 69"><unientity>5522</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 34"><unientity>551B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 39"><unientity>54D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 55"><unientity>54D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 58"><unientity>E91B</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="27 72 67"><unientity>5452</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 72"><unientity>54D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 7A"><unientity>54D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 72 7E"><unientity>54D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 73 28"><unientity>54DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 73 45"><unientity>556E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 73 4C"><unientity>5456</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 73 5A"><unientity>55BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 73 60"><unientity>5181</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 74 2E"><unientity>56F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 76 38"><unientity>57AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 76 7A"><unientity>57DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 77 42"><unientity>57D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 77 45"><unientity>57D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 77 48"><unientity>57B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 78 5A"><unientity>5785</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 78 5E"><unientity>5786</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 79 54"><unientity>5956</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7B 3C"><unientity>5A05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7C 24"><unientity>5A32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7C 36"><unientity>59AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7D 2B"><unientity>5A06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7D 40"><unientity>5AF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7D 48"><unientity>5AD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="27 7D 74"><unientity>5A08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 23 2B"><unientity>5C66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 24 41"><unientity>5C98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 24 58"><unientity>5D03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 25 5A"><unientity>5D5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 25 69"><unientity>5D02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 25 77"><unientity>5CE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 26 26"><unientity>5CC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 26 32"><unientity>5D58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 26 47"><unientity>5CBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 26 59"><unientity>5DEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 27 36"><unientity>5E0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 27 47"><unientity>5E3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 27 5F"><unientity>5E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 28 68"><unientity>5E91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 29 51"><unientity>5F2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2D 34"><unientity>607D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2D 5E"><unientity>607A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2D 74"><unientity>6004</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2D 77"><unientity>60AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2D 79"><unientity>60AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2E 4C"><unientity>6126</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2E 52"><unientity>6003</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2E 5C"><unientity>603F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2E 79"><unientity>6079</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2E 7E"><unientity>603C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2F 43"><unientity>6206</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2F 47"><unientity>620B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 2F 66"><unientity>6217</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 33 6F"><unientity>629F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 33 7B"><unientity>62A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 34 2C"><unientity>63BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 34 2E"><unientity>63BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 34 57"><unientity>63B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 34 62"><unientity>6322</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 34 66"><unientity>63FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 2A"><unientity>6448</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 42"><unientity>64B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 46"><unientity>6445</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 5B"><unientity>6484</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 61"><unientity>64BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 35 6D"><unientity>6512</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 36 71"><unientity>6593</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 39 55"><unientity>6619</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 39 5C"><unientity>6654</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 3B 22"><unientity>4E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 3B 7D"><unientity>E91C</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="28 3D 30"><unientity>67A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 3D 6E"><unientity>67A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 3F 30"><unientity>6966</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 3F 5C"><unientity>6769</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 40 27"><unientity>6864</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 40 56"><unientity>6920</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 40 5E"><unientity>67FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 41 40"><unientity>6861</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 42 2B"><unientity>6A2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 42 57"><unientity>68BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 33"><unientity>680E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 35"><unientity>6A7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 37"><unientity>6987</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 39"><unientity>680A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 3A"><unientity>69E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 40"><unientity>67A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 45"><unientity>680C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 50"><unientity>68C2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 59"><unientity>6989</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 43 66"><unientity>6924</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 45 39"><unientity>6B9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 46 42"><unientity>6BF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 46 4C"><unientity>6BE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 46 51"><unientity>6C07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 46 68"><unientity>6C29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 49 34"><unientity>6D43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 49 71"><unientity>6D9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4B 28"><unientity>6D48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4B 43"><unientity>8365</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4C 2E"><unientity>6D52</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4C 41"><unientity>6CA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4C 62"><unientity>988D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4D 27"><unientity>6D9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4D 2B"><unientity>6D54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4D 49"><unientity>6DA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4D 58"><unientity>6CA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4D 59"><unientity>6ED7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 30"><unientity>6E11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 3E"><unientity>6CF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 41"><unientity>6F4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 42"><unientity>6D4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 62"><unientity>6F4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4E 66"><unientity>6EE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 26"><unientity>6CF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 39"><unientity>6CF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 5D"><unientity>6CA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 61"><unientity>6EE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 6B"><unientity>6F13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 4F 7D"><unientity>704F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 50 29"><unientity>6EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 51 50"><unientity>70C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 52 52"><unientity>709C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 53 23"><unientity>8367</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 53 3C"><unientity>709D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 54 24"><unientity>70E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 54 4F"><unientity>70EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 57 5E"><unientity>72B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 57 5F"><unientity>72F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 58 2B"><unientity>7303</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 58 36"><unientity>7315</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5A 47"><unientity>73AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5B 21"><unientity>740F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5C 3A"><unientity>748E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5C 40"><unientity>74D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5D 6B"><unientity>7572</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5E 7A"><unientity>75D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5F 48"><unientity>7617</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5F 5E"><unientity>7618</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 5F 6F"><unientity>7605</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 60 2B"><unientity>762A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 60 32"><unientity>75AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 60 37"><unientity>763F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 60 3A"><unientity>75C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 62 22"><unientity>7726</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 62 72"><unientity>770D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 63 2C"><unientity>7751</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 64 5A"><unientity>7817</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 64 60"><unientity>7856</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 65 40"><unientity>7800</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 65 6A"><unientity>789B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 65 77"><unientity>789C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 66 22"><unientity>7857</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 66 55"><unientity>783B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6A 3C"><unientity>7AAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6B 7C"><unientity>7B15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6C 58"><unientity>7BA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6D 47"><unientity>7BA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6D 54"><unientity>7B5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6E 56"><unientity>7BA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6E 68"><unientity>7B3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 6E 69"><unientity>7C16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 22"><unientity>7CC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 2E"><unientity>E91D</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="28 70 30"><unientity>7C9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 35"><unientity>7C74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 42"><unientity>7EA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 45"><unientity>7EA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 4A"><unientity>7EBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 61"><unientity>7EC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 62"><unientity>7EC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 65"><unientity>7EC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 70 6A"><unientity>7ED0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 30"><unientity>7EDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 34"><unientity>7ED7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 39"><unientity>7EE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 44"><unientity>7EE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 4D"><unientity>7EE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 61"><unientity>7EFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 67"><unientity>7EEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 74"><unientity>7EF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 78"><unientity>7EF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 71 7D"><unientity>7EFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 29"><unientity>7F17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 2A"><unientity>7F02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 31"><unientity>7F03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 36"><unientity>7F07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 3C"><unientity>7F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 3E"><unientity>7F0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 47"><unientity>7F11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 48"><unientity>7F0F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 51"><unientity>7F1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 53"><unientity>7F12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 5D"><unientity>7F1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 5E"><unientity>7F19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 5F"><unientity>7F1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 69"><unientity>7EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 71"><unientity>E91E</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="28 72 72"><unientity>7F21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 75"><unientity>7D77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 72 79"><unientity>7F25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 21"><unientity>7F26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 2D"><unientity>7F2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 49"><unientity>7F30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 4E"><unientity>7F32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 51"><unientity>7F33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 52"><unientity>7F34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 59"><unientity>7F31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 5D"><unientity>7EA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 60"><unientity>7F2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 6D"><unientity>624D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 73 74"><unientity>7F35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 74 2E"><unientity>7F42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 74 31"><unientity>E91F</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="28 74 72"><unientity>7F74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 75 31"><unientity>7F9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 76 55"><unientity>8027</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 77 39"><unientity>8069</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 77 3F"><unientity>804D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 78 55"><unientity>80EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 78 6E"><unientity>80E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 79 41"><unientity>8136</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 7A 56"><unientity>8114</unientity><desc>East Asian ideograph</desc></character>
+<character hex="28 7E 61"><unientity>82CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 23 3C"><unientity>836D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 23 3D"><unientity>836E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 23 75"><unientity>83B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 24 33"><unientity>E920</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="29 24 3A"><unientity>83BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 24 7D"><unientity>835C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 24"><unientity>848C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 2D"><unientity>8311</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 35"><unientity>82C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 46"><unientity>8368</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 4B"><unientity>835B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 5A"><unientity>8487</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 64"><unientity>8489</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 67"><unientity>836C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 71"><unientity>835E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 74"><unientity>83B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 25 77"><unientity>8297</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 33"><unientity>84E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 51"><unientity>84DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 57"><unientity>835F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 58"><unientity>83B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 61"><unientity>8360</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 26 68"><unientity>8369</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 27 52"><unientity>830F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 27 65"><unientity>82C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 27 68"><unientity>8572</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 28 2A"><unientity>8539</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 28 40"><unientity>84E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2A 2F"><unientity>86F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2A 34"><unientity>86AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2B 55"><unientity>86F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2B 6E"><unientity>86F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2C 4C"><unientity>866E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2C 55"><unientity>86CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2C 5D"><unientity>867F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2C 61"><unientity>86F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2C 64"><unientity>877E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2D 51"><unientity>8511</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2F 60"><unientity>88E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 2F 72"><unientity>88E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 30 2D"><unientity>88E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 30 32"><unientity>7962</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 30 66"><unientity>89C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 30 6F"><unientity>89CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 30 7D"><unientity>89CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 31 2B"><unientity>89D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 31 32"><unientity>89CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 31 60"><unientity>89EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 2A"><unientity>8BB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 3B"><unientity>8BCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 3C"><unientity>8BD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 4F"><unientity>8BD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 50"><unientity>8BD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 56"><unientity>8BE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 5D"><unientity>8BD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 5E"><unientity>8BDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 71"><unientity>8BEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 32 7E"><unientity>8C07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 25"><unientity>8BF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 2C"><unientity>8BFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 36"><unientity>8BE4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 38"><unientity>8BFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 3B"><unientity>8C00</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 40"><unientity>8C02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 44"><unientity>8C19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 45"><unientity>8BE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 4E"><unientity>8C0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 57"><unientity>8C14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 59"><unientity>8C11</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 5D"><unientity>8C16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 62"><unientity>8C1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 73"><unientity>8C21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 7A"><unientity>8BCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 33 7D"><unientity>8C27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 34 30"><unientity>8BB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 34 38"><unientity>8C29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 34 4D"><unientity>8C2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 34 59"><unientity>8C2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 34 68"><unientity>8C35</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 35 2D"><unientity>8C30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 35 37"><unientity>8C20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 35 39"><unientity>8C33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 4E"><unientity>8D33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 51"><unientity>8D36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 5F"><unientity>8D47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 6A"><unientity>8D53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 6B"><unientity>8D55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 70"><unientity>8D49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 36 7E"><unientity>8D59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 37 25"><unientity>8D3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 37 26"><unientity>8D5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 37 3A"><unientity>8D46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 38 66"><unientity>8DB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 2E"><unientity>8DC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 40"><unientity>8DF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 46"><unientity>8E70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 57"><unientity>8DFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 5E"><unientity>8DF9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 5F"><unientity>8DDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 60"><unientity>8E2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 6B"><unientity>8E7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3A 70"><unientity>8E9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 3E"><unientity>8F71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 3F"><unientity>8F7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 42"><unientity>8F75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 47"><unientity>8F77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 4F"><unientity>8F78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 59"><unientity>8F82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 5B"><unientity>8F81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 6B"><unientity>8F8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 6D"><unientity>8F8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3B 7A"><unientity>8F8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3C 30"><unientity>8F98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3C 57"><unientity>8F79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3C 5A"><unientity>8F73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3D 4E"><unientity>8FF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3F 23"><unientity>90CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3F 4C"><unientity>90D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3F 5A"><unientity>90E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 3F 5C"><unientity>90AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 40 21"><unientity>90F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 40 2B"><unientity>90BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 40 2C"><unientity>90D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 40 31"><unientity>909D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 40 40"><unientity>90E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 5C"><unientity>917E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 5D"><unientity>917D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 61"><unientity>9487</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 62"><unientity>9486</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 63"><unientity>948C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 64"><unientity>948B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 6A"><unientity>948D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 6B"><unientity>948E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 41 79"><unientity>9492</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 21"><unientity>9495</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 22"><unientity>9490</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 23"><unientity>94AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 24"><unientity>94AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 25"><unientity>94AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 28"><unientity>94AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 31"><unientity>94AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 37"><unientity>949B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 4B"><unientity>94A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 51"><unientity>94C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 52"><unientity>94C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 54"><unientity>94CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 55"><unientity>94CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 58"><unientity>94B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 5C"><unientity>94CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 5F"><unientity>94B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 60"><unientity>94B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 61"><unientity>94B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 64"><unientity>94BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 6D"><unientity>94CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 6F"><unientity>94BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 42 74"><unientity>94BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 2B"><unientity>94C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 2F"><unientity>94F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 31"><unientity>94F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 35"><unientity>94F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 40"><unientity>94D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 43"><unientity>94D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 46"><unientity>94D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 49"><unientity>94D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 4F"><unientity>94DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 50"><unientity>94DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 55"><unientity>94EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 58"><unientity>94EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 59"><unientity>94E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 5B"><unientity>94E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 62"><unientity>94EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 64"><unientity>94F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 6A"><unientity>9512</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 6C"><unientity>950D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 71"><unientity>94FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 72"><unientity>9513</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 75"><unientity>9514</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 43 7D"><unientity>94D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 27"><unientity>94D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 2B"><unientity>9503</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 2D"><unientity>94A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 2E"><unientity>9502</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 35"><unientity>950A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 3E"><unientity>94E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 40"><unientity>9506</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 41"><unientity>9507</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 4D"><unientity>952B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 57"><unientity>9529</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 58"><unientity>952C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 5B"><unientity>9516</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 66"><unientity>9515</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 69"><unientity>94FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 6D"><unientity>951B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 71"><unientity>951D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 72"><unientity>951E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 74"><unientity>951F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 75"><unientity>9494</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 44 78"><unientity>9522</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 31"><unientity>9528</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 32"><unientity>9531</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 4D"><unientity>9534</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 4E"><unientity>9545</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 51"><unientity>9517</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 5E"><unientity>94E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 64"><unientity>9536</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 67"><unientity>9537</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 68"><unientity>9518</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 6F"><unientity>9538</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 45 7A"><unientity>9550</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 21"><unientity>9553</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 28"><unientity>9552</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 29"><unientity>84E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 2D"><unientity>9549</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 42"><unientity>94E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 47"><unientity>954F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 4A"><unientity>953C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 56"><unientity>955B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 5A"><unientity>955F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 62"><unientity>956A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 66"><unientity>933E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 46 7C"><unientity>9546</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 2F"><unientity>94E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 32"><unientity>94F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 34"><unientity>9566</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 3C"><unientity>9568</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 3E"><unientity>94F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 4D"><unientity>956B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 50"><unientity>950E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 51"><unientity>950F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 58"><unientity>9561</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 5E"><unientity>9562</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 60"><unientity>9563</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 67"><unientity>94E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 69"><unientity>9564</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 47 74"><unientity>9571</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 3E"><unientity>9554</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 3F"><unientity>9572</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 4A"><unientity>956C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 5C"><unientity>9565</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 69"><unientity>9567</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 6F"><unientity>9569</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 48 71"><unientity>954A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 36"><unientity>95F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 42"><unientity>9606</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 44"><unientity>9603</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 48"><unientity>960F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 49"><unientity>9608</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 4D"><unientity>9609</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 4F"><unientity>960A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 50"><unientity>960C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 52"><unientity>960D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 5A"><unientity>9612</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 60"><unientity>9619</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 69"><unientity>961A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 49 6F"><unientity>95FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4A 44"><unientity>9655</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4A 46"><unientity>9649</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4C 76"><unientity>9753</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4E 43"><unientity>97AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4E 54"><unientity>97EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4E 5C"><unientity>97EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4E 79"><unientity>9878</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4E 7B"><unientity>9883</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4F 23"><unientity>9880</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4F 2C"><unientity>988F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4F 6B"><unientity>98A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 4F 77"><unientity>989F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 21"><unientity>98A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 29"><unientity>98A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 30"><unientity>989E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 31"><unientity>98A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 53"><unientity>98D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 50 6C"><unientity>996B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 32"><unientity>997D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 53"><unientity>9967</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 66"><unientity>9969</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 6A"><unientity>9990</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 6D"><unientity>9991</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 70"><unientity>998D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 72"><unientity>9994</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 51 75"><unientity>9993</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 52 22"><unientity>98E8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 52 63"><unientity>9A75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 52 69"><unientity>9A80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 3D"><unientity>9A90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 40"><unientity>9A92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 47"><unientity>9A93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 5A"><unientity>9A9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 60"><unientity>9A98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 69"><unientity>9A7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 6A"><unientity>9A9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 70"><unientity>9A9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 79"><unientity>9A96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 53 7A"><unientity>9AA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 54 21"><unientity>9AA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 54 22"><unientity>9A81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 54 27"><unientity>9A85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 54 33"><unientity>9AA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 54 6D"><unientity>9ACB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 55 6C"><unientity>960B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 55 74"><unientity>9604</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 56 3C"><unientity>9B49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 56 5D"><unientity>9C82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 21"><unientity>9C86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 29"><unientity>9C87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 2B"><unientity>9C90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 31"><unientity>9C8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 39"><unientity>9C9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 3C"><unientity>9C91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 3D"><unientity>9C92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 42"><unientity>9C95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 56"><unientity>9CA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 5F"><unientity>9CA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 6E"><unientity>9CA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 7A"><unientity>9CAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 57 7C"><unientity>9CB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 22"><unientity>9CAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 25"><unientity>9CBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 27"><unientity>9CB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 28"><unientity>9CB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 2C"><unientity>9CB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 2D"><unientity>9CB7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 2F"><unientity>9CB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 31"><unientity>9CB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 34"><unientity>9CBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 3E"><unientity>9CCA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 4B"><unientity>9CBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 54"><unientity>9CC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 59"><unientity>9CC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 5C"><unientity>9CC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 6A"><unientity>9CCB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 6E"><unientity>9CA5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 58 71"><unientity>9CCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 21"><unientity>9CD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 25"><unientity>9CCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 28"><unientity>9CD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 29"><unientity>9CA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 2A"><unientity>9CD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 32"><unientity>9CD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 38"><unientity>9CDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 3A"><unientity>9C85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 3B"><unientity>9C9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 40"><unientity>9CBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 4F"><unientity>9CE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 55"><unientity>9C8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 58"><unientity>9C9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 59 6B"><unientity>9CA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 28"><unientity>9E28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 44"><unientity>9E32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 48"><unientity>9E31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 59"><unientity>9E38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 65"><unientity>9E39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 68"><unientity>9E3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 70"><unientity>9E48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5A 75"><unientity>9E41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 2A"><unientity>9E46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 35"><unientity>9E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 52"><unientity>9E4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 59"><unientity>9E5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 5C"><unientity>9E5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 60"><unientity>9E55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 6B"><unientity>9E57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 6C"><unientity>9E4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 77"><unientity>9E63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5B 79"><unientity>9E5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 28"><unientity>9E58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 3E"><unientity>9E37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 47"><unientity>9E68</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 49"><unientity>9E47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 57"><unientity>9E6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 5B"><unientity>9E6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 65"><unientity>9E69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5C 6C"><unientity>9E6A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 29"><unientity>9E71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 36"><unientity>9E2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 3A"><unientity>9E73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 3B"><unientity>9E42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 3C"><unientity>5364</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5D 42"><unientity>9E7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5E 6A"><unientity>9EEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5E 7A"><unientity>9EFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5E 7C"><unientity>9F0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5F 2B"><unientity>9F0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5F 7B"><unientity>9F51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 5F 7C"><unientity>9F80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 60 28"><unientity>9F86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 60 2B"><unientity>9F85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="29 60 62"><unientity>9F9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 21"><unientity>5F0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 2D"><unientity>4E17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 32"><unientity>7ADD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 45"><unientity>4E57</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 51"><unientity>5F0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 53"><unientity>4E3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 58"><unientity>4E9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 5B"><unientity>4EBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 61"><unientity>4EB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 30 6C"><unientity>8B8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 32"><unientity>4ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 3A"><unientity>62BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 40"><unientity>4F32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 47"><unientity>5002</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 4C"><unientity>5008</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 5F"><unientity>4FA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 64"><unientity>7AE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 31 65"><unientity>EA04</unientity><desc>East Asian ideography not found in unified han</desc></character>
+<character hex="2D 31 77"><unientity>5E78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 24"><unientity>7B87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 51"><unientity>510C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 53"><unientity>50E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 5F"><unientity>E976</unientity><unientityalt>50BB</unientityalt><desc>Variant of 4B325F which maps to 50BB</desc></character>
+<character hex="2D 32 61"><unientity>5039</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 63"><unientity>4FAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 72"><unientity>706E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 32 79"><unientity>514E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 24"><unientity>634C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 2A"><unientity>4E0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 32"><unientity>5190</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 4F"><unientity>5202</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 56"><unientity>E9F4</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="2D 33 5F"><unientity>52B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 66"><unientity>5234</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 6B"><unientity>5C05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 72"><unientity>5265</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 33 77"><unientity>8CF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 21"><unientity>5294</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 28"><unientity>5226</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 2E"><unientity>8274</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 36"><unientity>52F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 3C"><unientity>52A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 3D"><unientity>52E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 53"><unientity>758B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 57"><unientity>62FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 58"><unientity>4EDF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 5B"><unientity>6607</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 5D"><unientity>5349</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 64"><unientity>613D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 6A"><unientity>5918</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 6E"><unientity>5373</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 34 73"><unientity>5374</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 39"><unientity>52FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 3C"><unientity>6B62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 43"><unientity>4EDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 47"><unientity>55AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 56"><unientity>7343</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 5C"><unientity>5434</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 6A"><unientity>8A36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 35 71"><unientity>546A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 22"><unientity>8AEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 2A"><unientity>95A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 32"><unientity>8A7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 42"><unientity>6B38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 44"><unientity>5557</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 36 61"><unientity>6199</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 30"><unientity>751E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 48"><unientity>8B5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 49"><unientity>5650</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 58"><unientity>54BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 65"><unientity>8086</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 68"><unientity>56EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 6F"><unientity>5700</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 37 7C"><unientity>962C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 21"><unientity>962F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 30"><unientity>573B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 3F"><unientity>575A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 4A"><unientity>5872</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 52"><unientity>51A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 54"><unientity>5896</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 6E"><unientity>58CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 76"><unientity>58F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 38 77"><unientity>5900</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 21"><unientity>591F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 29"><unientity>6B80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 2F"><unientity>7287</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 31"><unientity>67F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 32"><unientity>7AD2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 44"><unientity>511E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 4D"><unientity>59AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 54"><unientity>7385</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 56"><unientity>59D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 6E"><unientity>4F84</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 70"><unientity>5A63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 74"><unientity>5B43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 39 7B"><unientity>5A31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3A 26"><unientity>5A3F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3A 2F"><unientity>58FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3A 41"><unientity>5AFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3A 47"><unientity>5ACB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3A 60"><unientity>6588</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 27"><unientity>51A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 2A"><unientity>5EBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 33"><unientity>8A67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 3F"><unientity>5C02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 40"><unientity>E977</unientity><unientityalt>5C06</unientityalt><desc>Variant of 273B40 which maps to 5C06</desc></character>
+<character hex="2D 3B 52"><unientity>6EBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 54"><unientity>5C4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 6E"><unientity>5D17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 77"><unientity>5CE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 78"><unientity>5CEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 79"><unientity>5D8B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3B 7B"><unientity>5D08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 21"><unientity>57FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 22"><unientity>5D10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 26"><unientity>5D18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 36"><unientity>5DE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 38"><unientity>9245</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 49"><unientity>83F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 5F"><unientity>6A66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 61"><unientity>5E47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 65"><unientity>79CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 6A"><unientity>51FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 6D"><unientity>E921</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="2D 3C 6E"><unientity>7240</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 70"><unientity>576B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 7C"><unientity>83F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 7D"><unientity>53A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3C 7E"><unientity>53A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 29"><unientity>53AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 2B"><unientity>5EBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 2D"><unientity>5396</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 2F"><unientity>539B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 34"><unientity>5EFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 48"><unientity>5F4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 4E"><unientity>7BF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 50"><unientity>5F5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 5E"><unientity>9AF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 67"><unientity>9015</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 6C"><unientity>5F93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 75"><unientity>60EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3D 76"><unientity>5FB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3E 2B"><unientity>6060</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3E 3C"><unientity>803B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3E 40"><unientity>6052</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3E 60"><unientity>6075</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 24"><unientity>661A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 27"><unientity>6120</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 2A"><unientity>5ABF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 31"><unientity>6159</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 3A"><unientity>6185</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 54"><unientity>61D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 67"><unientity>621E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 6E"><unientity>6226</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 6F"><unientity>622F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 3F 76"><unientity>78A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 29"><unientity>5214</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 31"><unientity>64A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 39"><unientity>67C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 3F"><unientity>6255</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 49"><unientity>67B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 4C"><unientity>6283</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 4F"><unientity>6294</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 66"><unientity>63CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 40 67"><unientity>62CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 22"><unientity>6485</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 32"><unientity>642F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 41"><unientity>63B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 47"><unientity>6271</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 50"><unientity>6428</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 52"><unientity>6447</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 53"><unientity>64E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 54"><unientity>635C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 6E"><unientity>6534</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 71"><unientity>62CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 41 76"><unientity>6483</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 42 28"><unientity>5117</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 42 49"><unientity>53D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 42 4F"><unientity>555F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 42 72"><unientity>65E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 42 77"><unientity>65EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 27"><unientity>6630</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 29"><unientity>668E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 2E"><unientity>66EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 3B"><unientity>6662</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 3E"><unientity>667B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 43"><unientity>6636</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 48"><unientity>6681</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 49"><unientity>66A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 5F"><unientity>6716</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 62"><unientity>6722</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 64"><unientity>671E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 43 70"><unientity>6736</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 25"><unientity>686E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 2D"><unientity>6780</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 37"><unientity>67FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 3A"><unientity>6942</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 40"><unientity>6822</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 44"><unientity>69C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 4B"><unientity>6852</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 50"><unientity>8308</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 61"><unientity>6746</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 66"><unientity>6973</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 6B"><unientity>6936</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 72"><unientity>68CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 44 74"><unientity>E978</unientity><unientityalt>690D</unientityalt><desc>Variant of 214474 which maps to 690D</desc></character>
+<character hex="2D 44 7D"><unientity>684C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 39"><unientity>6406</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 3A"><unientity>6760</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 43"><unientity>6901</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 4E"><unientity>697D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 50"><unientity>58AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 62"><unientity>681D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 64"><unientity>68B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 69"><unientity>6AC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 45 74"><unientity>5FFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 21"><unientity>61FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 2C"><unientity>6B7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 47"><unientity>6BD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 6D"><unientity>51B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 74"><unientity>51B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 46 7C"><unientity>6CB2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 29"><unientity>6D29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 30"><unientity>51B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 35"><unientity>6C4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 38"><unientity>6FFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 46"><unientity>6C79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 56"><unientity>6F94</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 5B"><unientity>51C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 5F"><unientity>51C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 47 68"><unientity>E979</unientity><unientityalt>6D45</unientityalt><desc>Variant of 274768 which maps to 6D45</desc></character>
+<character hex="2D 48 29"><unientity>51CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 2F"><unientity>6E07</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 44"><unientity>6FD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 45"><unientity>6E29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 50"><unientity>6EDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 53"><unientity>7001</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 5C"><unientity>6F44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 6B"><unientity>6F82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 48 6E"><unientity>E9F5</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="2D 48 74"><unientity>6F5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 3A"><unientity>702C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 47"><unientity>7AC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 54"><unientity>70F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 56"><unientity>70B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 6B"><unientity>70DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 49 71"><unientity>70A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 26"><unientity>713C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 28"><unientity>8B8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 34"><unientity>718F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 3B"><unientity>4E89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 45"><unientity>5C12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 46"><unientity>58BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 58"><unientity>7F9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 5B"><unientity>7282</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4A 60"><unientity>6C02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 22"><unientity>736A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 35"><unientity>73C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 3F"><unientity>73CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 43"><unientity>746F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 45"><unientity>6BEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 5B"><unientity>78AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 71"><unientity>7F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4B 72"><unientity>7506</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 2C"><unientity>583A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 2D"><unientity>756E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 35"><unientity>7567</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 3C"><unientity>53E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 3E"><unientity>758E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 5D"><unientity>7661</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4C 7E"><unientity>4F70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 21"><unientity>7681</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 34"><unientity>76C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 38"><unientity>76D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 4F"><unientity>771F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 5F"><unientity>7741</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 65"><unientity>53E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 6D"><unientity>7792</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4D 71"><unientity>7719</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4E 24"><unientity>6998</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4E 33"><unientity>78AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4E 5B"><unientity>945B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4E 79"><unientity>5FA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 29"><unientity>9F9D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 37"><unientity>7980</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 3E"><unientity>7A3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 41"><unientity>4E69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 45"><unientity>9834</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 48"><unientity>7A42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 5E"><unientity>7AB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 6B"><unientity>7AF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 4F 7C"><unientity>7B5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 50 2B"><unientity>693E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 50 2D"><unientity>7B5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 50 36"><unientity>84D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 50 4F"><unientity>7C58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 50 6F"><unientity>7CFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 24"><unientity>5E0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 29"><unientity>7D25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 4A"><unientity>6DD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 4D"><unientity>7D2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 6A"><unientity>7DB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 79"><unientity>7E62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 51 7D"><unientity>7D99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 28"><unientity>9262</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 2B"><unientity>9475</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 32"><unientity>8FA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 33"><unientity>7F78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 38"><unientity>898A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 40"><unientity>7FA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 41"><unientity>7FA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 4A"><unientity>7FC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 59"><unientity>98DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 5D"><unientity>6537</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 65"><unientity>79D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 67"><unientity>79CF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 6B"><unientity>7085</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 6C"><unientity>8EAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 52 7B"><unientity>8074</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 21"><unientity>7C9B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 23"><unientity>5B8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 2C"><unientity>6BD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 40"><unientity>812C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 44"><unientity>8107</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 4B"><unientity>80F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 5E"><unientity>8193</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 61"><unientity>811A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 53 7E"><unientity>81C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 21"><unientity>9AD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 24"><unientity>5367</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 34"><unientity>64E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 40"><unientity>6841</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 46"><unientity>8229</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 47"><unientity>824A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 61"><unientity>8306</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 68"><unientity>6959</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 6F"><unientity>83C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 54 76"><unientity>8318</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 29"><unientity>E97A</unientity><unientityalt>830E</unientityalt><desc>Variant of 275529 which maps to 830E</desc></character>
+<character hex="2D 55 2D"><unientity>8358</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 2E"><unientity>E97B</unientity><unientityalt>8393</unientityalt><desc>Variant of 21552E which maps to 8393</desc></character>
+<character hex="2D 55 47"><unientity>837D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 50"><unientity>585F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 54"><unientity>855A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 5A"><unientity>8386</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 5B"><unientity>8385</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 61"><unientity>76D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 55 73"><unientity>83D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 2E"><unientity>8024</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 35"><unientity>846F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 3C"><unientity>8613</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 3F"><unientity>6A97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 64"><unientity>9F04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 75"><unientity>9F05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 56 7B"><unientity>8717</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 2B"><unientity>8797</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 2D"><unientity>8748</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 30"><unientity>87C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 3B"><unientity>60F7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 49"><unientity>885E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 58"><unientity>890E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 5B"><unientity>886E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 60"><unientity>5E2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 63"><unientity>88E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 57 73"><unientity>7D5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 58 31"><unientity>89A7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 58 33"><unientity>752A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 58 36"><unientity>89E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 58 4D"><unientity>548F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 58 56"><unientity>612C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 27"><unientity>8ACC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 2C"><unientity>8B01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 3D"><unientity>8AE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 41"><unientity>5629</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 4C"><unientity>8B72</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 4F"><unientity>8B83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 57"><unientity>7AEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 59"><unientity>8277</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 5F"><unientity>732A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 60"><unientity>72B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 63"><unientity>8C98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 59 65"><unientity>72F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 34"><unientity>8CAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 3D"><unientity>8CDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 48"><unientity>8D71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 4E"><unientity>8D82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 5F"><unientity>8E5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 63"><unientity>8DE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5A 7E"><unientity>8E7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 2F"><unientity>8EB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 42"><unientity>8F19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 43"><unientity>8EFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 5D"><unientity>8FA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 5E"><unientity>8FA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 69"><unientity>5EF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5B 7A"><unientity>8FEF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 2F"><unientity>8FE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 3F"><unientity>5FA7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 40"><unientity>5FA8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 48"><unientity>9013</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 5A"><unientity>8FE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 5B"><unientity>9089</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5C 74"><unientity>96A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5D 23"><unientity>9167</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5D 2F"><unientity>9196</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5D 56"><unientity>920E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5D 65"><unientity>8216</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5D 68"><unientity>8021</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 21"><unientity>9418</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 24"><unientity>7145</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 26"><unientity>7194</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 28"><unientity>93C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 3B"><unientity>92B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 43"><unientity>92F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 4A"><unientity>945A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 50"><unientity>9587</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5E 61"><unientity>6FF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 28"><unientity>9665</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 2C"><unientity>5826</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 2D"><unientity>964F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 2E"><unientity>661C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 35"><unientity>78D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 3B"><unientity>96A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 43"><unientity>9CEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 46"><unientity>96BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 4B"><unientity>96D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 4C"><unientity>9DC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 63"><unientity>873A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 5F 73"><unientity>E9D2</unientity><unientityalt>975A</unientityalt><desc>Unrelated variant of EACC 234C76 which maps to 975A</desc></character>
+<character hex="2D 60 21"><unientity>978C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 60 2D"><unientity>976D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 60 30"><unientity>97EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 60 56"><unientity>980B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 60 78"><unientity>9920</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 60 79"><unientity>8218</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 32"><unientity>99EE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 34"><unientity>99DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 47"><unientity>99C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 59"><unientity>9AC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 5A"><unientity>8EC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 62"><unientity>9A0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 61 6A"><unientity>6B1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 22"><unientity>9C0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 29"><unientity>9C53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 2C"><unientity>9F08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 35"><unientity>9D76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 41"><unientity>9D5E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 51"><unientity>5869</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 52"><unientity>78B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 5F"><unientity>83FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 60"><unientity>5E85</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 62"><unientity>9EC4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 75"><unientity>76B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 62 7E"><unientity>658B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 63 2B"><unientity>5C28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 63 2D"><unientity>4E80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 6B 33"><unientity>E9F6</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="2D 6B 5F"><unientity>5273</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 6F 7D"><unientity>8123</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 71 43"><unientity>55E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 71 64"><unientity>E97C</unientity><unientityalt>55D4</unientityalt><desc>Variant of 217164 which maps to 55D4</desc></character>
+<character hex="2D 73 45"><unientity>56D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 75 3A"><unientity>9654</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 75 52"><unientity>579B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 7A 44"><unientity>598D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2D 7E 6A"><unientity>51A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 25 7B"><unientity>5D1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 28 4C"><unientity>5ECF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 29 68"><unientity>5F51</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 2B 5B"><unientity>605A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 2B 74"><unientity>609B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 2D 79"><unientity>6128</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 2F 7A"><unientity>6738</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 2F 7C"><unientity>634D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 30 28"><unientity>640B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 31 3A"><unientity>6332</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 31 44"><unientity>651F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 31 72"><unientity>5261</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 33 28"><unientity>6528</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 33 7B"><unientity>630E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 36 3F"><unientity>52C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 36 45"><unientity>69E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 36 54"><unientity>657F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 37 29"><unientity>65B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 38 70"><unientity>714A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 39 36"><unientity>66CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3A 26"><unientity>661D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3A 33"><unientity>80AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3B 22"><unientity>690F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3D 62"><unientity>684A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3D 73"><unientity>7A1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3E 3F"><unientity>7BA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 3F 2D"><unientity>69B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 40 3D"><unientity>6AC1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 41 74"><unientity>6AA9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 46 70"><unientity>6CD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 47 31"><unientity>6C73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 47 39"><unientity>E97D</unientity><unientityalt>6C67</unientityalt><desc>Variant of 224739 which maps to 6C67</desc></character>
+<character hex="2E 47 47"><unientity>6D64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 48 73"><unientity>6FA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 49 2F"><unientity>6CD9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 49 3B"><unientity>6E7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4A 6B"><unientity>6EA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4C 35"><unientity>6DE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4C 7B"><unientity>6E86</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4D 3D"><unientity>6D38</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4E 41"><unientity>7032</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4E 56"><unientity>9800</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4E 5D"><unientity>6DE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 4E 72"><unientity>6F74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 50 6D"><unientity>70B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 52 5D"><unientity>715B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 54 52"><unientity>71FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 5A 40"><unientity>73B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 5A 78"><unientity>74A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 5F 6F"><unientity>75B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 60 4A"><unientity>7690</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 60 60"><unientity>76A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 62 4F"><unientity>772D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 62 5F"><unientity>77C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 68 4E"><unientity>8020</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 68 6F"><unientity>7A19</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6B 54"><unientity>7B04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6C 26"><unientity>7BE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6C 27"><unientity>7B2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6C 3E"><unientity>7B59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6C 46"><unientity>7BE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6F 35"><unientity>6CD4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 6F 43"><unientity>9908</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 70 62"><unientity>7D4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 71 5A"><unientity>7E27</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 71 7C"><unientity>7D63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 73 28"><unientity>5FAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 73 5D"><unientity>7D56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 73 74"><unientity>7E89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 74 2E"><unientity>7516</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 74 31"><unientity>7F48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 74 50"><unientity>7F82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 74 51"><unientity>7F58</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 76 5F"><unientity>8037</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 7C 2E"><unientity>831C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2E 7D 24"><unientity>83F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 25 2D"><unientity>6A22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 25 2E"><unientity>8507</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 2A 5A"><unientity>E9D3</unientity><unientityalt>868B</unientityalt><desc>Unrelated variant of EACC 23293D which maps to 868B</desc></character>
+<character hex="2F 2A 64"><unientity>87B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 2A 73"><unientity>87CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 2D 79"><unientity>88B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 2F 5D"><unientity>7E48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 31 2B"><unientity>89BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 31 43"><unientity>E9D4</unientity><unientityalt>89F5</unientityalt><desc>Unrelated variant of EACC 23315E which maps to 89F5</desc></character>
+<character hex="2F 31 7D"><unientity>8A7E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 33 63"><unientity>8B1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 36 39"><unientity>8C7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 38 33"><unientity>8D91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 38 6F"><unientity>8DD7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 3A 5E"><unientity>8E6E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 3B 63"><unientity>E9F7</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="2F 3C 2D"><unientity>8F3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 3D 5D"><unientity>900E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 40 53"><unientity>914F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 42 31"><unientity>E9D5</unientity><unientityalt>8019</unientityalt><desc>Unrelated variant of EACC 215266 which maps to 8019</desc></character>
+<character hex="2F 44 5F"><unientity>941A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 4A 2E"><unientity>90B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 4A 4A"><unientity>5F8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 51 58"><unientity>7CC7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 54 76"><unientity>9AE1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 57 5F"><unientity>9ABE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 58 5C"><unientity>E9D6</unientity><unientityalt>9C51</unientityalt><desc>Unrelated variant of EACC 235945 which maps to 9C51</desc></character>
+<character hex="2F 58 70"><unientity>9C1B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 59 73"><unientity>9CEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5A 48"><unientity>9D44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5D 3C"><unientity>6EF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5D 49"><unientity>9EA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5D 5C"><unientity>730A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5E 42"><unientity>9EC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5E 66"><unientity>9B12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5E 7D"><unientity>6641</unientity><desc>East Asian ideograph</desc></character>
+<character hex="2F 5F 45"><unientity>86A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 21"><unientity>58F9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 3A"><unientity>8FFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 4C"><unientity>4E79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 51"><unientity>8CB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 60"><unientity>4EAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 66"><unientity>5FC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 6C"><unientity>8B90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 30 78"><unientity>5F77</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 31 4C"><unientity>5FA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 32 40"><unientity>4FFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 32 51"><unientity>5FBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 32 5D"><unientity>4FA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 32 7A"><unientity>5150</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 23"><unientity>4E21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 2A"><unientity>4E93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 30"><unientity>518A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 3C"><unientity>6C37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 44"><unientity>51DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 4E"><unientity>51FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 77"><unientity>5270</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 33 7B"><unientity>52E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 34 21"><unientity>91FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 34 23"><unientity>5264</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 34 28"><unientity>523C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 34 75"><unientity>9628</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 34 7D"><unientity>53C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 29"><unientity>53DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 4E"><unientity>608B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 56"><unientity>9A03</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 5C"><unientity>5449</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 64"><unientity>5415</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 35 73"><unientity>8656</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 36 23"><unientity>9F69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 36 2A"><unientity>9B28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 36 42"><unientity>8A92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 36 5A"><unientity>5405</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 37 68"><unientity>8FF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 38 6E"><unientity>576F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 39 2F"><unientity>9029</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 39 44"><unientity>5B2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 39 63"><unientity>59C9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3C 21"><unientity>7895</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3C 52"><unientity>8CEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 28"><unientity>53A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 2A"><unientity>5E83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 2F"><unientity>5E81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 42"><unientity>7D43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 48"><unientity>5F3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 4C"><unientity>7030</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 54"><unientity>4EFD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3D 75"><unientity>5FB3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3E 7D"><unientity>7652</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3F 22"><unientity>E97E</unientity><unientityalt>6168</unientityalt><desc>Variant of 213F22 which maps to 6168</desc></character>
+<character hex="33 3F 24"><unientity>7718</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3F 3F"><unientity>51F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3F 55"><unientity>5B3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3F 58"><unientity>61F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 3F 5B"><unientity>6133</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 40 45"><unientity>629B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 40 50"><unientity>62D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 41 31"><unientity>6425</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 41 7E"><unientity>629E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 2A"><unientity>62E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 3D"><unientity>53CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 43"><unientity>52B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 44"><unientity>6559</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 56"><unientity>6B5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 60"><unientity>89D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 42 77"><unientity>65EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 43 2F"><unientity>664B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 43 3E"><unientity>95C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 43 42"><unientity>7156</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 43 57"><unientity>6702</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 43 69"><unientity>5932</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 44 25"><unientity>76C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 44 49"><unientity>6144</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 45 27"><unientity>6918</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 45 50"><unientity>7F47</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 45 6D"><unientity>826A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 46 21"><unientity>8B99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 46 33"><unientity>E97F</unientity><unientityalt>6B8B</unientityalt><desc>Variant of 274633 which maps to 6B8B</desc></character>
+<character hex="33 46 3C"><unientity>6BBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 46 65"><unientity>6C61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 46 74"><unientity>76C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 46 7A"><unientity>6CA1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 29"><unientity>6E2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 30"><unientity>6E5F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 40"><unientity>6D1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 4A"><unientity>6D1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 55"><unientity>6FEC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 5E"><unientity>6FB9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 5F"><unientity>60BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 6F"><unientity>6D44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 70"><unientity>5A6C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 47 7B"><unientity>904A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 48 3B"><unientity>6CDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 48 5E"><unientity>67D2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 49 2E"><unientity>6F81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 49 4A"><unientity>70D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 49 68"><unientity>7133</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 49 6A"><unientity>934A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4A 28"><unientity>91BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4A 58"><unientity>89DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4C 2C"><unientity>754D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4C 36"><unientity>E980</unientity><unientityalt>753B</unientityalt><desc>Variant of 274C36 which maps to 753B</desc></character>
+<character hex="33 4C 37"><unientity>8E6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4C 3E"><unientity>8E08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4C 7B"><unientity>767A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4E 37"><unientity>784E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4E 73"><unientity>79A5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4F 37"><unientity>5EE9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4F 3A"><unientity>7A49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4F 59"><unientity>7A93</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4F 5E"><unientity>7A91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 4F 71"><unientity>54B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 50 2A"><unientity>9257</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 50 2B"><unientity>724B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 50 65"><unientity>7A45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 2E"><unientity>7E8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 3C"><unientity>7D4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 47"><unientity>7EEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 4C"><unientity>7DD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 5C"><unientity>7DAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 6B"><unientity>7DD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 6D"><unientity>6374</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 51 72"><unientity>7D89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 23"><unientity>7E8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 28"><unientity>94B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 30"><unientity>E981</unientity><unientityalt>7F6E</unientityalt><desc>Variant of 215230 which maps to 7F6E</desc></character>
+<character hex="33 52 34"><unientity>99E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 38"><unientity>8989</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 3F"><unientity>8B71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 59"><unientity>7E59</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 5B"><unientity>71FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 52 76"><unientity>8061</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 53 33"><unientity>80BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 53 47"><unientity>81D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 53 7D"><unientity>9AD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 54 45"><unientity>67C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 54 46"><unientity>8221</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 54 61"><unientity>6CD6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 55 61"><unientity>8462</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 55 68"><unientity>8406</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 55 77"><unientity>8602</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 56 35"><unientity>85AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 56 52"><unientity>87C1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 56 7C"><unientity>8671</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 57 2E"><unientity>880E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 57 38"><unientity>880F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 57 60"><unientity>88E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 57 72"><unientity>8943</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 57 73"><unientity>88B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 58 21"><unientity>97C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 58 30"><unientity>658D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 58 34"><unientity>89E7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 59 41"><unientity>54D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 59 58"><unientity>8C4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5A 7B"><unientity>8E28</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5B 70"><unientity>5EF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5D 23"><unientity>8A76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5D 3B"><unientity>57DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5E 21"><unientity>9221</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5E 2F"><unientity>5257</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5E 3D"><unientity>9244</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5E 42"><unientity>9452</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5F 34"><unientity>90C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5F 3D"><unientity>96B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5F 43"><unientity>9D08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5F 49"><unientity>9D70</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 5F 73"><unientity>9759</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 60 54"><unientity>985B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 60 58"><unientity>9855</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 60 62"><unientity>98C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 61 5A"><unientity>8EB0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 61 62"><unientity>9A23</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 61 79"><unientity>9C7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 62 5E"><unientity>9EAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 62 5F"><unientity>8534</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 62 75"><unientity>76BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 62 7D"><unientity>6589</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 63 21"><unientity>6B6F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 63 2B"><unientity>7ADC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 6B 33"><unientity>524F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 6C 6B"><unientity>6031</unientity><desc>East Asian ideograph</desc></character>
+<character hex="33 73 45"><unientity>9F67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 24 53"><unientity>5CBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 38 75"><unientity>5FDE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 3A 5B"><unientity>572C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 3E 38"><unientity>7BDA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 41 38"><unientity>8022</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 41 77"><unientity>8264</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 49 2F"><unientity>6D34</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 51 75"><unientity>7162</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 54 52"><unientity>7118</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 5D 6B"><unientity>756D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 5E 3B"><unientity>80AC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 5E 47"><unientity>75FE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 61 26"><unientity>6900</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 66 22"><unientity>589D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 68 2A"><unientity>7C7C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 71 5A"><unientity>7E1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 74 31"><unientity>58DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 78 2A"><unientity>90C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="34 7D 24"><unientity>83C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 34 4D"><unientity>8B5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 34 7B"><unientity>8B2D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 41 56"><unientity>91BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 50 53"><unientity>98C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 57 39"><unientity>9C76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 5D 5C"><unientity>8C8E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="35 5E 76"><unientity>82BE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 2D"><unientity>534B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 3A"><unientity>5EFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 4C"><unientity>4E81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 52"><unientity>65BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 54"><unientity>4F0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 30 78"><unientity>9AE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 32 46"><unientity>4F1D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 34 28"><unientity>5227</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 34 39"><unientity>61C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 34 5B"><unientity>965E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 34 60"><unientity>604A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 35 73"><unientity>5611</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 35 77"><unientity>9FA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 36 5A"><unientity>8AE0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 36 5E"><unientity>559E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 37 70"><unientity>56F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 39 44"><unientity>59B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3B 39"><unientity>5BF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3B 6E"><unientity>5C97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3B 78"><unientity>E922</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="39 3C 52"><unientity>8D26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3D 6F"><unientity>8907</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3E 47"><unientity>8CC9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3E 4C"><unientity>6142</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3E 61"><unientity>60AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 3E 7D"><unientity>7609</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 40 22"><unientity>6443</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 40 42"><unientity>646D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 41 7C"><unientity>62E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 42 43"><unientity>4FF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 42 4F"><unientity>5554</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 43 30"><unientity>6644</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 44 44"><unientity>8988</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 44 7D"><unientity>6AC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 45 6D"><unientity>826B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 46 34"><unientity>E982</unientity><unientityalt>6B96</unientityalt><desc>Variant of 214634 which maps to 6B96</desc></character>
+<character hex="39 47 35"><unientity>6C3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 47 6F"><unientity>51C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 48 3B"><unientity>9061</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 49 28"><unientity>6D5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 49 44"><unientity>6B12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 49 56"><unientity>792E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 4A 60"><unientity>9AE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 4C 2D"><unientity>7546</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 50 50"><unientity>7BED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 50 5B"><unientity>9B3B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 50 63"><unientity>9939</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 51 79"><unientity>7D75</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 52 30"><unientity>5BD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 52 5B"><unientity>66DC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 52 6B"><unientity>7094</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 54 77"><unientity>85A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 55 3C"><unientity>5D0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 55 64"><unientity>6726</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 55 68"><unientity>83DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 55 77"><unientity>854B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 56 3C"><unientity>56CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 56 43"><unientity>4E55</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 56 52"><unientity>87A1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 57 73"><unientity>7DAF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 58 21"><unientity>97E4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 58 29"><unientity>69FB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 59 3F"><unientity>8A3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5A 2F"><unientity>58F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5A 36"><unientity>983C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5D 23"><unientity>91BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5E 2F"><unientity>5277</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5E 3D"><unientity>9295</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5E 42"><unientity>9274</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5E 6F"><unientity>7A7D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5E 71"><unientity>5742</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5F 49"><unientity>5F6B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 5F 68"><unientity>8987</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 60 74"><unientity>55B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 61 67"><unientity>9B2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 61 79"><unientity>5C20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 62 23"><unientity>E983</unientity><unientityalt>9BFD</unientityalt><desc>Variant of 216223 which maps to 9BFD</desc></character>
+<character hex="39 6B 2F"><unientity>521F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="39 6B 33"><unientity>E9F8</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="39 6C 6B"><unientity>60A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 28 4C"><unientity>E984</unientity><unientityalt>53A9</unientityalt><desc>Variant of 4C284C which maps to 53A9</desc></character>
+<character hex="3A 2F 7C"><unientity>64C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 3B 7D"><unientity>67B1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 40 34"><unientity>6855</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 6A 7C"><unientity>7BEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 78 7D"><unientity>80FC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3A 79 70"><unientity>81D5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3B 2D 44"><unientity>8842</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3B 39 22"><unientity>8DB5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 30 4C"><unientity>5E79</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 30 78"><unientity>5023</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 34 7D"><unientity>84E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 35 73"><unientity>8B3C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 3D 6F"><unientity>8986</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 3E 47"><unientity>5379</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 3F 24"><unientity>614E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 40 4F"><unientity>638A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 42 4F"><unientity>E985</unientity><unientityalt>542F</unientityalt><desc>Variant of 27424F which maps to 542F</desc></character>
+<character hex="3F 44 72"><unientity>7881</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 45 6D"><unientity>8263</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 46 21"><unientity>9A69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 46 29"><unientity>4E97</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 46 2B"><unientity>5E30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 47 6F"><unientity>51C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 49 26"><unientity>6E08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 49 56"><unientity>7832</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 4A 28"><unientity>9DF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 4A 60"><unientity>7266</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 4C 3C"><unientity>7582</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 51 6D"><unientity>6403</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 55 64"><unientity>61DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 56 31"><unientity>517F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 59 59"><unientity>8276</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 5E 60"><unientity>9586</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 5F 34"><unientity>E9F9</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="3F 5F 35"><unientity>6B9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 5F 49"><unientity>7431</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 61 4C"><unientity>99C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="3F 61 79"><unientity>5C1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 30 4C"><unientity>69A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 30 51"><unientity>8D30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 33 36"><unientity>5B82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 34 21"><unientity>5271</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 36 66"><unientity>5AD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 37 55"><unientity>56AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 37 68"><unientity>5EFB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 3D 53"><unientity>5F66</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 3F 6D"><unientity>52E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 41 46"><unientity>63DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 45 6D"><unientity>6A10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 46 2B"><unientity>7688</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 46 5B"><unientity>6C2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 47 38"><unientity>6CFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 47 74"><unientity>6E15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 4B 7A"><unientity>7523</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 4C 3C"><unientity>7589</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 4E 43"><unientity>E986</unientity><unientityalt>788C</unientityalt><desc>Variant of 214E43 which maps to 788C</desc></character>
+<character hex="45 4E 75"><unientity>7984</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 4F 45"><unientity>9896</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 51 22"><unientity>7D0D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 51 64"><unientity>53BF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 56 4B"><unientity>E987</unientity><unientityalt>865E</unientityalt><desc>Variant of 21564B which maps to 865E</desc></character>
+<character hex="45 57 46"><unientity>672F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 58 37"><unientity>8BA0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 58 47"><unientity>E988</unientity><unientityalt>8A25</unientityalt><desc>Variant of 215847 which maps to 8A25</desc></character>
+<character hex="45 5D 3E"><unientity>9485</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 5E 21"><unientity>953A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 60 36"><unientity>97FF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 60 4E"><unientity>984F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 60 64"><unientity>9963</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 60 6B"><unientity>98F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 60 76"><unientity>9980</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 62 60"><unientity>5E7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="45 63 24"><unientity>9F61</unientity><desc>East Asian ideograph</desc></character>
+<character hex="46 28 4C"><unientity>5ED0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="46 60 74"><unientity>76B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 2C 4D"><unientity>E989</unientity><unientityalt>8801</unientityalt><desc>Variant of 232C4D which maps to 8801</desc></character>
+<character hex="47 34 22"><unientity>8C2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 34 7B"><unientity>8C2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 35 39"><unientity>8B9E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 36 6F"><unientity>8D4D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 42 36"><unientity>949A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 42 70"><unientity>94BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 49 31"><unientity>95F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 4E 5C"><unientity>E98A</unientity><unientityalt>97DE</unientityalt><desc>Variant of 234E5C which maps to 97DE</desc></character>
+<character hex="47 52 22"><unientity>9957</unientity><desc>East Asian ideograph</desc></character>
+<character hex="47 57 7A"><unientity>E98B</unientity><unientityalt>9BD6</unientityalt><desc>Variant of 23577A which maps to 9BD6</desc></character>
+<character hex="47 59 4E"><unientity>9C3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 21"><unientity>58F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 50"><unientity>4E8A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 51"><unientity>5F10</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 52"><unientity>6275</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 57"><unientity>4E99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 6C"><unientity>96E0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 30 6E"><unientity>E98C</unientity><unientityalt>4EE4</unientityalt><desc>Variant of 21306E which maps to 4EE4</desc></character>
+<character hex="4B 30 72"><unientity>4EED</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 31 2D"><unientity>4F2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 31 30"><unientity>4FAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 31 44"><unientity>E98D</unientity><unientityalt>4F36</unientityalt><desc>Variant of 213144 which maps to 4F36</desc></character>
+<character hex="4B 31 4C"><unientity>5F95</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 31 6A"><unientity>723C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 31 78"><unientity>E98E</unientity><unientityalt>5029</unientityalt><desc>Variant of 213178 which maps to 5029</desc></character>
+<character hex="4B 31 7C"><unientity>5024</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 32 31"><unientity>4EEE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 32 48"><unientity>E9FA</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="4B 32 4E"><unientity>E98F</unientity><unientityalt>50E7</unientityalt><desc>Variant of 21324E which maps to 50E7</desc></character>
+<character hex="4B 32 5F"><unientity>50BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 21"><unientity>5185</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 22"><unientity>E990</unientity><unientityalt>5168</unientityalt><desc>Variant of 213322 which maps to 5168</desc></character>
+<character hex="4B 33 24"><unientity>E991</unientity><unientityalt>634C</unientityalt><desc>Variant of 2D3324 which maps to 634C</desc></character>
+<character hex="4B 33 3E"><unientity>F92E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 51"><unientity>5204</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 54"><unientity>82C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 55"><unientity>520B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 33 5B"><unientity>522B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 34 21"><unientity>5263</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 34 35"><unientity>52B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 34 36"><unientity>52F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 34 6B"><unientity>5DF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 34 74"><unientity>E992</unientity><unientityalt>537F</unientityalt><desc>Variant of 213474 which maps to 537F</desc></character>
+<character hex="4B 35 6A"><unientity>55EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 35 7B"><unientity>54CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 36 22"><unientity>8C18</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 36 42"><unientity>8BF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 36 66"><unientity>5A1A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 36 68"><unientity>5358</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 2C"><unientity>5606</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 2F"><unientity>5C1C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 49"><unientity>E993</unientity><unientityalt>5668</unientityalt><desc>Variant of 213749 which maps to 5668</desc></character>
+<character hex="4B 37 4C"><unientity>5662</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 58"><unientity>E994</unientity><unientityalt>56A5</unientityalt><desc>Variant of 213758 which maps to 56A5</desc></character>
+<character hex="4B 37 5A"><unientity>53B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 68"><unientity>56D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 6F"><unientity>56FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 72"><unientity>5186</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 73"><unientity>56E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 37 74"><unientity>56F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 2E"><unientity>57C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 50"><unientity>E995</unientity><unientityalt>586B</unientityalt><desc>Variant of 213850 which maps to 586B</desc></character>
+<character hex="4B 38 53"><unientity>E9FB</unientity><desc>East Asian ideograph not in Unicode</desc></character>
+<character hex="4B 38 5E"><unientity>5897</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 64"><unientity>58C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 69"><unientity>5727</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 6C"><unientity>5841</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 70"><unientity>58CC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 71"><unientity>57BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 38 7D"><unientity>591B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 38"><unientity>5942</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 3A"><unientity>5F09</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 3E"><unientity>5965</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 3F"><unientity>5333</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 74"><unientity>5B22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 39 7B"><unientity>5A2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3A 2F"><unientity>805F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3A 47"><unientity>88CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3A 49"><unientity>5B37</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 22"><unientity>51A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 31"><unientity>5B9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 37"><unientity>51A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 43"><unientity>5BFE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 52"><unientity>8132</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 61"><unientity>5C64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 67"><unientity>6B67</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 79"><unientity>5D8C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3B 7E"><unientity>5D15</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 21"><unientity>5D5C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 23"><unientity>5CE5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 2F"><unientity>5DBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 32"><unientity>5DD3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 33"><unientity>5DCC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 38"><unientity>949C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 53"><unientity>5E2F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3C 5E"><unientity>5E64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 24"><unientity>53A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 27"><unientity>5EC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 2A"><unientity>5EE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 2C"><unientity>53B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 2F"><unientity>5EF0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 4B"><unientity>5F3E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 4C"><unientity>E996</unientity><unientityalt>5F25</unientityalt><desc>Variant of 273D4C which maps to 5F25</desc></character>
+<character hex="4B 3D 5C"><unientity>5F83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3D 67"><unientity>E997</unientity><unientityalt>5F84</unientityalt><desc>Variant of 273D67 which maps to 5F84</desc></character>
+<character hex="4B 3E 2A"><unientity>6035</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3E 40"><unientity>6046</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3E 5B"><unientity>60C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3E 7E"><unientity>60A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3F 40"><unientity>E998</unientity><unientityalt>618E</unientityalt><desc>Variant of 213F40 which maps to 618E</desc></character>
+<character hex="4B 3F 4A"><unientity>5FDC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3F 4B"><unientity>E999</unientity><unientityalt>601C</unientityalt><desc>Variant of 273F4B which maps to 601C</desc></character>
+<character hex="4B 3F 50"><unientity>E99A</unientity><unientityalt>61CA</unientityalt><desc>Variant of 213F50 which maps to 61CA</desc></character>
+<character hex="4B 3F 51"><unientity>61D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3F 53"><unientity>61F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 3F 74"><unientity>623B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 40 3D"><unientity>62DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 40 46"><unientity>629C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 40 49"><unientity>62D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 40 53"><unientity>627A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 40 66"><unientity>62F4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 41 2A"><unientity>6323</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 41 35"><unientity>6368</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 41 46"><unientity>6362</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 41 47"><unientity>633F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 42 35"><unientity>6442</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 42 36"><unientity>643A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 42 3A"><unientity>64B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 43 39"><unientity>6674</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 43 47"><unientity>66A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 43 4D"><unientity>663F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 43 52"><unientity>66F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 43 58"><unientity>66FD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 44 2D"><unientity>67A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 44 56"><unientity>6813</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 44 76"><unientity>685F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 34"><unientity>E99B</unientity><unientityalt>6994</unientityalt><desc>Variant of 214534 which maps to 6994</desc></character>
+<character hex="4B 45 37"><unientity>6804</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 44"><unientity>69D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 45"><unientity>6982</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 53"><unientity>6955</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 56"><unientity>6A2A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 59"><unientity>9792</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 61"><unientity>691C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 69"><unientity>6A71</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 6C"><unientity>E99C</unientity><unientityalt>6ADB</unientityalt><desc>Variant of 21456C which maps to 6ADB</desc></character>
+<character hex="4B 45 6D"><unientity>823B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 6F"><unientity>685C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 45 70"><unientity>6A29</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 21"><unientity>6B53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 2A"><unientity>6B74</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 2E"><unientity>6B81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 38"><unientity>6BB1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 55"><unientity>6C17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 5A"><unientity>6C32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 46 76"><unientity>6C89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 47 41"><unientity>51BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 47 59"><unientity>6D99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 47 61"><unientity>6E05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 47 67"><unientity>E99D</unientity><unientityalt>6DB5</unientityalt><desc>Variant of 214767 which maps to 6DB5</desc></character>
+<character hex="4B 47 6C"><unientity>51C5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 35"><unientity>6DA3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 46"><unientity>78C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 4A"><unientity>6E13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 4B"><unientity>51D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 4C"><unientity>6F91</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 57"><unientity>6F22</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 58"><unientity>6E80</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 5F"><unientity>E99E</unientity><unientityalt>6EDE</unientityalt><desc>Variant of 27485F which maps to 6EDE</desc></character>
+<character hex="4B 48 66"><unientity>6E89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 48 74"><unientity>6FF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 21"><unientity>6CA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 25"><unientity>E99F</unientity><unientityalt>6FB3</unientityalt><desc>Variant of 214925 which maps to 6FB3</desc></character>
+<character hex="4B 49 2B"><unientity>6FEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 2E"><unientity>6E0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 31"><unientity>6E16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 37"><unientity>56A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 40"><unientity>6F45</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 47"><unientity>7AC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 6A"><unientity>932C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 6B"><unientity>83F8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 73"><unientity>7115</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 75"><unientity>6427</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 49 77"><unientity>7188</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 2E"><unientity>55B6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 38"><unientity>71D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 3E"><unientity>7235</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 45"><unientity>5C13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 62"><unientity>72A0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4A 74"><unientity>E9A0</unientity><unientityalt>731C</unientityalt><desc>Variant of 214A74 which maps to 731C</desc></character>
+<character hex="4B 4A 78"><unientity>72F0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4B 2B"><unientity>7363</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4B 2C"><unientity>731F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4B 3E"><unientity>F9AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4B 63"><unientity>749C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4B 71"><unientity>E9A1</unientity><unientityalt>7F3E</unientityalt><desc>Variant of 2D4B71 which maps to 7F3E</desc></character>
+<character hex="4B 4B 77"><unientity>4EC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4C 36"><unientity>7575</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4C 3C"><unientity>7573</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4C 51"><unientity>75CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4C 5B"><unientity>75F3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4C 67"><unientity>E9A2</unientity><unientityalt>761F</unientityalt><desc>Variant of 214C67 which maps to 761F</desc></character>
+<character hex="4B 4C 79"><unientity>7672</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4D 41"><unientity>862F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4D 45"><unientity>E9A3</unientity><unientityalt>76F4</unientityalt><desc>Variant of 214D45 which maps to 76F4</desc></character>
+<character hex="4B 4D 56"><unientity>8846</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4D 59"><unientity>E9A4</unientity><unientityalt>775B</unientityalt><desc>Variant of 214D59 which maps to 775B</desc></character>
+<character hex="4B 4D 73"><unientity>66B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4D 7B"><unientity>E9A5</unientity><unientityalt>77D7</unientityalt><desc>Variant of 214D7B which maps to 77D7</desc></character>
+<character hex="4B 4E 21"><unientity>7B36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 37"><unientity>7814</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 39"><unientity>5CFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 56"><unientity>78FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 5B"><unientity>783F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 67"><unientity>79D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4E 7B"><unientity>E9A6</unientity><unientityalt>7985</unientityalt><desc>Variant of 274E7B which maps to 7985</desc></character>
+<character hex="4B 4F 29"><unientity>7A50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4F 3C"><unientity>E9A7</unientity><unientityalt>79F0</unientityalt><desc>Variant of 274F3C which maps to 79F0</desc></character>
+<character hex="4B 4F 43"><unientity>7A32</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4F 4C"><unientity>7A4F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 4F 7B"><unientity>7B7A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 50 36"><unientity>7C14</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 50 3B"><unientity>7C12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 50 44"><unientity>E9A8</unientity><unientityalt>7C27</unientityalt><desc>Variant of 215044 which maps to 7C27</desc></character>
+<character hex="4B 50 52"><unientity>7C56</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 50 61"><unientity>7CBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 50 6C"><unientity>7CAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 3B"><unientity>7CF8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 54"><unientity>7DF4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 5A"><unientity>7E01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 64"><unientity>770C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 6A"><unientity>7EF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 6D"><unientity>7DCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 6E"><unientity>7E26</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 76"><unientity>7E04</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 79"><unientity>7F0B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 51 7E"><unientity>7E92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 21"><unientity>7D9A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 23"><unientity>7E4A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 27"><unientity>6B20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 2B"><unientity>7F36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 38"><unientity>7F87</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 3E"><unientity>E9A9</unientity><unientityalt>7F9A</unientityalt><desc>Variant of 21523E which maps to 7F9A</desc></character>
+<character hex="4B 52 47"><unientity>7FAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 4E"><unientity>7FCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 5A"><unientity>7FFA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 5B"><unientity>E9AA</unientity><unientityalt>66DC</unientityalt><desc>Variant of 39525B which maps to 66DC</desc></character>
+<character hex="4B 52 5C"><unientity>8002</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 6E"><unientity>E9AB</unientity><unientityalt>8046</unientityalt><desc>Variant of 21526E which maps to 8046</desc></character>
+<character hex="4B 52 77"><unientity>8068</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 52 7C"><unientity>8080</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 53 3B"><unientity>695C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 53 61"><unientity>E923</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="4B 53 65"><unientity>8133</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 53 7D"><unientity>9ACC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 54 22"><unientity>81D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 54 28"><unientity>E9AC</unientity><unientityalt>81ED</unientityalt><desc>Variant of 215428 which maps to 81ED</desc></character>
+<character hex="4B 54 34"><unientity>6319</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 54 37"><unientity>820E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 54 6D"><unientity>E9AD</unientity><unientityalt>82D3</unientityalt><desc>Variant of 21546D which maps to 82D3</desc></character>
+<character hex="4B 55 21"><unientity>8332</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 55 2C"><unientity>8392</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 55 3A"><unientity>E9AE</unientity><unientityalt>83C1</unientityalt><desc>Variant of 21553A which maps to 83C1</desc></character>
+<character hex="4B 55 3F"><unientity>E9AF</unientity><unientityalt>83BD</unientityalt><desc>Variant of 21553F which maps to 83BD</desc></character>
+<character hex="4B 55 42"><unientity>8420</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 55 64"><unientity>77C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 29"><unientity>85CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 2B"><unientity>8535</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 31"><unientity>82B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 32"><unientity>7C54</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 3A"><unientity>E9B0</unientity><unientityalt>82A6</unientityalt><desc>Variant of 27563A which maps to 82A6</desc></character>
+<character hex="4B 56 3F"><unientity>6A98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 47"><unientity>51E6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 56 6A"><unientity>E9B1</unientity><unientityalt>8708</unientityalt><desc>Variant of 21566A which maps to 8708</desc></character>
+<character hex="4B 56 71"><unientity>E9B2</unientity><unientityalt>873B</unientityalt><desc>Variant of 215671 which maps to 873B</desc></character>
+<character hex="4B 57 24"><unientity>86CD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 36"><unientity>877F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 40"><unientity>8827</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 46"><unientity>8853</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 6C"><unientity>523E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 6F"><unientity>E9B3</unientity><unientityalt>8910</unientityalt><desc>Variant of 21576F which maps to 8910</desc></character>
+<character hex="4B 57 73"><unientity>7ED4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 57 7E"><unientity>7E7F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 24"><unientity>897E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 26"><unientity>E9B4</unientity><unientityalt>8983</unientityalt><desc>Variant of 215826 which maps to 8983</desc></character>
+<character hex="4B 58 30"><unientity>899A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 32"><unientity>89B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 61"><unientity>4F89</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 71"><unientity>8AA4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 58 7A"><unientity>8ACB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 36"><unientity>8B20</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 46"><unientity>8A33</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 4A"><unientity>8AAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 4B"><unientity>5909</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 59"><unientity>8273</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 63"><unientity>734F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 64"><unientity>72E2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 59 73"><unientity>8D2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5A 23"><unientity>621D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5A 31"><unientity>8CCE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5A 3B"><unientity>8D08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5A 68"><unientity>E9B5</unientity><unientityalt>8DF5</unientityalt><desc>Variant of 275A68 which maps to 8DF5</desc></character>
+<character hex="4B 5A 7E"><unientity>5C69</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 29"><unientity>8E8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 46"><unientity>8F0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 52"><unientity>8F42</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 55"><unientity>8EE2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 58"><unientity>8EE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5B 5E"><unientity>5F01</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 32"><unientity>9038</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 39"><unientity>9039</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 47"><unientity>9059</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 50"><unientity>9045</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 54"><unientity>E924</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="4B 5C 5B"><unientity>8FBA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 5E"><unientity>961D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5C 72"><unientity>E9B6</unientity><unientityalt>9119</unientityalt><desc>Variant of 215C72 which maps to 9119</desc></character>
+<character hex="4B 5C 77"><unientity>9139</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 2B"><unientity>9162</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 34"><unientity>91B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 36"><unientity>91C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 38"><unientity>91C8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 42"><unientity>91E1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 58"><unientity>9234</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 65"><unientity>8217</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5D 70"><unientity>92AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 27"><unientity>93AD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 3D"><unientity>9421</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 3F"><unientity>922C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 5D"><unientity>95D4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 69"><unientity>95A2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5E 6C"><unientity>E925</unientity><desc>Duplicate simplified ideograph</desc></character>
+<character hex="4B 5F 30"><unientity>E9B7</unientity><unientityalt>9686</unientityalt><desc>Variant of 215F30 which maps to 9686</desc></character>
+<character hex="4B 5F 35"><unientity>6B92</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 3A"><unientity>967A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 49"><unientity>51CB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 4C"><unientity>9D8F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 50"><unientity>96E3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 58"><unientity>F9B2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 62"><unientity>7668</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 6F"><unientity>970A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 70"><unientity>9752</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 71"><unientity>9756</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 72"><unientity>975B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 5F 73"><unientity>E9B8</unientity><unientityalt>975C</unientityalt><desc>Variant of 215F73 which maps to 975C</desc></character>
+<character hex="4B 60 2D"><unientity>9771</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 60 44"><unientity>9818</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 60 48"><unientity>981A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 60 53"><unientity>985E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 60 6F"><unientity>991D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 22"><unientity>994B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 30"><unientity>99C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 3F"><unientity>9A08</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 45"><unientity>9A12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 47"><unientity>99C6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 4D"><unientity>9A13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 59"><unientity>81B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 5F"><unientity>9AEA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 67"><unientity>95D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 61 68"><unientity>9599</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 3B"><unientity>9D12</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 47"><unientity>9D2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 4F"><unientity>9D49</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 58"><unientity>68BA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 5C"><unientity>E9B9</unientity><unientityalt>9EB8</unientityalt><desc>Variant of 27625C which maps to 9EB8</desc></character>
+<character hex="4B 62 60"><unientity>9EBD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 66"><unientity>9ED2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 68"><unientity>9ED9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 62 78"><unientity>9F21</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 63 24"><unientity>9F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 64 55"><unientity>4EB6</unientity><desc>East Asian ideography</desc></character>
+<character hex="4B 66 37"><unientity>4FE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 68 2E"><unientity>4EC2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 6A 22"><unientity>7F83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 6A 26"><unientity>6C8D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 74 21"><unientity>F9A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 75 77"><unientity>57D3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 76 3D"><unientity>E9BA</unientity><unientityalt>57F4</unientityalt><desc>Variant of 21763D which maps to 57F4</desc></character>
+<character hex="4B 78 74"><unientity>590A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 79 54"><unientity>5968</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4B 7E 6A"><unientity>E9BB</unientity><unientityalt>5BC3</unientityalt><desc>Variant of 217E6A which maps to 5BC3</desc></character>
+<character hex="4C 23 30"><unientity>5C53</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 23 3F"><unientity>5C76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 25 32"><unientity>5D5B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 25 39"><unientity>5D73</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 28 4C"><unientity>53A9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 28 67"><unientity>5EDB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 29 62"><unientity>E9BC</unientity><unientityalt>5F4D</unientityalt><desc>Variant of 222962 which maps to 5F4D</desc></character>
+<character hex="4C 2F 61"><unientity>622C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 34 74"><unientity>631D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 35 4A"><unientity>64B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 37 44"><unientity>65D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3A 33"><unientity>E9BD</unientity><unientityalt>80AD</unientityalt><desc>Variant of 2E3A33 which maps to 80AD</desc></character>
+<character hex="4C 3A 55"><unientity>6741</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3A 5B"><unientity>6859</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3B 22"><unientity>6860</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3B 31"><unientity>6798</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3B 60"><unientity>6764</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3F 68"><unientity>69C7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 3F 7A"><unientity>6922</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 41 46"><unientity>8538</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 41 77"><unientity>8223</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 43 33"><unientity>6AAA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 43 39"><unientity>69DE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 43 3F"><unientity>6A65</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 43 45"><unientity>67A6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 43 59"><unientity>6B05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 44 46"><unientity>6B4E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 47 6E"><unientity>6CAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4C 35"><unientity>6E0C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4D 3D"><unientity>6F62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4D 63"><unientity>6F99</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4F 24"><unientity>6F46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4F 26"><unientity>6EDD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 4F 2B"><unientity>701E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 51 75"><unientity>8315</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 52 3A"><unientity>717A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 54 47"><unientity>E9BE</unientity><unientityalt>71E0</unientityalt><desc>Variant of 225447 which maps to 71E0</desc></character>
+<character hex="4C 55 41"><unientity>4E2C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 56 38"><unientity>729F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 5C 3A"><unientity>73F1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 5C 61"><unientity>E9BF</unientity><unientityalt>74F4</unientityalt><desc>Variant of 225C61 which maps to 74F4</desc></character>
+<character hex="4C 5F 58"><unientity>7640</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 5F 69"><unientity>75EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 60 22"><unientity>7596</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 60 74"><unientity>76B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 62 66"><unientity>778B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 63 76"><unientity>7839</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 65 64"><unientity>78D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 65 65"><unientity>78B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 67 75"><unientity>E9D7</unientity><unientityalt>7962</unientityalt><desc>Unrelated variant of EACC 293032 which maps to 7962</desc></character>
+<character hex="4C 68 3E"><unientity>79EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 69 5C"><unientity>7A06</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 69 5F"><unientity>7A63</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 6B 62"><unientity>E9C0</unientity><unientityalt>7B4C</unientityalt><desc>Variant of 226B62 which maps to 7B4C</desc></character>
+<character hex="4C 6C 46"><unientity>7B9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 6E 42"><unientity>7C31</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 6F 43"><unientity>7CCD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 6F 7B"><unientity>7CE8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 71 5A"><unientity>7EE6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 72 5D"><unientity>7A39</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 72 65"><unientity>7DFC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 73 28"><unientity>E9C1</unientity><unientityalt>5FAD</unientityalt><desc>Variant of 2E7328 which maps to 5FAD</desc></character>
+<character hex="4C 73 5D"><unientity>7D4B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 79 4E"><unientity>80B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 79 59"><unientity>817D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 79 6B"><unientity>815F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 7C 45"><unientity>82AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 7D 4D"><unientity>8343</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4C 7D 6A"><unientity>8323</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 22 2A"><unientity>83B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 29 25"><unientity>8770</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 29 62"><unientity>E9C2</unientity><unientityalt>86C9</unientityalt><desc>Variant of 232962 which maps to 86C9</desc></character>
+<character hex="4D 2C 3C"><unientity>87E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 2D 75"><unientity>E9C3</unientity><unientityalt>8872</unientityalt><desc>Variant of 232D75 which maps to 8872</desc></character>
+<character hex="4D 2F 5D"><unientity>E9C4</unientity><unientityalt>8941</unientityalt><desc>Variant of 232F5D which maps to 8941</desc></character>
+<character hex="4D 2F 73"><unientity>7E5D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 2F 7A"><unientity>891D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 30 32"><unientity>88AE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 33 59"><unientity>56AF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 33 63"><unientity>8C25</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 38 6F"><unientity>544B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 3C 6C"><unientity>8FB6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 41 34"><unientity>919B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 41 76"><unientity>91DB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 44 5B"><unientity>E9C5</unientity><unientityalt>9306</unientityalt><desc>Variant of 23445B which maps to 9306</desc></character>
+<character hex="4D 44 6B"><unientity>954E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 47 2C"><unientity>952A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 47 54"><unientity>9544</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 47 7B"><unientity>943E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 48 32"><unientity>953F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 48 35"><unientity>954C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 48 62"><unientity>9229</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 4A 6C"><unientity>9667</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 4D 61"><unientity>7EF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 4F 39"><unientity>988C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 50 3A"><unientity>98D1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 50 53"><unientity>98DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 51 54"><unientity>9942</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 55 74"><unientity>9B2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 58 58"><unientity>9BE3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 58 75"><unientity>9CD0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 59 34"><unientity>9CA6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 59 4E"><unientity>9BF5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 59 73"><unientity>51EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5A 6C"><unientity>9D46</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5B 35"><unientity>9DAB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5B 7E"><unientity>9DC6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5C 6B"><unientity>9D50</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5D 49"><unientity>9E81</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5F 70"><unientity>9F44</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 5F 7B"><unientity>97F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="4D 60 47"><unientity>816D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 30 51"><unientity>8CAE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 30 57"><unientity>4E98</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 34 21"><unientity>91D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 35 6A"><unientity>8BC3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 38 4D"><unientity>51C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 3A 47"><unientity>8885</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 3B 52"><unientity>6C3D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 3D 67"><unientity>8FF3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 45 6D"><unientity>822E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 49 6B"><unientity>852B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 4E 5B"><unientity>9271</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 51 3B"><unientity>7E9F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 56 3F"><unientity>8616</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 5E 5D"><unientity>9616</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 61 22"><unientity>9988</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 6A 26"><unientity>51B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="51 79 54"><unientity>734E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="52 73 5D"><unientity>E9C6</unientity><unientityalt>7E8A</unientityalt><desc>Variant of 22735D which maps to 7E8A</desc></character>
+<character hex="69 21 26"><unientity>30FB</unientity><desc>Ideographic centered point</desc></character>
+<character hex="69 21 39"><unientity>3005</unientity><desc>Ideographic iteration mark</desc></character>
+<character hex="69 21 3C"><unientity>30FC</unientity><desc>Vowel elongation mark for kana</desc></character>
+<character hex="69 21 52"><unientity>3008</unientity><desc>Ideographic less than sign</desc></character>
+<character hex="69 21 53"><unientity>3009</unientity><desc>Ideographic greater than sign</desc></character>
+<character hex="69 21 54"><unientity>300A</unientity><desc>Ideographic left double angle bracket</desc></character>
+<character hex="69 21 55"><unientity>300B</unientity><desc>Ideographic right double angle bracket</desc></character>
+<character hex="69 24 21"><unientity>3041</unientity><desc>Hiragana letter small A</desc></character>
+<character hex="69 24 22"><unientity>3042</unientity><desc>Hiragana letter A</desc></character>
+<character hex="69 24 23"><unientity>3043</unientity><desc>Hiragana letter small I</desc></character>
+<character hex="69 24 24"><unientity>3044</unientity><desc>Hiragana letter I</desc></character>
+<character hex="69 24 25"><unientity>3045</unientity><desc>Hiragana letter small U</desc></character>
+<character hex="69 24 26"><unientity>3046</unientity><desc>Hiragana letter U</desc></character>
+<character hex="69 24 27"><unientity>3047</unientity><desc>Hiragana letter small E</desc></character>
+<character hex="69 24 28"><unientity>3048</unientity><desc>Hiragana letter E</desc></character>
+<character hex="69 24 29"><unientity>3049</unientity><desc>Hiragana letter small O</desc></character>
+<character hex="69 24 2A"><unientity>304A</unientity><desc>Hiragana letter O</desc></character>
+<character hex="69 24 2B"><unientity>304B</unientity><desc>Hiragana letter KA</desc></character>
+<character hex="69 24 2C"><unientity>304C</unientity><desc>Hiragana letter GA</desc></character>
+<character hex="69 24 2D"><unientity>304D</unientity><desc>Hiragana letter KI</desc></character>
+<character hex="69 24 2E"><unientity>304E</unientity><desc>Hiragana letter GI</desc></character>
+<character hex="69 24 2F"><unientity>304F</unientity><desc>Hiragana letter KU</desc></character>
+<character hex="69 24 30"><unientity>3050</unientity><desc>Hiragana letter GU</desc></character>
+<character hex="69 24 31"><unientity>3051</unientity><desc>Hiragana letter KE</desc></character>
+<character hex="69 24 32"><unientity>3052</unientity><desc>Hiragana letter GE</desc></character>
+<character hex="69 24 33"><unientity>3053</unientity><desc>Hiragana letter KO</desc></character>
+<character hex="69 24 34"><unientity>3054</unientity><desc>Hiragana letter GO</desc></character>
+<character hex="69 24 35"><unientity>3055</unientity><desc>Hiragana letter SA</desc></character>
+<character hex="69 24 36"><unientity>3056</unientity><desc>Hiragana letter ZA</desc></character>
+<character hex="69 24 37"><unientity>3057</unientity><desc>Hiragana letter SI</desc></character>
+<character hex="69 24 38"><unientity>3058</unientity><desc>Hiragana letter ZI</desc></character>
+<character hex="69 24 39"><unientity>3059</unientity><desc>Hiragana letter SU</desc></character>
+<character hex="69 24 3A"><unientity>305A</unientity><desc>Hiragana letter ZU</desc></character>
+<character hex="69 24 3B"><unientity>305B</unientity><desc>Hiragana letter SE</desc></character>
+<character hex="69 24 3C"><unientity>305C</unientity><desc>Hiragana letter ZE</desc></character>
+<character hex="69 24 3D"><unientity>305D</unientity><desc>Hiragana letter SO</desc></character>
+<character hex="69 24 3E"><unientity>305E</unientity><desc>Hiragana letter ZO</desc></character>
+<character hex="69 24 3F"><unientity>305F</unientity><desc>Hiragana letter TA</desc></character>
+<character hex="69 24 40"><unientity>3060</unientity><desc>Hiragana letter DA</desc></character>
+<character hex="69 24 41"><unientity>3061</unientity><desc>Hiragana letter TI</desc></character>
+<character hex="69 24 42"><unientity>3062</unientity><desc>Hiragana letter DI</desc></character>
+<character hex="69 24 43"><unientity>3063</unientity><desc>Hiragana letter small TU</desc></character>
+<character hex="69 24 44"><unientity>3064</unientity><desc>Hiragana letter TU</desc></character>
+<character hex="69 24 45"><unientity>3065</unientity><desc>Hiragana letter DU</desc></character>
+<character hex="69 24 46"><unientity>3066</unientity><desc>Hiragana letter TE</desc></character>
+<character hex="69 24 47"><unientity>3067</unientity><desc>Hiragana letter DE</desc></character>
+<character hex="69 24 48"><unientity>3068</unientity><desc>Hiragana letter TO</desc></character>
+<character hex="69 24 49"><unientity>3069</unientity><desc>Hiragana letter DO</desc></character>
+<character hex="69 24 4A"><unientity>306A</unientity><desc>Hiragana letter NA</desc></character>
+<character hex="69 24 4B"><unientity>306B</unientity><desc>Hiragana letter NI</desc></character>
+<character hex="69 24 4C"><unientity>306C</unientity><desc>Hiragana letter NU</desc></character>
+<character hex="69 24 4D"><unientity>306D</unientity><desc>Hiragana letter NE</desc></character>
+<character hex="69 24 4E"><unientity>306E</unientity><desc>Hiragana letter NO</desc></character>
+<character hex="69 24 4F"><unientity>306F</unientity><desc>Hiragana letter HA</desc></character>
+<character hex="69 24 50"><unientity>3070</unientity><desc>Hiragana letter BA</desc></character>
+<character hex="69 24 51"><unientity>3071</unientity><desc>Hiragana letter PA</desc></character>
+<character hex="69 24 52"><unientity>3072</unientity><desc>Hiragana letter HI</desc></character>
+<character hex="69 24 53"><unientity>3073</unientity><desc>Hiragana letter BI</desc></character>
+<character hex="69 24 54"><unientity>3074</unientity><desc>Hiragana letter PI</desc></character>
+<character hex="69 24 55"><unientity>3075</unientity><desc>Hiragana letter HU</desc></character>
+<character hex="69 24 56"><unientity>3076</unientity><desc>Hiragana letter BU</desc></character>
+<character hex="69 24 57"><unientity>3077</unientity><desc>Hiragana letter PU</desc></character>
+<character hex="69 24 58"><unientity>3078</unientity><desc>Hiragana letter HE</desc></character>
+<character hex="69 24 59"><unientity>3079</unientity><desc>Hiragana letter BE</desc></character>
+<character hex="69 24 5A"><unientity>307A</unientity><desc>Hiragana letter PE</desc></character>
+<character hex="69 24 5B"><unientity>307B</unientity><desc>Hiragana letter HO</desc></character>
+<character hex="69 24 5C"><unientity>307C</unientity><desc>Hiragana letter BO</desc></character>
+<character hex="69 24 5D"><unientity>307D</unientity><desc>Hiragana letter PO</desc></character>
+<character hex="69 24 5E"><unientity>307E</unientity><desc>Hiragana letter MA</desc></character>
+<character hex="69 24 5F"><unientity>307F</unientity><desc>Hiragana letter MI</desc></character>
+<character hex="69 24 60"><unientity>3080</unientity><desc>Hiragana letter MU</desc></character>
+<character hex="69 24 61"><unientity>3081</unientity><desc>Hiragana letter ME</desc></character>
+<character hex="69 24 62"><unientity>3082</unientity><desc>Hiragana letter MO</desc></character>
+<character hex="69 24 63"><unientity>3083</unientity><desc>Hiragana letter small YA</desc></character>
+<character hex="69 24 64"><unientity>3084</unientity><desc>Hiragana letter YA</desc></character>
+<character hex="69 24 65"><unientity>3085</unientity><desc>Hiragana letter small YU</desc></character>
+<character hex="69 24 66"><unientity>3086</unientity><desc>Hiragana letter YU</desc></character>
+<character hex="69 24 67"><unientity>3087</unientity><desc>Hiragana letter small YO</desc></character>
+<character hex="69 24 68"><unientity>3088</unientity><desc>Hiragana letter YO</desc></character>
+<character hex="69 24 69"><unientity>3089</unientity><desc>Hiragana letter RA</desc></character>
+<character hex="69 24 6A"><unientity>308A</unientity><desc>Hiragana letter RI</desc></character>
+<character hex="69 24 6B"><unientity>308B</unientity><desc>Hiragana letter RU</desc></character>
+<character hex="69 24 6C"><unientity>308C</unientity><desc>Hiragana letter RE</desc></character>
+<character hex="69 24 6D"><unientity>308D</unientity><desc>Hiragana letter RO</desc></character>
+<character hex="69 24 6E"><unientity>308E</unientity><desc>Hiragana letter small WA</desc></character>
+<character hex="69 24 6F"><unientity>308F</unientity><desc>Hiragana letter WA</desc></character>
+<character hex="69 24 70"><unientity>3090</unientity><desc>Hiragana letter WI</desc></character>
+<character hex="69 24 71"><unientity>3091</unientity><desc>Hiragana letter WE</desc></character>
+<character hex="69 24 72"><unientity>3092</unientity><desc>Hiragana letter WO</desc></character>
+<character hex="69 24 73"><unientity>3093</unientity><desc>Hiragana letter N</desc></character>
+<character hex="69 25 21"><unientity>30A1</unientity><desc>Katakana letter small A</desc></character>
+<character hex="69 25 22"><unientity>30A2</unientity><desc>Katakana letter A</desc></character>
+<character hex="69 25 23"><unientity>30A3</unientity><desc>Katakana letter small I</desc></character>
+<character hex="69 25 24"><unientity>30A4</unientity><desc>Katakana letter I</desc></character>
+<character hex="69 25 25"><unientity>30A5</unientity><desc>Katakana letter small U</desc></character>
+<character hex="69 25 26"><unientity>30A6</unientity><desc>Katakana letter U</desc></character>
+<character hex="69 25 27"><unientity>30A7</unientity><desc>Katakana letter small E</desc></character>
+<character hex="69 25 28"><unientity>30A8</unientity><desc>Katakana letter E</desc></character>
+<character hex="69 25 29"><unientity>30A9</unientity><desc>Katakana letter small O</desc></character>
+<character hex="69 25 2A"><unientity>30AA</unientity><desc>Katakana letter O</desc></character>
+<character hex="69 25 2B"><unientity>30AB</unientity><desc>Katakana letter KA</desc></character>
+<character hex="69 25 2C"><unientity>30AC</unientity><desc>Katakana letter GA</desc></character>
+<character hex="69 25 2D"><unientity>30AD</unientity><desc>Katakana letter KI</desc></character>
+<character hex="69 25 2E"><unientity>30AE</unientity><desc>Katakana letter GI</desc></character>
+<character hex="69 25 2F"><unientity>30AF</unientity><desc>Katakana letter KU</desc></character>
+<character hex="69 25 30"><unientity>30B0</unientity><desc>Katakana letter GU</desc></character>
+<character hex="69 25 31"><unientity>30B1</unientity><desc>Katakana letter KE</desc></character>
+<character hex="69 25 32"><unientity>30B2</unientity><desc>Katakana letter GE</desc></character>
+<character hex="69 25 33"><unientity>30B3</unientity><desc>Katakana letter KO</desc></character>
+<character hex="69 25 34"><unientity>30B4</unientity><desc>Katakana letter GO</desc></character>
+<character hex="69 25 35"><unientity>30B5</unientity><desc>Katakana letter SA</desc></character>
+<character hex="69 25 36"><unientity>30B6</unientity><desc>Katakana letter ZA</desc></character>
+<character hex="69 25 37"><unientity>30B7</unientity><desc>Katakana letter SI</desc></character>
+<character hex="69 25 38"><unientity>30B8</unientity><desc>Katakana letter ZI</desc></character>
+<character hex="69 25 39"><unientity>30B9</unientity><desc>Katakana letter SU</desc></character>
+<character hex="69 25 3A"><unientity>30BA</unientity><desc>Katakana letter ZU</desc></character>
+<character hex="69 25 3B"><unientity>30BB</unientity><desc>Katakana letter SE</desc></character>
+<character hex="69 25 3C"><unientity>30BC</unientity><desc>Katakana letter ZE</desc></character>
+<character hex="69 25 3D"><unientity>30BD</unientity><desc>Katakana letter SO</desc></character>
+<character hex="69 25 3F"><unientity>30BF</unientity><desc>Katakana letter TA</desc></character>
+<character hex="69 25 40"><unientity>30C0</unientity><desc>Katakana letter DA</desc></character>
+<character hex="69 25 41"><unientity>30C1</unientity><desc>Katakana letter TI</desc></character>
+<character hex="69 25 42"><unientity>30C2</unientity><desc>Katakana letter DI</desc></character>
+<character hex="69 25 43"><unientity>30C3</unientity><desc>Katakana letter small TU</desc></character>
+<character hex="69 25 44"><unientity>30C4</unientity><desc>Katakana letter TU</desc></character>
+<character hex="69 25 45"><unientity>30C5</unientity><desc>Katakana letter DU</desc></character>
+<character hex="69 25 46"><unientity>30C6</unientity><desc>Katakana letter TE</desc></character>
+<character hex="69 25 47"><unientity>30C7</unientity><desc>Katakana letter DE</desc></character>
+<character hex="69 25 48"><unientity>30C8</unientity><desc>Katakana letter TO</desc></character>
+<character hex="69 25 49"><unientity>30C9</unientity><desc>Katakana letter DO</desc></character>
+<character hex="69 25 4A"><unientity>30CA</unientity><desc>Katakana letter NA</desc></character>
+<character hex="69 25 4B"><unientity>30CB</unientity><desc>Katakana letter NI</desc></character>
+<character hex="69 25 4C"><unientity>30CC</unientity><desc>Katakana letter NU</desc></character>
+<character hex="69 25 4D"><unientity>30CD</unientity><desc>Katakana letter NE</desc></character>
+<character hex="69 25 4E"><unientity>30CE</unientity><desc>Katakana letter NO</desc></character>
+<character hex="69 25 4F"><unientity>30CF</unientity><desc>Katakana letter HA</desc></character>
+<character hex="69 25 50"><unientity>30D0</unientity><desc>Katakana letter BA</desc></character>
+<character hex="69 25 51"><unientity>30D1</unientity><desc>Katakana letter PA</desc></character>
+<character hex="69 25 52"><unientity>30D2</unientity><desc>Katakana letter HI</desc></character>
+<character hex="69 25 53"><unientity>30D3</unientity><desc>Katakana letter BI</desc></character>
+<character hex="69 25 54"><unientity>30D4</unientity><desc>Katakana letter PI</desc></character>
+<character hex="69 25 55"><unientity>30D5</unientity><desc>Katakana letter HU</desc></character>
+<character hex="69 25 56"><unientity>30D6</unientity><desc>Katakana letter BU</desc></character>
+<character hex="69 25 57"><unientity>30D7</unientity><desc>Katakana letter PU</desc></character>
+<character hex="69 25 58"><unientity>30D8</unientity><desc>Katakana letter HE</desc></character>
+<character hex="69 25 59"><unientity>30D9</unientity><desc>Katakana letter BE</desc></character>
+<character hex="69 25 5A"><unientity>30DA</unientity><desc>Katakana letter PE</desc></character>
+<character hex="69 25 5B"><unientity>30DB</unientity><desc>Katakana letter HO</desc></character>
+<character hex="69 25 5C"><unientity>30DC</unientity><desc>Katakana letter BO</desc></character>
+<character hex="69 25 5D"><unientity>30DD</unientity><desc>Katakana letter PO</desc></character>
+<character hex="69 25 5E"><unientity>30DE</unientity><desc>Katakana letter MA</desc></character>
+<character hex="69 25 5F"><unientity>30DF</unientity><desc>Katakana letter MI</desc></character>
+<character hex="69 25 60"><unientity>30E0</unientity><desc>Katakana letter MU</desc></character>
+<character hex="69 25 61"><unientity>30E1</unientity><desc>Katakana letter ME</desc></character>
+<character hex="69 25 62"><unientity>30E2</unientity><desc>Katakana letter MO</desc></character>
+<character hex="69 25 63"><unientity>30E3</unientity><desc>Katakana letter small YA</desc></character>
+<character hex="69 25 64"><unientity>30E4</unientity><desc>Katakana letter YA</desc></character>
+<character hex="69 25 65"><unientity>30E5</unientity><desc>Katakana letter small YU</desc></character>
+<character hex="69 25 66"><unientity>30E6</unientity><desc>Katakana letter YU</desc></character>
+<character hex="69 25 67"><unientity>30E7</unientity><desc>Katakana letter small YO</desc></character>
+<character hex="69 25 68"><unientity>30E8</unientity><desc>Katakana letter YO</desc></character>
+<character hex="69 25 69"><unientity>30E9</unientity><desc>Katakana letter RA</desc></character>
+<character hex="69 25 6A"><unientity>30EA</unientity><desc>Katakana letter RI</desc></character>
+<character hex="69 25 6B"><unientity>30EB</unientity><desc>Katakana letter RU</desc></character>
+<character hex="69 25 6C"><unientity>30EC</unientity><desc>Katakana letter RE</desc></character>
+<character hex="69 25 6D"><unientity>30ED</unientity><desc>Katakana letter RO</desc></character>
+<character hex="69 25 6E"><unientity>30EE</unientity><desc>Katakana letter small WA</desc></character>
+<character hex="69 25 6F"><unientity>30EF</unientity><desc>Katakana letter WA</desc></character>
+<character hex="69 25 70"><unientity>30F0</unientity><desc>Katakana letter WI</desc></character>
+<character hex="69 25 71"><unientity>30F1</unientity><desc>Katakana letter WE</desc></character>
+<character hex="69 25 72"><unientity>30F2</unientity><desc>Katakana letter WO</desc></character>
+<character hex="69 25 73"><unientity>30F3</unientity><desc>Katakana letter N</desc></character>
+<character hex="69 25 74"><unientity>30F4</unientity><desc>Katakana letter VU</desc></character>
+<character hex="69 25 75"><unientity>30F5</unientity><desc>Katakana letter small KA</desc></character>
+<character hex="69 25 76"><unientity>30F6</unientity><desc>Katakana letter small KE</desc></character>
+<character hex="69 25 77"><unientity>309B</unientity><desc>Katakana-hiragana voiced sound mark</desc></character>
+<character hex="69 25 78"><unientity>309C</unientity><desc>Katakana-hiragana semi-voiced sound mark</desc></character>
+<character hex="69 37 29"><unientity>7C82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 3C 32"><unientity>9D2B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 3C 36"><unientity>96EB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 46 64"><unientity>51EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 46 77"><unientity>5302</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 48 23"><unientity>7872</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 48 2B"><unientity>7560</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 48 38"><unientity>567A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 4B 7B"><unientity>9EBF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 4C 5D"><unientity>6762</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 4C 68"><unientity>5301</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 4C 7A"><unientity>9453</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 51 30"><unientity>5116</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 51 5E"><unientity>51E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 52 5D"><unientity>53FA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 53 26"><unientity>54D8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 53 3B"><unientity>555D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 53 75"><unientity>56CE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 29"><unientity>5726</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 2A"><unientity>5737</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 38"><unientity>57B3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 3A"><unientity>57AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 3B"><unientity>57B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 42"><unientity>57D6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 4B"><unientity>5870</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 51"><unientity>58B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 57"><unientity>58B8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 5C"><unientity>58D7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 54 5F"><unientity>58E5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 55 4E"><unientity>5B36</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 26"><unientity>4E62</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 2C"><unientity>599B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 2E"><unientity>5CBB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 30"><unientity>5CBC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 32"><unientity>5CC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 33"><unientity>5CBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 4E"><unientity>5D76</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 56 57"><unientity>5D90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 57 37"><unientity>5F16</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 57 3B"><unientity>5F41</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 57 6A"><unientity>603A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 59 4B"><unientity>6327</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 59 5E"><unientity>63B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5A 31"><unientity>64F6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5A 73"><unientity>6683</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5A 7E"><unientity>66BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5B 37"><unientity>6737</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5B 7B"><unientity>6926</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 29"><unientity>6925</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 2D"><unientity>6928</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 30"><unientity>6923</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 31"><unientity>6921</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 39"><unientity>697E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 43"><unientity>6981</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 4F"><unientity>69DD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 53"><unientity>6A2E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5C 71"><unientity>6A78</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5D 36"><unientity>6B1F</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5E 63"><unientity>6E82</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 5F 70"><unientity>7195</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 61 26"><unientity>74F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 61 36"><unientity>753C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 61 3A"><unientity>7549</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 61 3E"><unientity>7569</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 62 6D"><unientity>7874</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 62 73"><unientity>78B5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 63 25"><unientity>7907</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 63 4E"><unientity>7A43</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 63 73"><unientity>7B02</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 49"><unientity>7C13</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 4C"><unientity>7C17</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 4E"><unientity>7BF6</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 64"><unientity>7C90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 66"><unientity>7CAD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 71"><unientity>7CC0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 64 74"><unientity>7CD8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 65 4F"><unientity>7E05</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 65 6D"><unientity>7E83</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 65 6E"><unientity>7DD5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 65 76"><unientity>7E90</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 67 33"><unientity>81A4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 67 5C"><unientity>825D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 68 4D"><unientity>8422</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 68 68"><unientity>84D9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 69 46"><unientity>8630</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 69 5B"><unientity>86AB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 69 62"><unientity>86EF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6A 2C"><unientity>87D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6A 5E"><unientity>88B0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6A 61"><unientity>88C3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6A 6D"><unientity>8904</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6B 27"><unientity>8977</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6B 5C"><unientity>8ADA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6D 3F"><unientity>8EBE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6D 40"><unientity>8EC5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6D 41"><unientity>8EC8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6D 5A"><unientity>8F4C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6D 7A"><unientity>9027</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6E 28"><unientity>9056</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6E 5C"><unientity>91DF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6F 27"><unientity>933B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6F 5B"><unientity>958A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 6F 5D"><unientity>9596</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 70 23"><unientity>9666</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 70 58"><unientity>9779</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 70 5D"><unientity>9786</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 70 60"><unientity>9790</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 71 24"><unientity>98AA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 71 52"><unientity>99F2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 71 74"><unientity>9ADE</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 71 7D"><unientity>9AF1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 71 7E"><unientity>9AF7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 3B"><unientity>9B96</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 40"><unientity>9BB4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 45"><unientity>9BCF</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 46"><unientity>9BD1</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 4E"><unientity>9BF2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 60"><unientity>9C30</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 65"><unientity>9C5A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 72 7E"><unientity>9D48</unientity><desc>East Asian ideograph</desc></character>
+<character hex="69 73 23"><unientity>9D64</unientity><desc>East Asian ideograph</desc></character>
+<character hex="6F 24 57"><unientity>3131</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 58"><unientity>3134</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 59"><unientity>3137</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5A"><unientity>3139</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5B"><unientity>3141</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5C"><unientity>3142</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5D"><unientity>3145</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5E"><unientity>3147</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 5F"><unientity>3148</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 60"><unientity>314A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 61"><unientity>314B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 62"><unientity>314C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 63"><unientity>314D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 64"><unientity>314E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 65"><unientity>3132</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 69"><unientity>3138</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 6E"><unientity>3143</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 70"><unientity>3146</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 71"><unientity>3149</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 72"><unientity>314F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 73"><unientity>3150</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 74"><unientity>3151</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 76"><unientity>3153</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 77"><unientity>3154</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 78"><unientity>3155</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 7A"><unientity>3157</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 7B"><unientity>3158</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 24 7E"><unientity>315B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 25 21"><unientity>315C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 25 25"><unientity>3160</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 25 26"><unientity>3161</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 25 27"><unientity>3162</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 25 28"><unientity>3163</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 5F"><unientity>AC00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 60"><unientity>AC01</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 61"><unientity>AC02</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 62"><unientity>AC04</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 63"><unientity>AC07</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 64"><unientity>AC08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 65"><unientity>AC09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 66"><unientity>AC10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 67"><unientity>AC11</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 68"><unientity>AC12</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 69"><unientity>AC13</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6A"><unientity>AC14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6B"><unientity>AC15</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6C"><unientity>AC16</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6D"><unientity>AC17</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6E"><unientity>AC19</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 6F"><unientity>AC1A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 70"><unientity>AC1B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 71"><unientity>AC1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 72"><unientity>AC1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 73"><unientity>AC20</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 75"><unientity>AC24</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 76"><unientity>AC2C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 77"><unientity>AC2D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 78"><unientity>AC2F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 79"><unientity>AC30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 7A"><unientity>AC31</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 7B"><unientity>AC38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 7C"><unientity>AC39</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 7D"><unientity>AC40</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 48 7E"><unientity>AC54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 21"><unientity>AC70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 22"><unientity>AC71</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 24"><unientity>AC74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 25"><unientity>AC77</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 26"><unientity>AC78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 27"><unientity>AC79</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 29"><unientity>AC80</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 2A"><unientity>AC81</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 2B"><unientity>AC83</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 2C"><unientity>AC84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 2D"><unientity>AC85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 2E"><unientity>AC86</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 30"><unientity>AC89</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 31"><unientity>AC8A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 32"><unientity>AC8B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 33"><unientity>AC8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 34"><unientity>AC90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 35"><unientity>AC94</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 36"><unientity>AC9C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 37"><unientity>AC9F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 38"><unientity>ACA0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 39"><unientity>ACA1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3A"><unientity>ACA8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3B"><unientity>ACA9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3C"><unientity>ACAA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3D"><unientity>ACAC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3E"><unientity>ACAF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 3F"><unientity>ACB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 40"><unientity>ACB8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 41"><unientity>ACB9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 43"><unientity>ACBC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 44"><unientity>ACBD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 45"><unientity>ACC1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 47"><unientity>ACC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 49"><unientity>ACD7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4A"><unientity>ACE0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4B"><unientity>ACE1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4C"><unientity>ACE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4D"><unientity>ACE7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4E"><unientity>ACE8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 4F"><unientity>ACEA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 50"><unientity>ACEC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 51"><unientity>ACEF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 52"><unientity>ACF0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 53"><unientity>ACF1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 54"><unientity>ACF3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 55"><unientity>ACF5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 56"><unientity>ACF6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 57"><unientity>ACFA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 58"><unientity>ACFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 59"><unientity>ACFD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5A"><unientity>AD00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5B"><unientity>AD04</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5C"><unientity>AD0C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5D"><unientity>AD0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5E"><unientity>AD0F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 5F"><unientity>AD11</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 60"><unientity>AD18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 61"><unientity>AD19</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 62"><unientity>AD1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 63"><unientity>AD20</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 64"><unientity>AD28</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 65"><unientity>AD29</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 66"><unientity>AD2D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 67"><unientity>AD34</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 68"><unientity>AD38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 69"><unientity>AD3C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 6A"><unientity>AD44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 6C"><unientity>AD49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 6D"><unientity>AD50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 6E"><unientity>AD6C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 6F"><unientity>AD6D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 70"><unientity>AD70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 71"><unientity>AD73</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 72"><unientity>AD74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 73"><unientity>AD75</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 74"><unientity>AD76</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 75"><unientity>AD7C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 76"><unientity>AD7D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 77"><unientity>AD7F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 78"><unientity>AD81</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 79"><unientity>AD82</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 7A"><unientity>AD88</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 7B"><unientity>AD8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 7C"><unientity>AD90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 49 7E"><unientity>ADA4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 22"><unientity>ADC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 23"><unientity>ADC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 24"><unientity>ADC8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 25"><unientity>ADD0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 26"><unientity>ADD1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 27"><unientity>ADD3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 28"><unientity>ADDC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 29"><unientity>ADE0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2A"><unientity>ADE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2B"><unientity>ADEC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2C"><unientity>ADF8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2D"><unientity>ADF9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2E"><unientity>ADFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 2F"><unientity>ADFF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 30"><unientity>AE00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 31"><unientity>AE01</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 32"><unientity>AE08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 33"><unientity>AE09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 34"><unientity>AE0B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 35"><unientity>AE0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 36"><unientity>AE30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 37"><unientity>AE31</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 38"><unientity>AE34</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 39"><unientity>AE37</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3A"><unientity>AE38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3B"><unientity>AE40</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3C"><unientity>AE41</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3D"><unientity>AE43</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3E"><unientity>AE44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 3F"><unientity>AE45</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 40"><unientity>AE4A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 43"><unientity>AE4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 44"><unientity>AE4D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 45"><unientity>AE4E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 46"><unientity>AE50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 47"><unientity>AE54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 48"><unientity>AE5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 49"><unientity>AE5D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4A"><unientity>AE60</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4B"><unientity>AE61</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4C"><unientity>AE62</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4D"><unientity>AE65</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4E"><unientity>AE68</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 4F"><unientity>AE69</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 50"><unientity>AE6C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 51"><unientity>AE70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 52"><unientity>AE78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 53"><unientity>AE79</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 54"><unientity>AE7B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 55"><unientity>AE7C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 56"><unientity>AE7D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 57"><unientity>AE84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 58"><unientity>AE85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 59"><unientity>AEBC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5A"><unientity>AEBD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5B"><unientity>AEBE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5C"><unientity>AEC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5D"><unientity>AEC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5E"><unientity>AECC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 5F"><unientity>AECD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 60"><unientity>AECF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 61"><unientity>AED0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 62"><unientity>AED1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 63"><unientity>AED8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 64"><unientity>AEDC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 65"><unientity>AEF4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 66"><unientity>AF0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 67"><unientity>AF2C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 68"><unientity>AF2D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 69"><unientity>AF30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6A"><unientity>AF34</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6B"><unientity>AF3C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6C"><unientity>AF3D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6D"><unientity>AF3F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6E"><unientity>AF41</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 6F"><unientity>AF42</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 70"><unientity>AF43</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 71"><unientity>AF48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 72"><unientity>AF49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 73"><unientity>AF4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 74"><unientity>AF58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 75"><unientity>AF5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 76"><unientity>AF5D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 77"><unientity>AF64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 78"><unientity>AF65</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 79"><unientity>AF79</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 7A"><unientity>AF80</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 7B"><unientity>AF84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 7C"><unientity>AF88</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 7D"><unientity>AF90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4A 7E"><unientity>AF95</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 21"><unientity>AF9C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 22"><unientity>AFB8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 23"><unientity>AFB9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 24"><unientity>AFBC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 25"><unientity>AFC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 26"><unientity>AFC7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 27"><unientity>AFC8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 28"><unientity>AFC9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 29"><unientity>AFCB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2A"><unientity>AFCD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2B"><unientity>AFCE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2C"><unientity>AFD4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2D"><unientity>AFD8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2E"><unientity>AFE9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 2F"><unientity>AFF0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 30"><unientity>B000</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 32"><unientity>B00C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 33"><unientity>B00D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 34"><unientity>B010</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 35"><unientity>B014</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 36"><unientity>B01C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 37"><unientity>B01D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 38"><unientity>B028</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 39"><unientity>B044</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3A"><unientity>B045</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3B"><unientity>B048</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3C"><unientity>B04A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3D"><unientity>B04C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3E"><unientity>B053</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 3F"><unientity>B054</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 40"><unientity>B055</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 41"><unientity>B057</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 42"><unientity>B059</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 43"><unientity>B05D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 44"><unientity>B07C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 45"><unientity>B07D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 46"><unientity>B080</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 47"><unientity>B084</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 48"><unientity>B08C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 49"><unientity>B08D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 4A"><unientity>B08F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 4B"><unientity>B090</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 4C"><unientity>B091</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 4F"><unientity>B098</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 50"><unientity>B099</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 51"><unientity>B09A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 52"><unientity>B09C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 53"><unientity>B09F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 54"><unientity>B0A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 55"><unientity>B0A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 56"><unientity>B0A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 57"><unientity>B0A9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 58"><unientity>B0AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 59"><unientity>B0AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5A"><unientity>B0AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5B"><unientity>B0AE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5C"><unientity>B0AF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5D"><unientity>B0B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5E"><unientity>B0B3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 5F"><unientity>B0B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 60"><unientity>B0B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 61"><unientity>B0B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 62"><unientity>B0BB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 63"><unientity>B0BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 64"><unientity>B0C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 65"><unientity>B0C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 66"><unientity>B0C7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 67"><unientity>B0C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 68"><unientity>B0C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 69"><unientity>B0D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6A"><unientity>B0D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6B"><unientity>B0E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6C"><unientity>B0E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6D"><unientity>B0EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6E"><unientity>B108</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 6F"><unientity>B109</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 71"><unientity>B10B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 72"><unientity>B10C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 73"><unientity>B10F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 74"><unientity>B110</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 75"><unientity>B113</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 76"><unientity>B118</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 77"><unientity>B119</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 78"><unientity>B11B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 79"><unientity>B11C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 7A"><unientity>B11D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 7B"><unientity>B11E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 7C"><unientity>B123</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 7D"><unientity>B124</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4B 7E"><unientity>B125</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 21"><unientity>B128</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 22"><unientity>B12C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 23"><unientity>B134</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 24"><unientity>B135</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 25"><unientity>B137</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 26"><unientity>B140</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 27"><unientity>B141</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 28"><unientity>B144</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 29"><unientity>B150</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2A"><unientity>B151</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2B"><unientity>B153</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2C"><unientity>B154</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2D"><unientity>B155</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2E"><unientity>B158</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 2F"><unientity>B15C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 30"><unientity>B178</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 31"><unientity>B179</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 32"><unientity>B17A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 33"><unientity>B17C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 34"><unientity>B180</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 35"><unientity>B188</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 36"><unientity>B189</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 37"><unientity>B18B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 38"><unientity>B18D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 39"><unientity>B192</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3A"><unientity>B193</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3B"><unientity>B194</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3C"><unientity>B1A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3D"><unientity>B1CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3E"><unientity>B1D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 3F"><unientity>B1D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 40"><unientity>B1DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 41"><unientity>B1E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 42"><unientity>B1FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 43"><unientity>B204</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 44"><unientity>B205</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 45"><unientity>B208</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 46"><unientity>B20B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 47"><unientity>B20C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 48"><unientity>B213</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 49"><unientity>B214</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4A"><unientity>B215</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4B"><unientity>B217</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4C"><unientity>B220</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4D"><unientity>B233</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4E"><unientity>B234</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 4F"><unientity>B258</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 50"><unientity>B25C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 51"><unientity>B260</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 52"><unientity>B268</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 53"><unientity>B269</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 54"><unientity>B274</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 55"><unientity>B284</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 56"><unientity>B289</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 57"><unientity>B290</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 58"><unientity>B291</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 59"><unientity>B294</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5A"><unientity>B298</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5B"><unientity>B299</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5C"><unientity>B2A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5D"><unientity>B2A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5E"><unientity>B2A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 5F"><unientity>B2A6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 60"><unientity>B2AA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 61"><unientity>B2AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 62"><unientity>B2C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 63"><unientity>B2C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 64"><unientity>B2CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 65"><unientity>B2D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 66"><unientity>B2D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 67"><unientity>B2D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 68"><unientity>B2DB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 69"><unientity>B2DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 6A"><unientity>B2E2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 6D"><unientity>B2E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 6E"><unientity>B2E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 6F"><unientity>B2E6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 70"><unientity>B2E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 71"><unientity>B2EB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 72"><unientity>B2EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 73"><unientity>B2ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 74"><unientity>B2EE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 75"><unientity>B2F3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 76"><unientity>B2F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 77"><unientity>B2F5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 78"><unientity>B2F7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 79"><unientity>B2F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 7A"><unientity>B2FA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 7B"><unientity>B2FB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 7C"><unientity>B2FF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 7D"><unientity>B300</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4C 7E"><unientity>B301</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 21"><unientity>B304</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 22"><unientity>B308</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 23"><unientity>B310</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 24"><unientity>B311</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 25"><unientity>B313</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 26"><unientity>B314</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 27"><unientity>B315</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 28"><unientity>B354</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 29"><unientity>B355</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2A"><unientity>B358</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2B"><unientity>B35B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2C"><unientity>B35C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2D"><unientity>B35F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2E"><unientity>B364</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 2F"><unientity>B365</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 30"><unientity>B367</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 31"><unientity>B368</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 32"><unientity>B369</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 33"><unientity>B36A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 34"><unientity>B36B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 35"><unientity>B36E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 36"><unientity>B370</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 37"><unientity>B371</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 38"><unientity>B374</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 39"><unientity>B378</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3A"><unientity>B380</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3B"><unientity>B383</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3C"><unientity>B385</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3D"><unientity>B38C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3E"><unientity>B3C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 3F"><unientity>B3C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 40"><unientity>B3C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 41"><unientity>B3CB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 42"><unientity>B3CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 43"><unientity>B3D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 44"><unientity>B3D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 45"><unientity>B3D5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 46"><unientity>B3D7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 47"><unientity>B3D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 48"><unientity>B3DB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 49"><unientity>B3FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4A"><unientity>B400</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4B"><unientity>B410</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4C"><unientity>B418</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4D"><unientity>B41C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4E"><unientity>B420</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 4F"><unientity>B428</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 50"><unientity>B429</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 51"><unientity>B42B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 52"><unientity>B42C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 53"><unientity>B450</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 54"><unientity>B451</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 55"><unientity>B454</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 56"><unientity>B458</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 57"><unientity>B460</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 58"><unientity>B461</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 59"><unientity>B463</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5A"><unientity>B465</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5B"><unientity>B46C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5C"><unientity>B480</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5D"><unientity>B488</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5E"><unientity>B4A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 5F"><unientity>B4B7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 60"><unientity>B4C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 61"><unientity>B4D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 62"><unientity>B4DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 63"><unientity>B4DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 64"><unientity>B4E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 65"><unientity>B4E3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 66"><unientity>B4E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 67"><unientity>B4EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 68"><unientity>B4ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 69"><unientity>B4EF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6A"><unientity>B4F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6B"><unientity>B514</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6C"><unientity>B515</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6D"><unientity>B518</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6E"><unientity>B51B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 6F"><unientity>B51C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 70"><unientity>B524</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 71"><unientity>B525</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 72"><unientity>B527</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 73"><unientity>B528</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 74"><unientity>B529</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 75"><unientity>B52A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 78"><unientity>B530</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 79"><unientity>B531</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 7A"><unientity>B532</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 7B"><unientity>B534</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 7C"><unientity>B537</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4D 7D"><unientity>B538</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 21"><unientity>B540</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 22"><unientity>B541</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 23"><unientity>B543</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 24"><unientity>B544</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 25"><unientity>B545</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 26"><unientity>B54B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 27"><unientity>B54C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 28"><unientity>B54D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 29"><unientity>B550</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2A"><unientity>B554</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2B"><unientity>B55C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2C"><unientity>B55D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2D"><unientity>B55F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2E"><unientity>B560</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 2F"><unientity>B561</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 30"><unientity>B5A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 31"><unientity>B5A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 32"><unientity>B5A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 33"><unientity>B5A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 34"><unientity>B5AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 35"><unientity>B5B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 36"><unientity>B5B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 37"><unientity>B5B3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 38"><unientity>B5B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 39"><unientity>B5B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3A"><unientity>B5BB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3B"><unientity>B5BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3C"><unientity>B5C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3D"><unientity>B5C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3E"><unientity>B5CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 3F"><unientity>B5CF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 40"><unientity>B5D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 41"><unientity>B610</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 42"><unientity>B611</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 43"><unientity>B614</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 44"><unientity>B618</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 45"><unientity>B625</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 46"><unientity>B664</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 47"><unientity>B69C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 48"><unientity>B69D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 49"><unientity>B6A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4A"><unientity>B6AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4B"><unientity>B6AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4C"><unientity>B6B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4D"><unientity>B6F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4E"><unientity>B6F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 4F"><unientity>B6F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 50"><unientity>B700</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 51"><unientity>B701</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 52"><unientity>B728</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 53"><unientity>B729</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 54"><unientity>B72C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 55"><unientity>B72F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 56"><unientity>B730</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 57"><unientity>B738</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 58"><unientity>B739</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 59"><unientity>B73B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5A"><unientity>B744</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5B"><unientity>B748</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5C"><unientity>B760</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5D"><unientity>B764</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5E"><unientity>B768</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 5F"><unientity>B770</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 60"><unientity>B771</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 61"><unientity>B775</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 64"><unientity>B77C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 65"><unientity>B77D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 66"><unientity>B780</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 67"><unientity>B784</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 68"><unientity>B78C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 69"><unientity>B78D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6A"><unientity>B78F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6B"><unientity>B790</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6C"><unientity>B791</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6D"><unientity>B797</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6E"><unientity>B798</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 6F"><unientity>B799</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 70"><unientity>B79C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 71"><unientity>B7A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 72"><unientity>B7A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 73"><unientity>B7A9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 74"><unientity>B7AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 75"><unientity>B7AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 76"><unientity>B7AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 77"><unientity>B7B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 78"><unientity>B7B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 79"><unientity>B7C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 7A"><unientity>B7EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 7B"><unientity>B7ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 7C"><unientity>B7F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 7D"><unientity>B7F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4E 7E"><unientity>B7FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 21"><unientity>B7FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 22"><unientity>B7FF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 23"><unientity>B800</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 24"><unientity>B801</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 25"><unientity>B807</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 26"><unientity>B808</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 27"><unientity>B809</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 28"><unientity>B80C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 29"><unientity>B810</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2A"><unientity>B818</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2B"><unientity>B819</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2C"><unientity>B81B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2D"><unientity>B81D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2E"><unientity>B824</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 2F"><unientity>B825</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 30"><unientity>B828</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 31"><unientity>B82C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 32"><unientity>B834</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 33"><unientity>B835</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 34"><unientity>B837</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 35"><unientity>B838</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 36"><unientity>B839</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 37"><unientity>B840</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 38"><unientity>B85C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 39"><unientity>B85D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3A"><unientity>B860</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3B"><unientity>B864</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3C"><unientity>B86C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3D"><unientity>B86D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3E"><unientity>B86F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 3F"><unientity>B871</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 40"><unientity>B8B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 41"><unientity>B8CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 42"><unientity>B8E1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 43"><unientity>B8E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 44"><unientity>B8E9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 45"><unientity>B8EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 46"><unientity>B8F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 47"><unientity>B8F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 48"><unientity>B8F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 49"><unientity>B8FB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4A"><unientity>B8FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4B"><unientity>B904</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4C"><unientity>B93C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4D"><unientity>B958</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4E"><unientity>B959</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 4F"><unientity>B95C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 50"><unientity>B960</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 51"><unientity>B968</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 52"><unientity>B96D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 53"><unientity>B974</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 54"><unientity>B975</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 55"><unientity>B978</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 56"><unientity>B97C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 57"><unientity>B984</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 58"><unientity>B985</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 59"><unientity>B987</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5A"><unientity>B989</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5B"><unientity>B98E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5C"><unientity>B9AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5D"><unientity>B9AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5E"><unientity>B9B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 5F"><unientity>B9B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 60"><unientity>B9BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 61"><unientity>B9BD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 62"><unientity>B9BF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 63"><unientity>B9C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 66"><unientity>B9C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 67"><unientity>B9C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 68"><unientity>B9CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 69"><unientity>B9CE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6A"><unientity>B9CF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6B"><unientity>B9D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6C"><unientity>B9D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6D"><unientity>B9D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6E"><unientity>B9D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 6F"><unientity>B9DB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 70"><unientity>B9DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 71"><unientity>B9DE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 72"><unientity>B9E1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 73"><unientity>B9E3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 74"><unientity>B9E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 75"><unientity>B9E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 76"><unientity>B9E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 77"><unientity>B9EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 78"><unientity>B9F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 79"><unientity>B9F5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 7A"><unientity>B9F7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 7B"><unientity>B9F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 7C"><unientity>B9F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 7D"><unientity>B9FA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 4F 7E"><unientity>BA00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 21"><unientity>BA38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 22"><unientity>BA39</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 23"><unientity>BA3C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 24"><unientity>BA40</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 25"><unientity>BA48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 26"><unientity>BA49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 27"><unientity>BA4B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 28"><unientity>BA4D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 29"><unientity>BA4E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2A"><unientity>BA53</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2B"><unientity>BA54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2C"><unientity>BA55</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2D"><unientity>BA58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2E"><unientity>BA5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 2F"><unientity>BA64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 30"><unientity>BA65</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 31"><unientity>BA67</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 32"><unientity>BA70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 33"><unientity>BA71</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 34"><unientity>BA74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 35"><unientity>BA78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 36"><unientity>BA83</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 37"><unientity>BA84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 38"><unientity>BA85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 39"><unientity>BA87</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3A"><unientity>BAA8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3B"><unientity>BAA9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3C"><unientity>BAAB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3D"><unientity>BAAC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3E"><unientity>BAB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 3F"><unientity>BAB8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 40"><unientity>BAB9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 41"><unientity>BABB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 42"><unientity>BABD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 43"><unientity>BAC3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 44"><unientity>BAFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 45"><unientity>BB0F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 46"><unientity>BB18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 47"><unientity>BB34</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 48"><unientity>BB35</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 49"><unientity>BB36</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4A"><unientity>BB38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4B"><unientity>BB3B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4C"><unientity>BB3C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4D"><unientity>BB3D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4E"><unientity>BB44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 4F"><unientity>BB47</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 50"><unientity>BB49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 51"><unientity>BB4D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 52"><unientity>BB4F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 53"><unientity>BB50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 54"><unientity>BB54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 55"><unientity>BB58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 56"><unientity>BB61</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 57"><unientity>BB63</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 58"><unientity>BB88</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 59"><unientity>BB8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5A"><unientity>BBA4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5B"><unientity>BBC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5C"><unientity>BBC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5D"><unientity>BBC8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5E"><unientity>BBD0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 5F"><unientity>BBF8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 60"><unientity>BBF9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 61"><unientity>BBFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 62"><unientity>BBFF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 63"><unientity>BC00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 64"><unientity>BC08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 65"><unientity>BC09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 66"><unientity>BC0B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 68"><unientity>BC0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 69"><unientity>BC0F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 6A"><unientity>BC11</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 6B"><unientity>BBB4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 6D"><unientity>BC14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 6E"><unientity>BC15</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 6F"><unientity>BC16</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 70"><unientity>BC18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 71"><unientity>BC1B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 72"><unientity>BC1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 73"><unientity>BC1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 74"><unientity>BC1F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 75"><unientity>BC24</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 76"><unientity>BC25</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 77"><unientity>BC27</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 78"><unientity>BC29</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 79"><unientity>BC2D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 7A"><unientity>BC30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 7B"><unientity>BC31</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 7C"><unientity>BC34</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 7D"><unientity>BC37</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 50 7E"><unientity>BC38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 21"><unientity>BC40</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 22"><unientity>BC41</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 23"><unientity>BC43</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 24"><unientity>BC44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 25"><unientity>BC45</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 26"><unientity>BC84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 27"><unientity>BC85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 28"><unientity>BC88</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 29"><unientity>BC8B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2A"><unientity>BC8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2B"><unientity>BC94</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2C"><unientity>BC95</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2D"><unientity>BC97</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2E"><unientity>BC98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 2F"><unientity>BC99</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 30"><unientity>BC9A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 31"><unientity>BCA0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 32"><unientity>BCA1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 33"><unientity>BCA4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 34"><unientity>BCA7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 35"><unientity>BCA8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 36"><unientity>BCB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 37"><unientity>BCB1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 38"><unientity>BCB3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 39"><unientity>BCB5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3A"><unientity>BCBC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3B"><unientity>BCBD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3C"><unientity>BCC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3D"><unientity>BCC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3E"><unientity>BCCC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 3F"><unientity>BCCD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 40"><unientity>BCCF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 41"><unientity>BCD0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 42"><unientity>BCD1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 43"><unientity>BCD2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 44"><unientity>BCD5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 45"><unientity>BCF4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 46"><unientity>BCF5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 47"><unientity>BCF6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 48"><unientity>BCF8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 49"><unientity>BCFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4A"><unientity>BD04</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4B"><unientity>BD05</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4C"><unientity>BD07</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4D"><unientity>BD09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4E"><unientity>BD10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 4F"><unientity>BD14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 50"><unientity>BD24</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 51"><unientity>BD48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 52"><unientity>BD49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 53"><unientity>BD4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 54"><unientity>BD50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 55"><unientity>BD58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 56"><unientity>BD59</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 57"><unientity>BD64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 58"><unientity>BD80</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 59"><unientity>BD81</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5A"><unientity>BD84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5B"><unientity>BD87</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5C"><unientity>BD88</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5D"><unientity>BD89</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5E"><unientity>BD90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 5F"><unientity>BD91</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 60"><unientity>BD93</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 61"><unientity>BD95</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 62"><unientity>BD99</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 63"><unientity>BD9C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 64"><unientity>BDD4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 65"><unientity>BDF0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 66"><unientity>BE0C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 67"><unientity>BE0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 68"><unientity>BE10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 69"><unientity>BE14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6A"><unientity>BE1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6B"><unientity>BE1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6C"><unientity>BE1F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6D"><unientity>BE44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6E"><unientity>BE45</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 6F"><unientity>BE48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 70"><unientity>BE4B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 71"><unientity>BE4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 72"><unientity>BE4E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 73"><unientity>BE54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 74"><unientity>BE55</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 75"><unientity>BE57</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 76"><unientity>BE59</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 77"><unientity>BE5A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 78"><unientity>BE5B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 7B"><unientity>BE60</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 7C"><unientity>BE61</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 7D"><unientity>BE64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 51 7E"><unientity>BE68</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 21"><unientity>BE70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 22"><unientity>BE71</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 23"><unientity>BE73</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 24"><unientity>BE74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 25"><unientity>BE75</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 26"><unientity>BE7B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 27"><unientity>BE7C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 28"><unientity>BE7D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 29"><unientity>BE80</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2A"><unientity>BE84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2B"><unientity>BE8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2C"><unientity>BE8F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2D"><unientity>BE90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2E"><unientity>BE91</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 2F"><unientity>BE98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 30"><unientity>BEA8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 31"><unientity>BED0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 32"><unientity>BED1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 33"><unientity>BED4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 34"><unientity>BED7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 35"><unientity>BED8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 36"><unientity>BEE0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 37"><unientity>BEE3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 38"><unientity>BEE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 39"><unientity>BEE5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3A"><unientity>BEEC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3B"><unientity>BF08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3C"><unientity>BF09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3D"><unientity>BF18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3E"><unientity>BF1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 3F"><unientity>BF40</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 40"><unientity>BF41</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 41"><unientity>BF44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 42"><unientity>BF48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 43"><unientity>BF50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 44"><unientity>BF51</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 45"><unientity>BF55</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 46"><unientity>BFB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 47"><unientity>BFC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 48"><unientity>BFC5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 49"><unientity>BFCC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4A"><unientity>BFCD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4B"><unientity>BFD0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4C"><unientity>BFD4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4D"><unientity>BFDC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4E"><unientity>BFDD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 4F"><unientity>BFE1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 50"><unientity>C058</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 51"><unientity>C059</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 52"><unientity>C05C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 53"><unientity>C060</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 54"><unientity>C068</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 55"><unientity>C069</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 56"><unientity>C090</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 57"><unientity>C091</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 58"><unientity>C094</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 59"><unientity>C098</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 5A"><unientity>C0A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 5B"><unientity>C0A3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 5C"><unientity>C0A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 5F"><unientity>C0AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 60"><unientity>C0AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 61"><unientity>C0AE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 62"><unientity>C0AF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 63"><unientity>C0B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 64"><unientity>C0B3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 65"><unientity>C0B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 66"><unientity>C0B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 67"><unientity>C0B6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 68"><unientity>C0BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 69"><unientity>C0BD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6A"><unientity>C0BF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6B"><unientity>C0C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6C"><unientity>C0C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6D"><unientity>C0C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6E"><unientity>C0C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 6F"><unientity>C0C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 70"><unientity>C0CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 71"><unientity>C0CF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 72"><unientity>C0D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 73"><unientity>C0D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 74"><unientity>C0D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 75"><unientity>C0DB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 76"><unientity>C0DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 77"><unientity>C0DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 78"><unientity>C0E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 79"><unientity>C0E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 7A"><unientity>C0E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 7B"><unientity>C0EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 7C"><unientity>C0F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 7D"><unientity>C0F7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 52 7E"><unientity>C0F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 21"><unientity>C11C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 22"><unientity>C11D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 23"><unientity>C11E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 24"><unientity>C120</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 25"><unientity>C123</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 26"><unientity>C124</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 27"><unientity>C125</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 28"><unientity>C126</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 29"><unientity>C127</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2A"><unientity>C12A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2B"><unientity>C12C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2C"><unientity>C12D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2D"><unientity>C12F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2E"><unientity>C130</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 2F"><unientity>C131</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 30"><unientity>C136</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 31"><unientity>C138</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 32"><unientity>C139</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 33"><unientity>C13C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 34"><unientity>C140</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 35"><unientity>C148</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 36"><unientity>C149</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 37"><unientity>C14B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 38"><unientity>C14D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 39"><unientity>C151</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3A"><unientity>C154</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3B"><unientity>C158</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3C"><unientity>C167</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3D"><unientity>C168</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3E"><unientity>C170</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 3F"><unientity>C18C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 40"><unientity>C18D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 41"><unientity>C18E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 42"><unientity>C190</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 43"><unientity>C194</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 44"><unientity>C19C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 45"><unientity>C19D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 46"><unientity>C19F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 47"><unientity>C1A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 48"><unientity>C1A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 49"><unientity>C1A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4A"><unientity>C1A9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4B"><unientity>C1B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4C"><unientity>C1C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4D"><unientity>C1C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4E"><unientity>C1D7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 4F"><unientity>C1E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 50"><unientity>C1E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 51"><unientity>C1E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 52"><unientity>C1F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 53"><unientity>C1F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 54"><unientity>C1F3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 55"><unientity>C1FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 56"><unientity>C1FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 57"><unientity>C200</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 58"><unientity>C204</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 59"><unientity>C20D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 5B"><unientity>C218</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 5C"><unientity>C219</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 5D"><unientity>C21C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 5E"><unientity>C21F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 5F"><unientity>C220</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 60"><unientity>C228</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 61"><unientity>C229</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 62"><unientity>C22B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 63"><unientity>C22D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 64"><unientity>C22F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 65"><unientity>C231</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 66"><unientity>C232</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 67"><unientity>C234</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 68"><unientity>C250</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 69"><unientity>C258</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6A"><unientity>C26C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6B"><unientity>C270</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6C"><unientity>C274</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6D"><unientity>C27C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6E"><unientity>C27D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 6F"><unientity>C27F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 70"><unientity>C281</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 71"><unientity>C288</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 72"><unientity>C289</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 73"><unientity>C290</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 74"><unientity>C298</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 75"><unientity>C29B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 76"><unientity>C29D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 77"><unientity>C2A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 78"><unientity>C2A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 79"><unientity>C2A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 7A"><unientity>C2AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 7B"><unientity>C2AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 7D"><unientity>C2B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 53 7E"><unientity>C2B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 21"><unientity>C2B7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 22"><unientity>C2B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 23"><unientity>C2DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 24"><unientity>C2DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 25"><unientity>C2E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 26"><unientity>C2E3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 27"><unientity>C2E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 28"><unientity>C2EB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 29"><unientity>C2EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 2A"><unientity>C2ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 2B"><unientity>C2EF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 2C"><unientity>C2F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 2D"><unientity>C2F6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 30"><unientity>C2F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 31"><unientity>C2F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 32"><unientity>C2FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 33"><unientity>C300</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 34"><unientity>C308</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 35"><unientity>C309</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 36"><unientity>C30B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 37"><unientity>C30C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 38"><unientity>C30D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 39"><unientity>C313</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3A"><unientity>C314</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3B"><unientity>C315</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3C"><unientity>C318</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3D"><unientity>C31C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3E"><unientity>C324</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 3F"><unientity>C327</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 40"><unientity>C328</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 41"><unientity>C329</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 42"><unientity>C330</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 43"><unientity>C343</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 44"><unientity>C345</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 45"><unientity>C368</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 46"><unientity>C369</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 47"><unientity>C36C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 48"><unientity>C370</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 49"><unientity>C372</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4A"><unientity>C378</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4B"><unientity>C379</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4C"><unientity>C37C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4D"><unientity>C37D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4E"><unientity>C384</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 4F"><unientity>C388</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 50"><unientity>C399</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 51"><unientity>C3D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 52"><unientity>C3D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 53"><unientity>C3DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 54"><unientity>C3DF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 55"><unientity>C3E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 56"><unientity>C3E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 57"><unientity>C3ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 58"><unientity>C3F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 59"><unientity>C3F5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5A"><unientity>C410</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5B"><unientity>C42C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5C"><unientity>C430</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5D"><unientity>C434</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5E"><unientity>C43C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 5F"><unientity>C43F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 60"><unientity>C464</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 61"><unientity>C465</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 62"><unientity>C468</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 63"><unientity>C46C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 64"><unientity>C474</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 65"><unientity>C479</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 66"><unientity>C480</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 67"><unientity>C494</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 68"><unientity>C4D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 69"><unientity>C4D5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6A"><unientity>C4F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6B"><unientity>C4F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6C"><unientity>C4F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6D"><unientity>C4F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6E"><unientity>C500</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 6F"><unientity>C501</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 70"><unientity>C50C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 71"><unientity>C510</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 72"><unientity>C528</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 73"><unientity>C529</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 74"><unientity>C52C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 75"><unientity>C530</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 76"><unientity>C538</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 77"><unientity>C539</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 78"><unientity>C53B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 79"><unientity>C53D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 7C"><unientity>C544</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 7D"><unientity>C545</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 54 7E"><unientity>C548</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 21"><unientity>C549</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 22"><unientity>C54A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 23"><unientity>C54C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 24"><unientity>C54E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 25"><unientity>C553</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 26"><unientity>C554</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 27"><unientity>C555</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 28"><unientity>C557</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 29"><unientity>C558</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2A"><unientity>C559</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2B"><unientity>C55E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2C"><unientity>C55F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2D"><unientity>C560</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2E"><unientity>C561</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 2F"><unientity>C564</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 30"><unientity>C568</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 31"><unientity>C570</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 32"><unientity>C571</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 33"><unientity>C573</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 34"><unientity>C574</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 35"><unientity>C575</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 36"><unientity>C57C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 37"><unientity>C57D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 38"><unientity>C580</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 39"><unientity>C584</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3A"><unientity>C587</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3B"><unientity>C58C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3C"><unientity>C58D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3D"><unientity>C58F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3E"><unientity>C590</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 3F"><unientity>C591</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 40"><unientity>C595</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 41"><unientity>C597</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 42"><unientity>C598</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 43"><unientity>C59C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 44"><unientity>C5B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 45"><unientity>C5B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 46"><unientity>C5B6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 47"><unientity>C5B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 48"><unientity>C5B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 49"><unientity>C5BA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4A"><unientity>C5BB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4B"><unientity>C5BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4C"><unientity>C5BD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4D"><unientity>C5C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4E"><unientity>C5C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 4F"><unientity>C5C6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 50"><unientity>C5C7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 51"><unientity>C5C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 52"><unientity>C5C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 53"><unientity>C5CA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 54"><unientity>C5CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 55"><unientity>C5CE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 56"><unientity>C5D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 57"><unientity>C5D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 58"><unientity>C5D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 59"><unientity>C5D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5A"><unientity>C5E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5B"><unientity>C5E1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5C"><unientity>C5E3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5D"><unientity>C5E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5E"><unientity>C5EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 5F"><unientity>C5ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 60"><unientity>C5EE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 61"><unientity>C5F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 62"><unientity>C5F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 63"><unientity>C5F6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 64"><unientity>C5F7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 65"><unientity>C5FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 66"><unientity>C5FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 67"><unientity>C5FE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 68"><unientity>C5FF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 69"><unientity>C600</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6A"><unientity>C601</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6B"><unientity>C606</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6C"><unientity>C607</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6D"><unientity>C608</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6E"><unientity>C60C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 6F"><unientity>C610</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 70"><unientity>C61B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 71"><unientity>C624</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 72"><unientity>C625</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 73"><unientity>C628</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 74"><unientity>C62C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 75"><unientity>C62D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 76"><unientity>C62E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 77"><unientity>C633</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 78"><unientity>C634</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 79"><unientity>C635</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 7A"><unientity>C637</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 7B"><unientity>C639</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 7C"><unientity>C63A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 7D"><unientity>C63B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 55 7E"><unientity>C640</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 21"><unientity>C641</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 22"><unientity>C644</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 23"><unientity>C648</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 24"><unientity>C650</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 25"><unientity>C651</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 26"><unientity>C653</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 27"><unientity>C654</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 29"><unientity>C65C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2A"><unientity>C65D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2B"><unientity>C660</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2C"><unientity>C671</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2D"><unientity>C678</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2E"><unientity>C679</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 2F"><unientity>C67C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 30"><unientity>C680</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 31"><unientity>C688</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 32"><unientity>C68B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 33"><unientity>C68D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 34"><unientity>C694</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 35"><unientity>C695</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 36"><unientity>C698</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 37"><unientity>C6A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 38"><unientity>C6A7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 39"><unientity>C6A9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3A"><unientity>C6B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3B"><unientity>C6B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3C"><unientity>C6B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3D"><unientity>C6B7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3E"><unientity>C6B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 3F"><unientity>C6B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 40"><unientity>C6BA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 41"><unientity>C6C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 42"><unientity>C6C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 43"><unientity>C6C3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 44"><unientity>C6C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 45"><unientity>C6CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 46"><unientity>C6CD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 47"><unientity>C6D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 48"><unientity>C6D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 49"><unientity>C6DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4A"><unientity>C6DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4B"><unientity>C6DF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4C"><unientity>C6E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4D"><unientity>C6E1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4E"><unientity>C6E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 4F"><unientity>C6E9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 50"><unientity>C6EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 51"><unientity>C6F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 52"><unientity>C6F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 53"><unientity>C704</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 54"><unientity>C705</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 55"><unientity>C708</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 56"><unientity>C70C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 57"><unientity>C714</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 58"><unientity>C717</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 59"><unientity>C719</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5A"><unientity>C720</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5B"><unientity>C721</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5C"><unientity>C724</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5D"><unientity>C728</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5E"><unientity>C730</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 5F"><unientity>C735</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 60"><unientity>C737</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 61"><unientity>C73C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 62"><unientity>C73D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 63"><unientity>C740</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 64"><unientity>C744</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 65"><unientity>C74A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 66"><unientity>C74C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 67"><unientity>C74D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 68"><unientity>C751</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 69"><unientity>C758</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6A"><unientity>C774</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6B"><unientity>C775</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6C"><unientity>C778</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6D"><unientity>C77C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6E"><unientity>C77D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 6F"><unientity>C783</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 70"><unientity>C784</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 71"><unientity>C785</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 72"><unientity>C787</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 73"><unientity>C788</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 74"><unientity>C789</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 75"><unientity>C78A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 76"><unientity>C78E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 77"><unientity>C655</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 79"><unientity>C790</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 7A"><unientity>C791</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 7B"><unientity>C794</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 7C"><unientity>C796</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 7D"><unientity>C798</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 56 7E"><unientity>C7A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 21"><unientity>C7A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 22"><unientity>C7A3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 23"><unientity>C7A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 24"><unientity>C7A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 25"><unientity>C7A6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 26"><unientity>C7A7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 27"><unientity>C7AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 28"><unientity>C7AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 29"><unientity>C7B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2A"><unientity>C7B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2B"><unientity>C7BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2C"><unientity>C7BD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2D"><unientity>C7BF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2E"><unientity>C7C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 2F"><unientity>C7C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 30"><unientity>C7C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 31"><unientity>C7C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 32"><unientity>C7CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 33"><unientity>C7D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 34"><unientity>C800</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 35"><unientity>C801</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 36"><unientity>C804</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 37"><unientity>C808</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 38"><unientity>C80A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 39"><unientity>C810</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3A"><unientity>C811</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3B"><unientity>C813</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3C"><unientity>C814</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3D"><unientity>C815</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3E"><unientity>C816</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 3F"><unientity>C81C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 40"><unientity>C81D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 41"><unientity>C820</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 42"><unientity>C824</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 43"><unientity>C82C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 44"><unientity>C82D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 45"><unientity>C82F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 46"><unientity>C838</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 47"><unientity>C83C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 48"><unientity>C84C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 49"><unientity>C870</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4A"><unientity>C871</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4B"><unientity>C874</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4C"><unientity>C878</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4D"><unientity>C87A</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4E"><unientity>C880</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 4F"><unientity>C881</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 50"><unientity>C885</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 51"><unientity>C886</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 52"><unientity>C887</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 53"><unientity>C88B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 54"><unientity>C88C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 55"><unientity>C88D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 56"><unientity>C890</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 57"><unientity>C894</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 58"><unientity>C89C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 59"><unientity>C89D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 5A"><unientity>C89F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 5B"><unientity>C8A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 5D"><unientity>C8A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 5E"><unientity>C8AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 5F"><unientity>C8B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 60"><unientity>C8B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 61"><unientity>C8C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 62"><unientity>C8C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 63"><unientity>C8CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 64"><unientity>C8D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 65"><unientity>C8D5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 66"><unientity>C8D7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 67"><unientity>C8E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 68"><unientity>C8E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 69"><unientity>C8F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6A"><unientity>C8F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6B"><unientity>C8F5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6C"><unientity>C8FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6D"><unientity>C8FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6E"><unientity>C900</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 6F"><unientity>C904</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 70"><unientity>C906</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 71"><unientity>C90C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 72"><unientity>C90D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 73"><unientity>C90F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 74"><unientity>C911</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 75"><unientity>C918</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 76"><unientity>C92C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 77"><unientity>C950</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 79"><unientity>C954</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 7A"><unientity>C958</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 7B"><unientity>C960</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 7C"><unientity>C961</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 7D"><unientity>C96C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 57 7E"><unientity>C970</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 21"><unientity>C974</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 22"><unientity>C988</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 23"><unientity>C989</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 24"><unientity>C98C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 25"><unientity>C990</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 26"><unientity>C998</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 27"><unientity>C999</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 28"><unientity>C99D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 29"><unientity>C9C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2A"><unientity>C9C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2B"><unientity>C9C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2C"><unientity>C9C7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2D"><unientity>C9C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2E"><unientity>C9CA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 2F"><unientity>C9D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 30"><unientity>C9D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 31"><unientity>C9D3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 32"><unientity>C9D5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 33"><unientity>C9D6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 34"><unientity>C9D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 35"><unientity>C9DA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 38"><unientity>C9DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 39"><unientity>C9DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 3A"><unientity>C9E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 3B"><unientity>C9E2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 3C"><unientity>C9E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 3E"><unientity>C9E7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 3F"><unientity>C9EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 40"><unientity>C9ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 41"><unientity>C9EF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 42"><unientity>C9F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 43"><unientity>C9F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 44"><unientity>C9F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 45"><unientity>C9F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 46"><unientity>C9FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 47"><unientity>CA00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 48"><unientity>CA08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 49"><unientity>CA09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4A"><unientity>CA0B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4B"><unientity>CA0C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4C"><unientity>CA0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4D"><unientity>CA18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4E"><unientity>CA4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 4F"><unientity>CA4D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 50"><unientity>CA50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 51"><unientity>CA54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 52"><unientity>CA5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 53"><unientity>CA5D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 54"><unientity>CA61</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 55"><unientity>CA84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 56"><unientity>CA98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 57"><unientity>CABC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 58"><unientity>CABD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 59"><unientity>CAC0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5A"><unientity>CAC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5B"><unientity>CACC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5C"><unientity>CACD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5D"><unientity>CAD1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5E"><unientity>CAD2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 5F"><unientity>CAD3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 60"><unientity>CAD8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 61"><unientity>CAD9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 62"><unientity>CB10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 63"><unientity>CB14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 64"><unientity>CB18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 65"><unientity>CB20</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 66"><unientity>CB21</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 67"><unientity>CB41</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 68"><unientity>CB48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 69"><unientity>CB49</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6A"><unientity>CB50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6B"><unientity>CB58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6C"><unientity>CB59</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6D"><unientity>CB5D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6E"><unientity>CB64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 6F"><unientity>CBB8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 70"><unientity>CBD4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 71"><unientity>CBE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 72"><unientity>CBE7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 73"><unientity>CC0C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 74"><unientity>CC0D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 75"><unientity>CC10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 76"><unientity>CC14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 77"><unientity>CC1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 78"><unientity>CC1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 79"><unientity>CC21</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 7A"><unientity>CC22</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 7B"><unientity>CC27</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 58 7E"><unientity>CC28</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 21"><unientity>CC29</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 22"><unientity>CC2C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 23"><unientity>CC2E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 24"><unientity>CC2F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 25"><unientity>CC30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 26"><unientity>CC38</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 27"><unientity>CC39</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 28"><unientity>CC3B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 29"><unientity>CC3C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2A"><unientity>CC3D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2B"><unientity>CC3E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2C"><unientity>CC3F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2D"><unientity>CC44</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2E"><unientity>CC45</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 2F"><unientity>CC48</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 30"><unientity>CC4C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 31"><unientity>CC54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 32"><unientity>CC55</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 33"><unientity>CC58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 34"><unientity>CC59</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 35"><unientity>CC60</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 36"><unientity>CC64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 37"><unientity>CC70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 38"><unientity>CC71</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 39"><unientity>CC98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3A"><unientity>CC99</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3B"><unientity>CC9C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3C"><unientity>CCA0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3D"><unientity>CCA8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3E"><unientity>CCA9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 3F"><unientity>CCAB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 40"><unientity>CCAD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 41"><unientity>CCB4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 42"><unientity>CCB5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 43"><unientity>CCB8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 44"><unientity>CCBC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 45"><unientity>CCC7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 46"><unientity>CCD0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 47"><unientity>CCE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 48"><unientity>CD08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 49"><unientity>CD09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4A"><unientity>CD0C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4B"><unientity>CD10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4C"><unientity>CD18</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4D"><unientity>CD19</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4E"><unientity>CD1B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 4F"><unientity>CD1D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 50"><unientity>CD2C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 51"><unientity>CD5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 52"><unientity>CD78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 53"><unientity>CD94</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 54"><unientity>CD95</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 55"><unientity>CD98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 56"><unientity>CD9C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 57"><unientity>CDA4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 58"><unientity>CDA5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 59"><unientity>CDA7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5A"><unientity>CDA9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5B"><unientity>CDB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5C"><unientity>CDC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5D"><unientity>CDCC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5E"><unientity>CDE8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 5F"><unientity>CE04</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 60"><unientity>CE20</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 61"><unientity>CE21</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 62"><unientity>CE30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 63"><unientity>CE35</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 64"><unientity>CE58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 65"><unientity>CE59</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 66"><unientity>CE5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 67"><unientity>CE60</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 68"><unientity>CE61</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 69"><unientity>CE68</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 6A"><unientity>CE69</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 6B"><unientity>CE6B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 6C"><unientity>CE6D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 6F"><unientity>CE74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 70"><unientity>CE75</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 71"><unientity>CE78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 72"><unientity>CE7C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 73"><unientity>CE84</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 74"><unientity>CE85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 75"><unientity>CE87</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 76"><unientity>CE89</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 77"><unientity>CE90</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 78"><unientity>CE91</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 79"><unientity>CE94</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 7A"><unientity>CE98</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 7B"><unientity>CEA0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 7C"><unientity>CEA1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 59 7D"><unientity>CEA3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 21"><unientity>CEA5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 22"><unientity>CEAC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 23"><unientity>CEAD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 24"><unientity>CEE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 26"><unientity>CEE8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 27"><unientity>CEEC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 28"><unientity>CEF4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 29"><unientity>CEF5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 2A"><unientity>CEF7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 2C"><unientity>CEF9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 2E"><unientity>CF00</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 2F"><unientity>CF01</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 30"><unientity>CF04</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 31"><unientity>CF08</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 32"><unientity>CF10</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 33"><unientity>CF11</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 34"><unientity>CF13</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 35"><unientity>CF15</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 36"><unientity>CF1C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 37"><unientity>CF20</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 38"><unientity>CF24</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 39"><unientity>CF2C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3A"><unientity>CF2D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3B"><unientity>CF2F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3C"><unientity>CF30</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3D"><unientity>CF54</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3E"><unientity>CF55</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 3F"><unientity>CF58</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 40"><unientity>CF5C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 41"><unientity>CF64</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 42"><unientity>CF65</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 43"><unientity>CF67</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 44"><unientity>CF69</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 45"><unientity>CF70</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 46"><unientity>CF71</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 47"><unientity>CF74</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 48"><unientity>CF78</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 49"><unientity>CF80</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 4A"><unientity>CF85</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 4B"><unientity>CF8C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 4C"><unientity>CF8D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 4D"><unientity>CFA1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 4F"><unientity>CFB0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 50"><unientity>CFC4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 51"><unientity>CFE0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 52"><unientity>CFE1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 53"><unientity>CFE4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 54"><unientity>CFE8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 55"><unientity>CFF0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 56"><unientity>CFF3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 57"><unientity>CFF5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 58"><unientity>CFFC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5A"><unientity>D018</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5B"><unientity>D02D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5C"><unientity>D034</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5D"><unientity>D035</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5E"><unientity>D038</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 5F"><unientity>D050</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 60"><unientity>D06C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 61"><unientity>D070</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 62"><unientity>D074</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 63"><unientity>D07C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 64"><unientity>D07D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 65"><unientity>D081</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 66"><unientity>D0A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 67"><unientity>D0A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 68"><unientity>D0A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 69"><unientity>D0AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 6A"><unientity>D0B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 6B"><unientity>D0B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 6C"><unientity>D0B7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 6D"><unientity>D0B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 70"><unientity>D0C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 71"><unientity>D0C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 72"><unientity>D0C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 73"><unientity>D0C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 74"><unientity>D0C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 75"><unientity>D0D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 76"><unientity>D0D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 77"><unientity>D0D3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 78"><unientity>D0D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 79"><unientity>D0D5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 7A"><unientity>D0DC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 7B"><unientity>D0DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 7C"><unientity>D0E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 7D"><unientity>D0E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5A 7E"><unientity>D0EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 21"><unientity>D0ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 22"><unientity>D0EF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 23"><unientity>D0F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 24"><unientity>D0F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 25"><unientity>D130</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 26"><unientity>D131</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 27"><unientity>D134</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 28"><unientity>D138</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 29"><unientity>D140</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2A"><unientity>D141</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2B"><unientity>D143</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2C"><unientity>D144</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2D"><unientity>D145</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2E"><unientity>D14C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 2F"><unientity>D14D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 30"><unientity>D150</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 31"><unientity>D154</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 32"><unientity>D15C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 33"><unientity>D15D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 34"><unientity>D15F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 35"><unientity>D160</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 36"><unientity>D161</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 37"><unientity>D168</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 38"><unientity>D1A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 39"><unientity>D1A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3A"><unientity>D1A4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3B"><unientity>D1A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3C"><unientity>D1B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3D"><unientity>D1B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3E"><unientity>D1B3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 3F"><unientity>D1B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 40"><unientity>D1D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 41"><unientity>D1F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 43"><unientity>D22C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 44"><unientity>D22D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 45"><unientity>D230</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 46"><unientity>D234</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 47"><unientity>D23C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 48"><unientity>D23D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 49"><unientity>D23F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4A"><unientity>D241</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4B"><unientity>D264</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4C"><unientity>D277</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4D"><unientity>D280</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4E"><unientity>D284</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 4F"><unientity>D288</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 50"><unientity>D290</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 51"><unientity>D291</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 52"><unientity>D293</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 53"><unientity>D295</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 54"><unientity>D29C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 57"><unientity>D2AC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 59"><unientity>D2B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5A"><unientity>D2B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5B"><unientity>D2BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5C"><unientity>D2BF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5D"><unientity>D2C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5E"><unientity>D2C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 5F"><unientity>D2C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 60"><unientity>D2CB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 61"><unientity>D2D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 62"><unientity>D1F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 63"><unientity>D2F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 64"><unientity>D2F1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 65"><unientity>D2F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 66"><unientity>D2F8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 67"><unientity>D300</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 68"><unientity>D301</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 69"><unientity>D305</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 6C"><unientity>D30C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 6D"><unientity>D30D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 6E"><unientity>D30E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 6F"><unientity>D310</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 70"><unientity>D314</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 71"><unientity>D31C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 72"><unientity>D31D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 73"><unientity>D31F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 74"><unientity>D320</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 75"><unientity>D321</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 76"><unientity>D325</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 77"><unientity>D328</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 78"><unientity>D329</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 79"><unientity>D32C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 7A"><unientity>D330</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 7B"><unientity>D338</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 7C"><unientity>D339</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 7D"><unientity>D33B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5B 7E"><unientity>D33C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 21"><unientity>D33D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 23"><unientity>D37C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 24"><unientity>D37D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 25"><unientity>D380</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 26"><unientity>D384</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 27"><unientity>D38C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 28"><unientity>D38D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 29"><unientity>D38F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2A"><unientity>D390</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2B"><unientity>D391</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2C"><unientity>D398</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2D"><unientity>D399</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2E"><unientity>D39C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 2F"><unientity>D3A0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 30"><unientity>D3A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 31"><unientity>D3A9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 32"><unientity>D3AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 33"><unientity>D3AD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 34"><unientity>D3B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 35"><unientity>D3B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 36"><unientity>D3B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 37"><unientity>D3BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 38"><unientity>D3C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 39"><unientity>D3C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3A"><unientity>D3C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3B"><unientity>D3C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3C"><unientity>D3D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3D"><unientity>D3EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3E"><unientity>D3ED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 3F"><unientity>D3F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 40"><unientity>D3F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 41"><unientity>D3FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 42"><unientity>D3FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 43"><unientity>D3FF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 44"><unientity>D401</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 45"><unientity>D440</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 46"><unientity>D444</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 47"><unientity>D45C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 48"><unientity>D46F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 49"><unientity>D478</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4A"><unientity>D479</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4B"><unientity>D47C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4C"><unientity>D480</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4D"><unientity>D488</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4E"><unientity>D489</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 4F"><unientity>D48B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 50"><unientity>D48D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 51"><unientity>D4CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 52"><unientity>D4E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 53"><unientity>D504</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 55"><unientity>D508</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 56"><unientity>D50C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 57"><unientity>D514</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 58"><unientity>D515</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 59"><unientity>D53C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5A"><unientity>D53D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5B"><unientity>D540</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5C"><unientity>D544</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5D"><unientity>D54C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5E"><unientity>D54D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 5F"><unientity>D54F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 60"><unientity>D551</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 63"><unientity>D558</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 64"><unientity>D559</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 65"><unientity>D55C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 66"><unientity>D560</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 67"><unientity>D565</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 68"><unientity>D568</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 69"><unientity>D569</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6A"><unientity>D56B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6B"><unientity>D56C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6C"><unientity>D56D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6D"><unientity>D571</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6E"><unientity>D574</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 6F"><unientity>D575</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 70"><unientity>D578</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 71"><unientity>D57C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 72"><unientity>D584</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 73"><unientity>D585</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 74"><unientity>D587</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 75"><unientity>D588</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 76"><unientity>D589</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 77"><unientity>D590</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 78"><unientity>D5A5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 79"><unientity>D5C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 7A"><unientity>D5C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 7B"><unientity>D5CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 7C"><unientity>D5D0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 7D"><unientity>D5D2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5C 7E"><unientity>D5D8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 21"><unientity>D5D9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 22"><unientity>D5DB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 23"><unientity>D5DD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 24"><unientity>D5E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 25"><unientity>D5E5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 26"><unientity>D5E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 27"><unientity>D5EC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 28"><unientity>D5F4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 29"><unientity>D5F5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2A"><unientity>D5F7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2B"><unientity>D5F9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2C"><unientity>D600</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2D"><unientity>D601</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2E"><unientity>D604</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 2F"><unientity>D608</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 30"><unientity>D610</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 31"><unientity>D611</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 32"><unientity>D613</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 33"><unientity>D614</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 34"><unientity>D615</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 35"><unientity>D61C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 36"><unientity>D638</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 37"><unientity>D639</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 38"><unientity>D63C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 39"><unientity>D640</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 3A"><unientity>D648</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 3B"><unientity>D649</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 3C"><unientity>D64B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 3D"><unientity>D64D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 3F"><unientity>D654</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 40"><unientity>D655</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 41"><unientity>D658</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 42"><unientity>D65C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 44"><unientity>D667</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 45"><unientity>D669</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 46"><unientity>D670</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 47"><unientity>D671</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 48"><unientity>D683</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4A"><unientity>D68C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4B"><unientity>D68D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4C"><unientity>D69F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4D"><unientity>D6A1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4E"><unientity>D6A8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 4F"><unientity>D6C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 50"><unientity>D6C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 51"><unientity>D6C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 52"><unientity>D6CC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 53"><unientity>D6D1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 54"><unientity>D6D4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 55"><unientity>D6D7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 56"><unientity>D6E0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 57"><unientity>D6E4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 58"><unientity>D6E8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 59"><unientity>D6F0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 5A"><unientity>D6FC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 5C"><unientity>D700</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 5D"><unientity>D711</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 5E"><unientity>D718</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 5F"><unientity>D719</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 60"><unientity>D71C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 61"><unientity>D720</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 62"><unientity>D728</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 63"><unientity>D729</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 65"><unientity>D72D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 66"><unientity>D734</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 67"><unientity>D73C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 68"><unientity>D744</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 69"><unientity>D749</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6A"><unientity>D750</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6B"><unientity>D751</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6C"><unientity>D754</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6D"><unientity>D757</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6E"><unientity>D758</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 6F"><unientity>D759</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 70"><unientity>D760</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 71"><unientity>D761</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 72"><unientity>D763</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 73"><unientity>D765</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 74"><unientity>D769</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 75"><unientity>D76C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 76"><unientity>D770</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 77"><unientity>D774</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 78"><unientity>D788</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 79"><unientity>D789</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 7A"><unientity>D78C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 7B"><unientity>D790</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 7C"><unientity>D798</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 7D"><unientity>D799</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5D 7E"><unientity>D79B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 5E 21"><unientity>D79D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 21"><unientity>3181</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 22"><unientity>3186</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 23"><unientity>317F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 24"><unientity>E8B0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 25"><unientity>E8B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 40"><unientity>E8B2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 41"><unientity>E8B3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 42"><unientity>E8B4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 43"><unientity>E8B5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 44"><unientity>E8B6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 45"><unientity>E8B7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 46"><unientity>E8B8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 47"><unientity>E8B9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 48"><unientity>E8BA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 49"><unientity>E8BB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4A"><unientity>E8BC</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4B"><unientity>E8BD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4C"><unientity>E8BE</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4D"><unientity>E8BF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4E"><unientity>E8C0</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 4F"><unientity>E8C1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 50"><unientity>E8C2</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 51"><unientity>E8C3</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 52"><unientity>E8C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 53"><unientity>E8C5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 54"><unientity>E8C6</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 55"><unientity>E8C7</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 56"><unientity>E8C8</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 76 57"><unientity>E8C9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 21"><unientity>AD35</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 22"><unientity>AD7B</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 23"><unientity>E8CA</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 24"><unientity>AD89</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 25"><unientity>AD9D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 26"><unientity>ADB9</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 27"><unientity>ADD5</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 28"><unientity>AE07</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 29"><unientity>AE0E</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2A"><unientity>AE0F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2B"><unientity>AE11</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2C"><unientity>AE14</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2D"><unientity>AE5F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2E"><unientity>AEED</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 2F"><unientity>AF09</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 30"><unientity>AF50</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 31"><unientity>AFBF</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 32"><unientity>B060</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 33"><unientity>B9C4</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 34"><unientity>C54D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 35"><unientity>C54F</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 36"><unientity>C552</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 37"><unientity>C5AB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 38"><unientity>C5B1</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 39"><unientity>C61C</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 3A"><unientity>C61D</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 3B"><unientity>C6FD</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 3C"><unientity>E8CB</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 3D"><unientity>C733</unientity><desc>Korean hangul</desc></character>
+<character hex="6F 77 3E"><unientity>CB4C</unientity><desc>Korean hangul</desc></character>
+<character hex="70 4C 2A"><unientity>915E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 58 6F"><unientity>4EEB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5B 71"><unientity>57B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5C 43"><unientity>82CA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5C 50"><unientity>82C4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5D 46"><unientity>841C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5D 5C"><unientity>8488</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 30"><unientity>7519</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 39"><unientity>5416</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 50"><unientity>549D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 51"><unientity>54D0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 54"><unientity>54B4</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 5B"><unientity>54A3</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 5F 61"><unientity>54DA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 2D"><unientity>55B9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 3A"><unientity>55EA</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 4C"><unientity>55F5</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 54"><unientity>5623</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 58"><unientity>562D</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 60 67"><unientity>567B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 61 31"><unientity>5C9C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 62 2A"><unientity>7339</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 62 47"><unientity>9987</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 62 4E"><unientity>9995</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 63 40"><unientity>61B7</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 66 40"><unientity>80EC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 42"><unientity>80BC</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 44"><unientity>80BD</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 4C"><unientity>80E9</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 5B"><unientity>810E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 5F"><unientity>8112</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6B 6A"><unientity>8159</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6C 42"><unientity>70BB</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6C 43"><unientity>70C0</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6D 3B"><unientity>7818</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6D 3F"><unientity>781C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 6D 45"><unientity>783C</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 72 7D"><unientity>87A8</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 73 60"><unientity>7B7B</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 73 6E"><unientity>7BA2</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 74 38"><unientity>823E</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 75 23"><unientity>9170</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 75 5D"><unientity>8E3A</unientity><desc>East Asian ideograph</desc></character>
+<character hex="70 77 5D"><unientity>9B0F</unientity><desc>East Asian ideograph</desc></character>
+</entitymap>
\ No newline at end of file
--- /dev/null
+NegotiationRecordDefinition-charSetandLanguageNegotiation-3
+{Z39-50-negotiationRecordDefinition CharSetandLanguageNegotiation-3 (3)}
+DEFINITIONS ::= BEGIN
+IMPORTS LanguageCode FROM RecordSyntax-explain;
+
+CharSetandLanguageNegotiation ::= CHOICE{
+ proposal [1] IMPLICIT OriginProposal,
+ response [2] IMPLICIT TargetResponse}
+--
+-- For character sets:
+-- Origin proposes one, two, or all three of the following, in order of
+-- preference:
+-- (a) 2022 character sets.
+-- (b) 10646 character set.
+-- (c) Private character set.
+--
+-- The target responds with one of (a), (b), or (c), indicating the
+-- character set(s) to be supported for all name and message strings.
+--
+-- If the origin includes (a),
+-- the origin proposes:
+-- (1) A proposed environment: 7-bit, 8-bit, or no-preference.
+-- (2) A set of iso 2022 registration numbers.
+-- (3) One or more proposed initial sets of registration numbers,
+-- for c0, c1, g0, g1, g2 and g3. These must come from (2).
+-- (4) The proposed encoding level.
+-- And if the target selects (a), it responds with:
+-- (1) A selected environment: 7-bit or 8-bit.
+-- (2) A subset of the set of iso 2022 registration numbers proposed
+-- by the origin.
+-- (3) The initial set of registrations, which must come from (2)
+-- but need not be from the set of initial registrations proposed
+-- by the origin.
+-- (4) The encoding level; less than or equal to that proposed.
+--
+-- If the origin includes (b),
+-- The origin proposes:
+-- (1) (optionally) A list of collections (i.e. subsets of characters from the
+-- complete 10646 definition).
+-- (2) An implementation level.
+-- (3) Syntax/form: e.g. ucs-2, ucs-4, utf-8, utf-16.
+-- And if the target selects (b), it responds by choosing a subset of the
+-- collections proposed by the origin in (1) and an implementation level less
+-- than or equal to that proposed by the origin in (2).
+--
+-- If the origin includes (c), the origin proposes one of the following:
+-- (1) A list of private character sets, by one or more object
+-- identifiers.
+-- (2) A list of private character sets, by an EXTERNAL.
+-- (3) An indication to use a private, previously agreed upon
+-- character set.
+-- And if the target selects (c):
+-- - If the origin proposed (1), the target should respond with (1), and
+-- the list of object identifiers should be a subset of the list that
+-- the origin included.
+-- - If the origin proposed (2), the target should respond with (2), using
+-- the same EXTERNAL definition (but not necessarily the same content)
+-- used by the origin.
+-- - If the origin proposed (3), the target should respond with (3).
+--
+-- For Languages:
+-- The origin optionally proposes one or more language codes. The target
+-- response may include a single language code, which indicates the
+-- language to be used for all message strings. The target may include or
+-- omit this, whether or not the origin included a proposed set, and the
+-- language code indicated need not be from among those proposed.
+--
+--
+
+OriginProposal ::= SEQUENCE {
+ proposedCharSets [1] IMPLICIT SEQUENCE OF CHOICE{
+ -- Each should occur at most once, and in order of preference
+ -- (the "order of preference" is the reason why this is
+ -- "SEQUENCE OF CHOICE" rather than just "SEQUENCE")
+ iso2022 [1] Iso2022,
+ iso10646 [2] IMPLICIT Iso10646,
+ private [3] PrivateCharacterSet} OPTIONAL,
+ -- proposedCharSets must be omitted
+ -- if origin proposes version 2
+ proposedlanguages [2] IMPLICIT SEQUENCE OF LanguageCode OPTIONAL,
+ recordsInSelectedCharSets [3] IMPLICIT BOOLEAN OPTIONAL
+ -- default 'false'. See rule 6 above.
+ }
+
+TargetResponse ::= SEQUENCE{
+ selectedCharSets [1] CHOICE{
+ iso2022 [1] Iso2022,
+ iso10646 [2] IMPLICIT Iso10646,
+ private [3] PrivateCharacterSet,
+ none [4] IMPLICIT NULL
+ -- If selected, no negotiation
+ -- is assumed to be in force
+ -- for character sets.
+ } OPTIONAL,
+ -- Omitted if and only if proposedCharSets
+ -- was Omitted in the request.
+ selectedLanguage [2] IMPLICIT LanguageCode OPTIONAL,
+ recordsInSelectedCharSets [3] IMPLICIT BOOLEAN OPTIONAL
+ -- Omitted if and only if 'recordsInSelectedCharSets' was omitted
+ -- in the request. See rule 6 above.
+ }
+
+
+PrivateCharacterSet ::= CHOICE{
+ viaOid [1] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+ externallySpecified [2] IMPLICIT EXTERNAL,
+ previouslyAgreedUpon [3] IMPLICIT NULL}
+
+-- IMPORTED
+-- LanguageCode ::= GeneralString -- from ANSI Z39.53-1994
+
+-- Definition of ISO2022
+-- For ISO 2022, the following is negotiated:
+-- 1) The environment: 7-bit or 8-bit;
+-- 2) a set of registration numbers (from the ISO Register of coded
+-- character sets) for graphical and control character sets;
+-- 3) g0, g1, g2, g3, c0, c1, the registration numbers of the graphical and
+-- control character sets that are initially designated to g0, g1, etc.
+-- The origin submits one or more sequences of values for
+-- g0, g1, g2, g3, c0, c1 (for each sequence: at least one of
+-- g0 and g1 must be included; g2 and g3 are optional and
+-- may be included only if g1 is included;
+-- c0 should be included; and c1 is optional); the target
+-- selects one of the proposed sequences.
+-- 4) gleft: which of g0, g1, g2 or g3, initially has GL shift status in
+-- an 8-bit environment or has shift status in a 7-bit environment; and
+-- 5) gright: which of g1, g2 or g3 initially has GR shift status in an
+-- 8-bit environment.
+
+Iso2022 ::= CHOICE{
+ originProposal [1] IMPLICIT SEQUENCE{
+ proposedEnvironment [0] Environment OPTIONAL,
+ -- omitted means no preference
+ proposedSets [1] IMPLICIT SEQUENCE OF INTEGER,
+ proposedInitialSets [2] IMPLICIT SEQUENCE OF
+ InitialSet,
+ proposedLeftAndRight [3] IMPLICIT LeftAndRight},
+ targetResponse [2] IMPLICIT SEQUENCE{
+ selectedEnvironment [0] Environment,
+ selectedSets [1] IMPLICIT SEQUENCE OF INTEGER,
+ selectedinitialSet [2] IMPLICIT InitialSet,
+ selectedLeftAndRight [3] IMPLICIT LeftAndRight}}
+
+Environment ::= CHOICE{
+ sevenBit [1] IMPLICIT NULL,
+ eightBit [2] IMPLICIT NULL}
+
+InitialSet::= SEQUENCE{
+ g0 [0] IMPLICIT INTEGER OPTIONAL,
+ g1 [1] IMPLICIT INTEGER OPTIONAL,
+ -- one of g0 and g1 must be included
+ g2 [2] IMPLICIT INTEGER OPTIONAL,
+ g3 [3] IMPLICIT INTEGER OPTIONAL,
+ --g2 and/or g3 may be included
+ -- only if g1 was included
+ c0 [4] IMPLICIT INTEGER,
+ c1 [5] IMPLICIT INTEGER OPTIONAL}
+
+LeftAndRight ::= SEQUENCE{
+ gLeft [3] IMPLICIT INTEGER{
+ g0 (0),
+ g1 (1),
+ g2 (2),
+ g3 (3)},
+ gRight [4] IMPLICIT INTEGER{
+ g1 (1),
+ g2 (2),
+ g3 (3)} OPTIONAL}
+
+-- Definition of Iso10646
+--
+-- The 10646 object identifier looks like:
+-- 1.0.10646.1.implementationLevel.repertoireSubset.arc1.arc2. ....
+--
+-- (The second '1' is for "part 1" of 10646.)
+--
+-- ImplementationLevel is 1-3
+--
+-- repertoireSubset is 0 or 1, for 'all' or 'collections'.
+-- The arcs are present only if repertoireSubset is 'collections',
+-- in which case arc1, arc2, etc., are the
+-- identifiers of collections of character repertoires.
+--
+-- There is a second 10646 oid, for specifying syntax/form:
+-- 1.0.10646.1.0.form
+--
+-- (The second '0' represents "transfer syntax".)
+--
+-- where values of form include:
+-- 2: ucs-2
+-- 4: ucs-4
+-- 5: utf-16
+-- 8: utf-8
+
+Iso10646 ::= SEQUENCE{
+ collections [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ --oid of form 1.0.10646.1.implementationLevel
+ -- .repertoireSubset.arc1.arc2. ....
+ -- Target to choose a subset of the collections
+ -- proposed by the origin, and an implementation level
+ -- less than or equal to that proposed.
+ --
+ -- when 'collections' is omitted,
+ -- 'implementationLevel' defaults to 3.
+ --
+ encodingLevel [2] IMPLICIT OBJECT IDENTIFIER
+ -- oid of form 1.0.10646.1.0.form
+ -- where value of 'form' is 2, 4, 5, or 8
+ -- for ucs-2, ucs-4, utf-16, utf-8
+ }
+END
+
--- /dev/null
+/*
+ $ $Id: charneg.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ * Helper functions for Character Set and Language Negotiation - 3
+ */
+
+#include <stdio.h>
+#include <yaz/otherinfo.h>
+#include <yaz/z-charneg.h>
+#include <yaz/charneg.h>
+#include <yaz/yaz-util.h>
+
+static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value,
+ const char *buf)
+{
+ Z_External *p;
+ oident oid;
+ int len = strlen(buf);
+
+ if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0;
+
+ p->descriptor = 0;
+ p->indirect_reference = 0;
+
+ oid.proto = PROTO_Z3950;
+ oid.oclass = (enum oid_class) oid_class;
+ oid.value = (enum oid_value) oid_value;
+ p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+
+ p->which = Z_External_octet;
+ if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) {
+ return 0;
+ }
+ if (!(p->u.octet_aligned->buf = (unsigned char *)odr_malloc(o, len))) {
+ return 0;
+ }
+ p->u.octet_aligned->len = p->u.octet_aligned->size = len;
+ memcpy(p->u.octet_aligned->buf, buf, len);
+
+ return p;
+}
+
+static int get_form(const char *charset)
+{
+ int form = -1;
+
+
+ if (!yaz_matchstr(charset, "UCS-2"))
+ form = 2;
+ if (!yaz_matchstr(charset, "UCS-4"))
+ form = 4;
+ if (!yaz_matchstr(charset, "UTF-16"))
+ form = 5;
+ if (!yaz_matchstr(charset, "UTF-8"))
+ form = 8;
+
+ return form;
+}
+
+static char *set_form (Odr_oid *encoding)
+{
+ static char *charset = 0;
+ if ( oid_oidlen(encoding) != 6)
+ return 0;
+ if (encoding[5] == 2)
+ charset = "UCS-2";
+ if (encoding[5] == 4)
+ charset = "UCS-4";
+ if (encoding[5] == 5)
+ charset = "UTF-16";
+ if (encoding[5] == 8)
+ charset = "UTF-8";
+ return charset;
+}
+
+static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset)
+{
+ int form = get_form (charset);
+ Z_OriginProposal_0 *p0 =
+ (Z_OriginProposal_0*)odr_malloc(o, sizeof(*p0));
+
+ memset(p0, 0, sizeof(*p0));
+
+ if (form > 0)
+ { /* ISO 10646 (UNICODE) */
+ char oidname[20];
+
+ Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));
+ p0->which = Z_OriginProposal_0_iso10646;
+ p0->u.iso10646 = is;
+ is->collections = 0;
+ sprintf (oidname, "1.0.10646.1.0.%d", form);
+ is->encodingLevel = odr_getoidbystr (o, oidname);
+ }
+ else
+ { /* private ones */
+ Z_PrivateCharacterSet *pc =
+ (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
+
+ memset(pc, 0, sizeof(*pc));
+
+ p0->which = Z_OriginProposal_0_private;
+ p0->u.zprivate = pc;
+
+ pc->which = Z_PrivateCharacterSet_externallySpecified;
+ pc->u.externallySpecified =
+ z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
+ }
+ return p0;
+}
+
+static Z_OriginProposal *z_get_OriginProposal(
+ ODR o, const char **charsets, int num_charsets,
+ const char **langs, int num_langs, int selected)
+{
+ int i;
+ Z_OriginProposal *p = (Z_OriginProposal *) odr_malloc(o, sizeof(*p));
+
+ memset(p, 0, sizeof(*p));
+
+ p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
+ *p->recordsInSelectedCharSets = (selected) ? 1:0;
+
+ if (charsets && num_charsets) {
+
+ p->num_proposedCharSets = num_charsets;
+ p->proposedCharSets =
+ (Z_OriginProposal_0**)
+ odr_malloc(o, num_charsets*sizeof(Z_OriginProposal_0*));
+
+ for (i = 0; i<num_charsets; i++)
+ p->proposedCharSets[i] =
+ z_get_OriginProposal_0(o, charsets[i]);
+ }
+ if (langs && num_langs) {
+
+ p->num_proposedlanguages = num_langs;
+
+ p->proposedlanguages =
+ (char **) odr_malloc(o, num_langs*sizeof(char *));
+
+ for (i = 0; i<num_langs; i++) {
+
+ p->proposedlanguages[i] = (char *)langs[i];
+
+ }
+ }
+ return p;
+}
+
+static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(
+ ODR o)
+{
+ Z_CharSetandLanguageNegotiation *p =
+ (Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p));
+
+ memset(p, 0, sizeof(*p));
+
+ return p;
+}
+
+/* Create EXTERNAL for negotation proposal. Client side */
+Z_External *yaz_set_proposal_charneg(ODR o,
+ const char **charsets, int num_charsets,
+ const char **langs, int num_langs,
+ int selected)
+{
+ Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
+ oident oid;
+
+ p->descriptor = 0;
+ p->indirect_reference = 0;
+
+ oid.proto = PROTO_Z3950;
+ oid.oclass = CLASS_NEGOT;
+ oid.value = VAL_CHARNEG3;
+ p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+
+ p->which = Z_External_charSetandLanguageNegotiation;
+ p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
+ p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal;
+ p->u.charNeg3->u.proposal =
+ z_get_OriginProposal(o, charsets, num_charsets,
+ langs, num_langs, selected);
+
+ return p;
+}
+
+/* used by yaz_set_response_charneg */
+static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset,
+ const char *lang, int selected)
+{
+ Z_TargetResponse *p = (Z_TargetResponse *) odr_malloc(o, sizeof(*p));
+ int form = get_form(charset);
+
+ memset(p, 0, sizeof(*p));
+
+ if (form > 0)
+ {
+ char oidname[20];
+
+ Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));
+ p->which = Z_TargetResponse_iso10646;
+ p->u.iso10646 = is;
+ is->collections = 0;
+ sprintf (oidname, "1.0.10646.1.0.%d", form);
+ is->encodingLevel = odr_getoidbystr (o, oidname);
+ }
+ else
+ {
+ Z_PrivateCharacterSet *pc =
+ (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
+
+ memset(pc, 0, sizeof(*pc));
+
+ p->which = Z_TargetResponse_private;
+ p->u.zprivate = pc;
+
+ pc->which = Z_PrivateCharacterSet_externallySpecified;
+ pc->u.externallySpecified =
+ z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
+ }
+ p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
+ *p->recordsInSelectedCharSets = (selected) ? 1:0;
+
+ p->selectedLanguage = lang ? (char *)odr_strdup(o, lang) : 0;
+ return p;
+}
+
+/* Create charset response. Server side */
+Z_External *yaz_set_response_charneg(ODR o, const char *charset,
+ const char *lang, int selected)
+{
+ Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
+ oident oid;
+
+ p->descriptor = 0;
+ p->indirect_reference = 0;
+
+ oid.proto = PROTO_Z3950;
+ oid.oclass = CLASS_NEGOT;
+ oid.value = VAL_CHARNEG3;
+ p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+
+ p->which = Z_External_charSetandLanguageNegotiation;
+ p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
+ p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response;
+ p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected);
+
+ return p;
+}
+
+/* Get negotiation from OtherInformation. Client&Server side */
+Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
+{
+ Z_External *pext;
+ int i;
+
+ if(!p)
+ return 0;
+
+ for (i=0; i<p->num_elements; i++) {
+
+ if ((p->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&
+ (pext = p->list[i]->information.externallyDefinedInfo)) {
+
+ oident *ent = oid_getentbyoid(pext->direct_reference);
+
+ if (ent && ent->value == VAL_CHARNEG3 && ent->oclass == CLASS_NEGOT &&
+ pext->which == Z_External_charSetandLanguageNegotiation) {
+
+ return pext->u.charNeg3;
+ }
+ }
+ }
+ return 0;
+}
+
+/* Get charsets, langs, selected from negotiation.. Server side */
+void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
+ char ***charsets, int *num_charsets,
+ char ***langs, int *num_langs, int *selected)
+{
+ int i;
+ Z_OriginProposal *pro = p->u.proposal;
+
+ if (num_charsets && charsets)
+ {
+ if (pro->num_proposedCharSets)
+ {
+ *num_charsets = pro->num_proposedCharSets;
+
+ (*charsets) = (char **)
+ nmem_malloc(mem, pro->num_proposedCharSets * sizeof(char *));
+
+ for (i=0; i<pro->num_proposedCharSets; i++)
+ {
+ (*charsets)[i] = 0;
+
+ if (pro->proposedCharSets[i]->which ==
+ Z_OriginProposal_0_private &&
+ pro->proposedCharSets[i]->u.zprivate->which ==
+ Z_PrivateCharacterSet_externallySpecified) {
+
+ Z_External *pext =
+ pro->proposedCharSets[i]->u.zprivate->u.externallySpecified;
+
+ if (pext->which == Z_External_octet) {
+
+ (*charsets)[i] = (char *)
+ nmem_malloc(mem, (1+pext->u.octet_aligned->len) *
+ sizeof(char));
+
+ memcpy ((*charsets)[i], pext->u.octet_aligned->buf,
+ pext->u.octet_aligned->len);
+ (*charsets)[i][pext->u.octet_aligned->len] = 0;
+
+ }
+ }
+ else if (pro->proposedCharSets[i]->which ==
+ Z_OriginProposal_0_iso10646)
+ (*charsets)[i] = set_form (
+ pro->proposedCharSets[i]->u.iso10646->encodingLevel);
+ }
+ }
+ else
+ *num_charsets = 0;
+ }
+
+ if (langs && num_langs)
+ {
+ if (pro->num_proposedlanguages)
+ {
+ *num_langs = pro->num_proposedlanguages;
+
+ (*langs) = (char **)
+ nmem_malloc(mem, pro->num_proposedlanguages * sizeof(char *));
+
+ for (i=0; i<pro->num_proposedlanguages; i++)
+ (*langs)[i] = nmem_strdup(mem, pro->proposedlanguages[i]);
+ }
+ else
+ *num_langs = 0;
+ }
+
+ if(pro->recordsInSelectedCharSets && selected)
+ *selected = *pro->recordsInSelectedCharSets;
+}
+
+/* Return charset, lang, selected from negotiation.. Client side */
+void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
+ char **charset, char **lang, int *selected)
+{
+ Z_TargetResponse *res = p->u.response;
+
+ if (charset && res->which == Z_TargetResponse_private &&
+ res->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {
+
+ Z_External *pext = res->u.zprivate->u.externallySpecified;
+
+ if (pext->which == Z_External_octet) {
+
+ *charset = (char *)
+ nmem_malloc(mem, (1+pext->u.octet_aligned->len)*sizeof(char));
+ memcpy (*charset, pext->u.octet_aligned->buf,
+ pext->u.octet_aligned->len);
+ (*charset)[pext->u.octet_aligned->len] = 0;
+ }
+ }
+ if (charset && res->which == Z_TargetResponse_iso10646)
+ *charset = set_form (res->u.iso10646->encodingLevel);
+ if (lang && res->selectedLanguage)
+ *lang = nmem_strdup (mem, res->selectedLanguage);
+
+ if(selected && res->recordsInSelectedCharSets)
+ *selected = *res->recordsInSelectedCharSets;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: comstack.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+#include <yaz/unix.h>
+#include <yaz/odr.h>
+
+static const char *cs_errlist[] =
+{
+ "No error or unspecified error",
+ "System (lower-layer) error",
+ "Operation out of state",
+ "No data (operation would block)",
+ "New data while half of old buffer is on the line (flow control)",
+ "Permission denied",
+ "SSL error"
+};
+
+const char *cs_errmsg(int n)
+{
+ if (n < 0 || n > 6)
+ n = 0;
+ return cs_errlist[n];
+}
+
+const char *cs_strerror(COMSTACK h)
+{
+ return cs_errmsg(h->cerrno);
+}
+
+void cs_get_host_args(const char *type_and_host, const char **args)
+{
+
+ *args = "";
+ if (*type_and_host && strncmp(type_and_host, "unix:", 5))
+ {
+ const char *cp;
+ cp = strstr(type_and_host, "://");
+ if (cp)
+ cp = cp+3;
+ else
+ cp = type_and_host;
+ cp = strchr(cp, '/');
+ if (cp)
+ *args = cp+1;
+ }
+}
+
+COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
+{
+ enum oid_proto proto = PROTO_Z3950;
+ const char *host = 0;
+ COMSTACK cs;
+ CS_TYPE t;
+
+ if (strncmp (type_and_host, "tcp:", 4) == 0)
+ {
+ t = tcpip_type;
+ host = type_and_host + 4;
+ }
+ else if (strncmp (type_and_host, "ssl:", 4) == 0)
+ {
+#if HAVE_OPENSSL_SSL_H
+ t = ssl_type;
+ host = type_and_host + 4;
+#else
+ return 0;
+#endif
+ }
+ else if (strncmp (type_and_host, "unix:", 5) == 0)
+ {
+#ifndef WIN32
+ t = unix_type;
+ host = type_and_host + 5;
+#else
+ return 0;
+#endif
+ }
+ else if (strncmp(type_and_host, "http:", 5) == 0)
+ {
+ t = tcpip_type;
+ host = type_and_host + 5;
+ if (host[0] == '/' && host[1] == '/')
+ host = host + 2;
+ proto = PROTO_HTTP;
+ }
+ else if (strncmp(type_and_host, "https:", 6) == 0)
+ {
+#if HAVE_OPENSSL_SSL_H
+ t = ssl_type;
+ host = type_and_host + 6;
+ if (host[0] == '/' && host[1] == '/')
+ host = host + 2;
+ proto = PROTO_HTTP;
+#else
+ return 0;
+#endif
+ }
+ else
+ {
+ t = tcpip_type;
+ host = type_and_host;
+
+ }
+ cs = cs_create (t, blocking, proto);
+ if (!cs)
+ return 0;
+
+ if (!(*vp = cs_straddr(cs, host)))
+ {
+ cs_close (cs);
+ return 0;
+ }
+ return cs;
+}
+
+int cs_look (COMSTACK cs)
+{
+ return cs->event;
+}
+
+int cs_complete_auto(const unsigned char *buf, int len)
+{
+ if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
+ && buf[1] >= 0x20 && buf[1] < 0x7f
+ && buf[2] >= 0x20 && buf[2] < 0x7f)
+ {
+ /* deal with HTTP request/response */
+ int i = 2, content_len = 0, chunked = 0;
+
+ while (i <= len-4)
+ {
+ if (i > 8192)
+ return i; /* do not allow more than 8K HTTP header */
+ if (buf[i] == '\r' && buf[i+1] == '\n')
+ {
+ i += 2;
+ if (buf[i] == '\r' && buf[i+1] == '\n')
+ {
+ if (chunked)
+ {
+ while(1)
+ {
+ int chunk_len = 0;
+ i += 2;
+#if 0
+/* debugging */
+ if (i <len-2)
+ {
+ printf ("\n>>>");
+ for (j = i; j <= i+4; j++)
+ printf ("%c", buf[j]);
+ printf ("<<<\n");
+ }
+#endif
+ while (1)
+ if (i >= len-2) {
+#if 0
+/* debugging */
+ printf ("XXXXXXXX not there yet 1\n");
+ printf ("i=%d len=%d\n", i, len);
+#endif
+ return 0;
+ } else if (isdigit(buf[i]))
+ chunk_len = chunk_len * 16 +
+ (buf[i++] - '0');
+ else if (isupper(buf[i]))
+ chunk_len = chunk_len * 16 +
+ (buf[i++] - ('A'-10));
+ else if (islower(buf[i]))
+ chunk_len = chunk_len * 16 +
+ (buf[i++] - ('a'-10));
+ else
+ break;
+ if (buf[i] != '\r' || buf[i+1] != '\n' ||
+ chunk_len < 0)
+ return i+2; /* bad. stop now */
+ if (chunk_len == 0)
+ {
+ /* consider trailing headers .. */
+ while(i <= len-4)
+ {
+ if (buf[i] == '\r' && buf[i+1] == '\n' &&
+ buf[i+2] == '\r' && buf[i+3] == '\n')
+ if (len >= i+4)
+ return i+4;
+ i++;
+ }
+#if 0
+/* debugging */
+ printf ("XXXXXXXXX not there yet 2\n");
+ printf ("i=%d len=%d\n", i, len);
+#endif
+ return 0;
+ }
+ i += chunk_len+2;
+ }
+ }
+ else
+ { /* not chunked ; inside body */
+ /* i += 2 seems not to work with GCC -O2 ..
+ so i+2 is used instead .. */
+ if (len >= (i+2)+ content_len)
+ return (i+2)+ content_len;
+ }
+ break;
+ }
+ else if (i < len - 21 &&
+ !memcmp(buf+i, "Transfer-Encoding: ", 18))
+ {
+ i+=18;
+ if (buf[i] == ' ')
+ i++;
+ if (i < len - 8)
+ if (!memcmp(buf+i, "chunked", 7))
+ chunked = 1;
+ }
+ else if (i < len - 18 &&
+ !memcmp(buf+i, "Content-Length: ", 15))
+ {
+ i+= 15;
+ if (buf[i] == ' ')
+ i++;
+ content_len = 0;
+ while (i <= len-4 && isdigit(buf[i]))
+ content_len = content_len*10 + (buf[i++] - '0');
+ if (content_len < 0) /* prevent negative offsets */
+ content_len = 0;
+ }
+ else
+ i++;
+ }
+ else
+ i++;
+ }
+ return 0;
+ }
+ return completeBER(buf, len);
+}
--- /dev/null
+/* $Id: cql.y,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+
+ bison parser for CQL grammar.
+*/
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <yaz/nmem.h>
+#include <yaz/cql.h>
+
+ typedef struct {
+ struct cql_node *rel;
+ struct cql_node *cql;
+ char *buf;
+ size_t len;
+ size_t size;
+ } token;
+
+ struct cql_parser {
+ int (*getbyte)(void *client_data);
+ void (*ungetbyte)(int b, void *client_data);
+ void *client_data;
+ int last_error;
+ int last_pos;
+ struct cql_node *top;
+ NMEM nmem;
+ };
+
+#define YYSTYPE token
+
+#define YYPARSE_PARAM parm
+#define YYLEX_PARAM parm
+
+ int yylex(YYSTYPE *lval, void *vp);
+ int yyerror(char *s);
+%}
+
+%pure_parser
+%token TERM AND OR NOT PROX GE LE NE
+%expect 8
+
+%%
+
+top: {
+ $$.rel = cql_node_mk_sc("srw.serverChoice", "scr", 0);
+ ((CQL_parser) parm)->top = 0;
+} cqlQuery1 {
+ cql_node_destroy($$.rel);
+ ((CQL_parser) parm)->top = $2.cql;
+}
+;
+
+cqlQuery1: cqlQuery
+| cqlQuery error {
+ cql_node_destroy($1.cql);
+ $$.cql = 0;
+}
+;
+
+cqlQuery:
+ searchClause
+|
+ cqlQuery boolean {
+ $$.rel = $0.rel;
+ } searchClause {
+ struct cql_node *cn = cql_node_mk_boolean($2.buf);
+
+ cn->u.boolean.modifiers = $2.rel;
+ cn->u.boolean.left = $1.cql;
+ cn->u.boolean.right = $4.cql;
+
+ $$.cql = cn;
+ }
+;
+
+searchClause:
+ '(' {
+ $$.rel = $0.rel;
+
+ } cqlQuery ')' {
+ $$.cql = $3.cql;
+ }
+|
+ searchTerm {
+ struct cql_node *st = cql_node_dup ($0.rel);
+ st->u.st.term = strdup($1.buf);
+ $$.cql = st;
+ }
+|
+ index relation {
+ $$.rel = $2.rel;
+ $$.rel->u.st.index = strdup($1.buf);
+ } searchClause {
+ $$.cql = $4.cql;
+ cql_node_destroy($2.rel);
+ }
+| '>' searchTerm '=' searchTerm {
+ $$.rel = $0.rel;
+ } cqlQuery {
+ $$.cql = cql_node_prefix($6.cql, $2.buf, $4.buf);
+ }
+| '>' searchTerm {
+ $$.rel = $0.rel;
+ } cqlQuery {
+ $$.cql = cql_node_prefix($4.cql, 0, $2.buf);
+ }
+;
+
+/* unary NOT search TERM here .. */
+
+boolean:
+ AND | OR | NOT | PROX proxqualifiers {
+ $$ = $1;
+ $$.rel = $2.rel;
+ }
+ ;
+
+proxqualifiers:
+ Prelation {
+ $$.rel = cql_node_mk_proxargs ($1.buf, 0, 0, 0);
+ }
+|
+ PrelationO Pdistance {
+ $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, 0, 0);
+ }
+|
+ PrelationO PdistanceO Punit {
+ $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, 0);
+ }
+|
+ PrelationO PdistanceO PunitO Pordering {
+ $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, $4.buf);
+ }
+|
+{ $$.rel = 0; }
+;
+
+Punit: '/' searchTerm {
+ $$ = $2;
+ }
+;
+
+PunitO: '/' searchTerm {
+ $$ = $2;
+ }
+|
+'/' { $$.buf[0] = 0; }
+;
+Prelation: '/' baseRelation {
+ $$ = $2;
+}
+;
+PrelationO: '/' baseRelation {
+ $$ = $2;
+}
+| '/' { $$.buf[0] = 0; }
+;
+Pdistance: '/' searchTerm {
+ $$ = $2;
+}
+;
+
+PdistanceO: '/' searchTerm {
+ $$ = $2;
+}
+| '/' { $$.buf[0] = 0; }
+;
+Pordering: '/' searchTerm {
+ $$ = $2;
+}
+;
+
+relation: baseRelation modifiers {
+ struct cql_node *st = cql_node_mk_sc(/* index */ 0,
+ /* relation */ $1.buf,
+ /* term */ 0);
+
+ st->u.st.modifiers = $2.cql;
+ $$.rel = st;
+}
+;
+
+modifiers: '/' searchTerm modifiers
+{
+ struct cql_node *mod = cql_node_mk_mod(0, $2.buf);
+
+ mod->u.mod.next = $3.cql;
+ $$.cql = mod;
+}
+|
+{
+ $$.cql = 0;
+}
+;
+
+baseRelation:
+ '='
+| '>'
+| '<'
+| GE
+| LE
+| NE
+| TERM
+;
+
+index:
+ searchTerm;
+
+searchTerm:
+ TERM
+| AND
+| OR
+| NOT
+| PROX
+;
+
+%%
+
+int yyerror(char *s)
+{
+ return 0;
+}
+
+#include "lexer.h"
+
+
+int cql_parser_stream(CQL_parser cp,
+ int (*getbyte)(void *client_data),
+ void (*ungetbyte)(int b, void *client_data),
+ void *client_data)
+{
+ cp->getbyte = getbyte;
+ cp->ungetbyte = ungetbyte;
+ cp->client_data = client_data;
+ if (cp->top)
+ cql_node_destroy(cp->top);
+ cql_parse(cp);
+ if (cp->top)
+ return 0;
+ return -1;
+}
+
+CQL_parser cql_parser_create(void)
+{
+ CQL_parser cp = (CQL_parser) malloc (sizeof(*cp));
+
+ cp->top = 0;
+ cp->getbyte = 0;
+ cp->ungetbyte = 0;
+ cp->client_data = 0;
+ cp->last_error = 0;
+ cp->last_pos = 0;
+ cp->nmem = nmem_create();
+ return cp;
+}
+
+void cql_parser_destroy(CQL_parser cp)
+{
+ cql_node_destroy(cp->top);
+ nmem_destroy(cp->nmem);
+ free (cp);
+}
+
+struct cql_node *cql_parser_result(CQL_parser cp)
+{
+ return cp->top;
+}
--- /dev/null
+/* $Id: cqlstdio.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <yaz/cql.h>
+
+int getbyte_stream(void *client_data)
+{
+ FILE *f = (FILE*) client_data;
+
+ int c = fgetc(f);
+ if (c == EOF)
+ return 0;
+ return c;
+}
+
+void ungetbyte_stream (int c, void *client_data)
+{
+ FILE *f = (FILE*) client_data;
+
+ if (c == 0)
+ c = EOF;
+ ungetc(c, f);
+}
+
+int cql_parser_stdio(CQL_parser cp, FILE *f)
+{
+ return cql_parser_stream(cp, getbyte_stream, ungetbyte_stream, f);
+}
+
+
--- /dev/null
+/* $Id: cqlstrer.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <yaz/cql.h>
+
+/*
+ * The error-messages associated with these codes are taken from
+ * the SRW diagnostic specifications at
+ * http://www.loc.gov/srw/diagnostic-list.html
+ */
+const char *cql_strerror(int code) {
+ static char buf[80];
+ switch (code) {
+ case 10: return "Illegal query";
+ case 11: return "Unsupported query type (XCQL vs CQL)";
+ case 12: return "Too many characters in query";
+ case 13: return "Unbalanced or illegal use of parentheses";
+ case 14: return "Unbalanced or illegal use of quotes";
+ case 15: return "Illegal or unsupported index set";
+ case 16: return "Illegal or unsupported index";
+ case 17: return "Illegal or unsupported combination of index and index set";
+ case 18: return "Illegal or unsupported combination of indexes";
+ case 19: return "Illegal or unsupported relation";
+ case 20: return "Illegal or unsupported relation modifier";
+ case 21: return "Illegal or unsupported combination of relation modifers";
+ case 22: return "Illegal or unsupported combination of relation and index";
+ case 23: return "Too many characters in term";
+ case 24: return "Illegal combination of relation and term";
+ case 25: return "Special characters not quoted in term";
+ case 26: return "Non special character escaped in term";
+ case 27: return "Empty term unsupported";
+ case 28: return "Masking character not supported";
+ case 29: return "Masked words too short";
+ case 30: return "Too many masking characters in term";
+ case 31: return "Anchoring character not supported";
+ case 32: return "Anchoring character in illegal or unsupported position";
+ case 33: return "Combination of proximity/adjacency and masking characters not supported";
+ case 34: return "Combination of proximity/adjacency and anchoring characters not supported";
+ case 35: return "Terms only exclusion (stop) words";
+ case 36: return "Term in invalid format for index or relation";
+ case 37: return "Illegal or unsupported boolean operator";
+ case 38: return "Too many boolean operators in query";
+ case 39: return "Proximity not supported";
+ case 40: return "Illegal or unsupported proximity relation";
+ case 41: return "Illegal or unsupported proximity distance";
+ case 42: return "Illegal or unsupported proximity unit";
+ case 43: return "Illegal or unsupported proximity ordering";
+ case 44: return "Illegal or unsupported combination of proximity modifiers";
+ case 45: return "Index set name (prefix) assigned to multiple identifiers";
+ default: break;
+ }
+
+ sprintf(buf, "Unknown CQL error #%d", code);
+ return buf;
+}
--- /dev/null
+/* $Id: cqlstring.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE for details.
+*/
+#include <yaz/cql.h>
+
+struct cql_buf_info {
+ const char *str;
+ int off;
+};
+
+int getbuf(void *vp)
+{
+ struct cql_buf_info *bi = (struct cql_buf_info *) vp;
+ if (bi->str[bi->off] == 0)
+ return 0;
+ return bi->str[bi->off++];
+}
+
+void ungetbuf(int b, void *vp)
+{
+ struct cql_buf_info *bi = (struct cql_buf_info *) vp;
+ if (b)
+ (bi->off--);
+}
+
+int cql_parser_string(CQL_parser cp, const char *str)
+{
+ struct cql_buf_info b;
+
+ b.str = str;
+ b.off = 0;
+
+ return cql_parser_stream(cp, getbuf, ungetbuf, &b);
+}
+
--- /dev/null
+/* $Id: cqltransform.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <yaz/cql.h>
+
+struct cql_prop_entry {
+ char *pattern;
+ char *value;
+ struct cql_prop_entry *next;
+};
+
+struct cql_transform_t_ {
+ struct cql_prop_entry *entry;
+ int error;
+ char *addinfo;
+};
+
+cql_transform_t cql_transform_open_FILE(FILE *f)
+{
+ char line[1024];
+ cql_transform_t ct = (cql_transform_t) malloc (sizeof(*ct));
+ struct cql_prop_entry **pp = &ct->entry;
+
+ ct->error = 0;
+ ct->addinfo = 0;
+ while (fgets(line, sizeof(line)-1, f))
+ {
+ const char *cp_value_start;
+ const char *cp_value_end;
+ const char *cp_pattern_end;
+ const char *cp = line;
+ while (*cp && !strchr(" \t=\r\n#", *cp))
+ cp++;
+ cp_pattern_end = cp;
+ if (cp == line)
+ continue;
+ while (*cp && strchr(" \t\r\n", *cp))
+ cp++;
+ if (*cp != '=')
+ continue;
+ cp++;
+ while (*cp && strchr(" \t\r\n", *cp))
+ cp++;
+ cp_value_start = cp;
+ if (!(cp_value_end = strchr(cp, '#')))
+ cp_value_end = strlen(line) + line;
+
+ if (cp_value_end != cp_value_start &&
+ strchr(" \t\r\n", cp_value_end[-1]))
+ cp_value_end--;
+ *pp = (struct cql_prop_entry *) malloc (sizeof(**pp));
+ (*pp)->pattern = (char *) malloc (cp_pattern_end - line + 1);
+ memcpy ((*pp)->pattern, line, cp_pattern_end - line);
+ (*pp)->pattern[cp_pattern_end-line] = 0;
+
+ (*pp)->value = (char *) malloc (cp_value_end - cp_value_start + 1);
+ if (cp_value_start != cp_value_end)
+ memcpy ((*pp)->value, cp_value_start, cp_value_end-cp_value_start);
+ (*pp)->value[cp_value_end - cp_value_start] = 0;
+ pp = &(*pp)->next;
+ }
+ *pp = 0;
+ return ct;
+}
+
+void cql_transform_close(cql_transform_t ct)
+{
+ struct cql_prop_entry *pe;
+ if (!ct)
+ return;
+ pe = ct->entry;
+ while (pe)
+ {
+ struct cql_prop_entry *pe_next = pe->next;
+ free (pe->pattern);
+ free (pe->value);
+ free (pe);
+ pe = pe_next;
+ }
+ if (ct->addinfo)
+ free (ct->addinfo);
+ free (ct);
+}
+
+cql_transform_t cql_transform_open_fname(const char *fname)
+{
+ cql_transform_t ct;
+ FILE *f = fopen(fname, "r");
+ if (!f)
+ return 0;
+ ct = cql_transform_open_FILE(f);
+ fclose(f);
+ return ct;
+}
+
+static const char *cql_lookup_property(cql_transform_t ct,
+ const char *pat1, const char *pat2)
+{
+ char pattern[80];
+ struct cql_prop_entry *e;
+
+ if (pat2)
+ sprintf (pattern, "%.39s%.39s", pat1, pat2);
+ else
+ sprintf (pattern, "%.39s", pat1);
+ for (e = ct->entry; e; e = e->next)
+ {
+ if (!strcmp(e->pattern, pattern))
+ return e->value;
+ }
+ return 0;
+}
+
+static const char *cql_lookup_value(cql_transform_t ct,
+ const char *prefix,
+ const char *value)
+{
+ struct cql_prop_entry *e;
+ int len = strlen(prefix);
+
+ for (e = ct->entry; e; e = e->next)
+ {
+ if (!memcmp(e->pattern, prefix, len) && !strcmp(e->value, value))
+ return e->pattern + len;
+ }
+ return 0;
+}
+
+
+int cql_pr_attr(cql_transform_t ct, const char *category,
+ const char *val,
+ const char *default_val,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ int errcode)
+{
+ const char *res;
+ res = cql_lookup_property(ct, category, val ? val : default_val);
+ if (!res)
+ res = cql_lookup_property(ct, category, "*");
+ if (res)
+ {
+ char buf[64];
+
+ const char *cp0 = res, *cp1;
+ while ((cp1 = strchr(cp0, '=')))
+ {
+ while (*cp1 && *cp1 != ' ')
+ cp1++;
+ if (cp1 - cp0 >= sizeof(buf))
+ break;
+ memcpy (buf, cp0, cp1 - cp0);
+ buf[cp1-cp0] = 0;
+ (*pr)("@attr ", client_data);
+ (*pr)(buf, client_data);
+ (*pr)(" ", client_data);
+ cp0 = cp1;
+ while (*cp0 == ' ')
+ cp0++;
+ }
+ return 1;
+ }
+ /* error ... */
+ if (errcode && !ct->error)
+ {
+ ct->error = errcode;
+ ct->addinfo = strdup(val);
+ }
+ return 0;
+}
+
+void emit_term(cql_transform_t ct,
+ const char *term, int length,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data)
+{
+ int i;
+ if (length > 0)
+ {
+ if (length > 1 && term[0] == '^' && term[length-1] == '^')
+ {
+ cql_pr_attr(ct, "position.", "firstAndLast", 0,
+ pr, client_data, 32);
+ term++;
+ length -= 2;
+ }
+ else if (term[0] == '^')
+ {
+ cql_pr_attr(ct, "position.", "first", 0,
+ pr, client_data, 32);
+ term++;
+ }
+ else if (term[length-1] == '^')
+ {
+ cql_pr_attr(ct, "position.", "last", 0,
+ pr, client_data, 32);
+ length--;
+ }
+ else
+ {
+ cql_pr_attr(ct, "position.", "any", 0,
+ pr, client_data, 32);
+ }
+ }
+ (*pr)("\"", client_data);
+ for (i = 0; i<length; i++)
+ {
+ char buf[2];
+ buf[0] = term[i];
+ buf[1] = 0;
+ (*pr)(buf, client_data);
+ }
+ (*pr)("\" ", client_data);
+}
+
+void emit_wordlist(cql_transform_t ct,
+ struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ const char *op)
+{
+ const char *cp0 = cn->u.st.term;
+ const char *cp1;
+ const char *last_term = 0;
+ int last_length = 0;
+ while(cp0)
+ {
+ while (*cp0 == ' ')
+ cp0++;
+ cp1 = strchr(cp0, ' ');
+ if (last_term)
+ {
+ (*pr)("@", client_data);
+ (*pr)(op, client_data);
+ (*pr)(" ", client_data);
+ emit_term(ct, last_term, last_length, pr, client_data);
+ }
+ last_term = cp0;
+ if (cp1)
+ last_length = cp1 - cp0;
+ else
+ last_length = strlen(cp0);
+ cp0 = cp1;
+ }
+ if (last_term)
+ emit_term(ct, last_term, last_length, pr, client_data);
+}
+
+
+static const char *cql_get_ns(cql_transform_t ct,
+ struct cql_node *cn,
+ struct cql_node **prefix_ar, int prefix_level,
+ const char **n_prefix,
+ const char **n_suffix)
+{
+ int i;
+ const char *ns = 0;
+ char prefix[32];
+ const char *cp = cn->u.st.index;
+ const char *cp_dot = strchr(cp, '.');
+
+ /* strz current prefix (empty if not given) */
+ if (cp_dot && cp_dot-cp < sizeof(prefix))
+ {
+ memcpy (prefix, cp, cp_dot - cp);
+ prefix[cp_dot - cp] = 0;
+ }
+ else
+ *prefix = 0;
+
+ /* 2. lookup in prefix_ar. and return NS */
+ for (i = prefix_level; !ns && --i >= 0; )
+ {
+ struct cql_node *cn_prefix = prefix_ar[i];
+ for (; cn_prefix; cn_prefix = cn_prefix->u.mod.next)
+ {
+ if (*prefix && cn_prefix->u.mod.name &&
+ !strcmp(prefix, cn_prefix->u.mod.name))
+ {
+ ns = cn_prefix->u.mod.value;
+ break;
+ }
+ else if (!*prefix && !cn_prefix->u.mod.name)
+ {
+ ns = cn_prefix->u.mod.value;
+ break;
+ }
+ }
+ }
+ if (!ns)
+ {
+ if (!ct->error)
+ {
+ ct->error = 15;
+ ct->addinfo = strdup(prefix);
+ }
+ return 0;
+ }
+ /* 3. lookup in set.NS for new prefix */
+ *n_prefix = cql_lookup_value(ct, "set.", ns);
+ if (!*n_prefix)
+ {
+ if (!ct->error)
+ {
+ ct->error = 15;
+ ct->addinfo = strdup(ns);
+ }
+ return 0;
+ }
+ /* 4. lookup qualifier.prefix. */
+
+ cp = cn->u.st.index;
+ cp_dot = strchr(cp, '.');
+
+ *n_suffix = cp_dot ? cp_dot+1 : cp;
+ return ns;
+}
+
+void cql_transform_r(cql_transform_t ct,
+ struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ struct cql_node **prefix_ar, int prefix_level)
+{
+ const char *ns, *n_prefix, *n_suffix;
+
+ if (!cn)
+ return;
+ switch (cn->which)
+ {
+ case CQL_NODE_ST:
+ if (cn->u.st.prefixes && prefix_level < 20)
+ prefix_ar[prefix_level++] = cn->u.st.prefixes;
+ ns = cql_get_ns(ct, cn, prefix_ar, prefix_level, &n_prefix, &n_suffix);
+ if (ns)
+ {
+ char n_full[64];
+ sprintf (n_full, "%.20s.%.40s", n_prefix, n_suffix);
+
+ if (!strcmp(ns, "http://www.loc.gov/zing/cql/srw-indexes/v1.0/")
+ && !strcmp(n_suffix, "resultSet"))
+ {
+ (*pr)("@set \"", client_data);
+ (*pr)(cn->u.st.term, client_data);
+ (*pr)("\" ", client_data);
+ return ;
+ }
+ cql_pr_attr(ct, "qualifier.", n_full, "srw.serverChoice",
+ pr, client_data, 16);
+ }
+
+ if (cn->u.st.relation && !strcmp(cn->u.st.relation, "="))
+ cql_pr_attr(ct, "relation.", "eq", "scr",
+ pr, client_data, 19);
+ else if (cn->u.st.relation && !strcmp(cn->u.st.relation, "<="))
+ cql_pr_attr(ct, "relation.", "le", "scr",
+ pr, client_data, 19);
+ else if (cn->u.st.relation && !strcmp(cn->u.st.relation, ">="))
+ cql_pr_attr(ct, "relation.", "ge", "scr",
+ pr, client_data, 19);
+ else
+ cql_pr_attr(ct, "relation.", cn->u.st.relation, "eq",
+ pr, client_data, 19);
+ if (cn->u.st.modifiers)
+ {
+ struct cql_node *mod = cn->u.st.modifiers;
+ for (; mod; mod = mod->u.mod.next)
+ {
+ cql_pr_attr(ct, "relationModifier.", mod->u.mod.value, 0,
+ pr, client_data, 20);
+ }
+ }
+ cql_pr_attr(ct, "structure.", cn->u.st.relation, 0,
+ pr, client_data, 24);
+ if (cn->u.st.relation && !strcmp(cn->u.st.relation, "all"))
+ {
+ emit_wordlist(ct, cn, pr, client_data, "and");
+ }
+ else if (cn->u.st.relation && !strcmp(cn->u.st.relation, "any"))
+ {
+ emit_wordlist(ct, cn, pr, client_data, "or");
+ }
+ else
+ {
+ emit_term(ct, cn->u.st.term, strlen(cn->u.st.term),
+ pr, client_data);
+ }
+ break;
+ case CQL_NODE_BOOL:
+ if (cn->u.boolean.prefixes && prefix_level < 20)
+ prefix_ar[prefix_level++] = cn->u.boolean.prefixes;
+ (*pr)("@", client_data);
+ (*pr)(cn->u.boolean.value, client_data);
+ (*pr)(" ", client_data);
+
+ cql_transform_r(ct, cn->u.boolean.left, pr, client_data,
+ prefix_ar, prefix_level);
+ cql_transform_r(ct, cn->u.boolean.right, pr, client_data,
+ prefix_ar, prefix_level);
+ }
+}
+
+int cql_transform(cql_transform_t ct,
+ struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data)
+{
+ struct cql_node *prefix_ar[20], **pp;
+ struct cql_prop_entry *e;
+
+ ct->error = 0;
+ if (ct->addinfo)
+ free (ct->addinfo);
+ ct->addinfo = 0;
+
+ prefix_ar[0] = 0;
+ pp = &prefix_ar[0];
+ for (e = ct->entry; e ; e = e->next)
+ {
+ if (!memcmp(e->pattern, "set.", 4))
+ {
+ *pp = cql_node_mk_mod(e->pattern+4, e->value);
+ pp = &(*pp)->u.mod.next;
+ }
+ else if (!strcmp(e->pattern, "set"))
+ {
+ *pp = cql_node_mk_mod(0, e->value);
+ pp = &(*pp)->u.mod.next;
+ }
+ }
+ cql_transform_r (ct, cn, pr, client_data, prefix_ar, 1);
+ cql_node_destroy(prefix_ar[0]);
+ return ct->error;
+}
+
+
+int cql_transform_FILE(cql_transform_t ct, struct cql_node *cn, FILE *f)
+{
+ return cql_transform(ct, cn, cql_fputs, f);
+}
+
+int cql_transform_buf(cql_transform_t ct, struct cql_node *cn,
+ char *out, int max)
+{
+ struct cql_buf_write_info info;
+ int r;
+
+ info.off = 0;
+ info.max = max;
+ info.buf = out;
+ r = cql_transform(ct, cn, cql_buf_write_handler, &info);
+ if (info.off >= 0)
+ info.buf[info.off] = '\0';
+ return r;
+}
+
+int cql_transform_error(cql_transform_t ct, const char **addinfo)
+{
+ *addinfo = ct->addinfo;
+ return ct->error;
+}
--- /dev/null
+/* $Id: cqlutil.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/cql.h>
+
+void cql_fputs(const char *buf, void *client_data)
+{
+ FILE *f = (FILE *) client_data;
+ fputs(buf, f);
+}
+
+struct cql_node *cql_node_dup (struct cql_node *cp)
+{
+ struct cql_node *cn = 0;
+
+ if (!cp)
+ return 0;
+ switch (cp->which)
+ {
+ case CQL_NODE_ST:
+ cn = cql_node_mk_sc(cp->u.st.index,
+ cp->u.st.relation,
+ cp->u.st.term);
+ cn->u.st.modifiers = cql_node_dup(cp->u.st.modifiers);
+ cn->u.st.prefixes = cql_node_dup(cp->u.st.prefixes);
+ break;
+ case CQL_NODE_MOD:
+ cn = cql_node_mk_mod(cp->u.mod.name,
+ cp->u.mod.value);
+ cn->u.mod.next = cql_node_dup(cp->u.mod.next);
+ break;
+ case CQL_NODE_BOOL:
+ cn = cql_node_mk_boolean(cp->u.boolean.value);
+ cn->u.boolean.left = cql_node_dup(cp->u.boolean.left);
+ cn->u.boolean.right = cql_node_dup(cp->u.boolean.right);
+ cn->u.boolean.prefixes = cql_node_dup(cp->u.boolean.prefixes);
+ }
+ return cn;
+}
+
+struct cql_node *cql_node_mk_sc(const char *index,
+ const char *relation,
+ const char *term)
+{
+ struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
+ p->which = CQL_NODE_ST;
+ p->u.st.index = 0;
+ if (index)
+ p->u.st.index = strdup(index);
+ p->u.st.term = 0;
+ if (term)
+ p->u.st.term = strdup(term);
+ p->u.st.relation = 0;
+ if (relation)
+ p->u.st.relation = strdup(relation);
+ p->u.st.modifiers = 0;
+ p->u.st.prefixes = 0;
+ return p;
+}
+
+struct cql_node *cql_node_mk_mod(const char *name,
+ const char *value)
+{
+ struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
+ p->which = CQL_NODE_MOD;
+
+ p->u.mod.name = 0;
+ if (name)
+ p->u.mod.name = strdup(name);
+ p->u.mod.value = 0;
+ if (value)
+ p->u.mod.value = strdup(value);
+ p->u.mod.next = 0;
+ return p;
+}
+
+struct cql_node *cql_node_mk_boolean(const char *op)
+{
+ struct cql_node *p = (struct cql_node *) malloc(sizeof(*p));
+ p->which = CQL_NODE_BOOL;
+ p->u.boolean.value = 0;
+ if (op)
+ p->u.boolean.value = strdup(op);
+ p->u.boolean.left = 0;
+ p->u.boolean.right = 0;
+ p->u.boolean.modifiers = 0;
+ p->u.boolean.prefixes = 0;
+ return p;
+}
+
+struct cql_node *cql_node_prefix(struct cql_node *n, const char *prefix,
+ const char *uri)
+{
+ struct cql_node **cpp = 0;
+ if (n->which == CQL_NODE_ST)
+ {
+ cpp = &n->u.st.prefixes;
+ }
+ else if (n->which == CQL_NODE_BOOL)
+ {
+ cpp = &n->u.boolean.prefixes;
+ }
+ if (cpp)
+ {
+ struct cql_node *cp = cql_node_mk_mod(prefix, uri);
+ cp->u.mod.next = *cpp;
+ *cpp = cp;
+ }
+ return n;
+}
+
+struct cql_node *cql_node_mk_proxargs(const char *relation,
+ const char *distance,
+ const char *unit,
+ const char *ordering)
+{
+ struct cql_node *m = 0, *m1;
+
+ if (ordering && *ordering)
+ m = cql_node_mk_mod("ordering", ordering);
+ if (unit && *unit)
+ {
+ m1 = cql_node_mk_mod("unit", unit);
+ m1->u.mod.next = m;
+ m = m1;
+ }
+ if (distance && *distance)
+ {
+ m1 = cql_node_mk_mod("distance", distance);
+ m1->u.mod.next = m;
+ m = m1;
+ }
+ if (relation && *relation)
+ {
+ m1 = cql_node_mk_mod("relation", relation);
+ m1->u.mod.next = m;
+ m = m1;
+ }
+ return m;
+}
+
+void cql_node_destroy(struct cql_node *cn)
+{
+ if (!cn)
+ return;
+ switch (cn->which)
+ {
+ case CQL_NODE_ST:
+ free (cn->u.st.index);
+ free (cn->u.st.relation);
+ free (cn->u.st.term);
+ cql_node_destroy(cn->u.st.modifiers);
+ cql_node_destroy(cn->u.st.prefixes);
+ break;
+ case CQL_NODE_MOD:
+ free (cn->u.mod.name);
+ free (cn->u.mod.value);
+ cql_node_destroy(cn->u.mod.next);
+ break;
+ case CQL_NODE_BOOL:
+ free (cn->u.boolean.value);
+ cql_node_destroy(cn->u.boolean.left);
+ cql_node_destroy(cn->u.boolean.right);
+ cql_node_destroy(cn->u.boolean.prefixes);
+ }
+ free (cn);
+}
+
--- /dev/null
+UserInfoFormat-dateTime
+{Z39-50-userInfoFormat dateTime (6)} DEFINITIONS ::=
+BEGIN
+IMPORTS IntUnit FROM Z39-50-APDU-1995;
+
+DateTime ::= SEQUENCE{
+ date [1] Z3950Date OPTIONAL,
+ time [2] Z3950Time OPTIONAL
+ -- one or the other, or both
+ }
+
+Z3950Date ::= SEQUENCE{
+ year [1] IMPLICIT INTEGER,
+ -- For "positive" years, i.e. 1 AD or later, supply
+ -- the absolute year, e.g. If the year is 1995, supply
+ -- the integer 1995; the value 95 would indicate the
+ -- year 0095.
+ -- For "negative" years, e.g. 1 BC or earlier, -1
+ -- represents 1 BC, -2 represents 2 BC, etc. Zero is
+ -- invalid, because there was no year zero.
+ partOfYear [2] CHOICE{ -- may be omitted if only year is significant
+ monthAndDay [1] IMPLICIT SEQUENCE{
+ month [2] IMPLICIT INTEGER,
+ -- value 1-12
+ day [3] IMPLICIT INTEGER OPTIONAL
+ -- may be omitted if only year and month
+ -- are significant. Value 1-31.
+ },
+ julianDay [2] IMPLICIT INTEGER, -- Value 1 - 366.
+ weekNumber [3] IMPLICIT INTEGER, -- Value 1 - 53.
+ quarter [4] CHOICE{
+ first [1] IMPLICIT NULL,
+ second [2] IMPLICIT NULL,
+ third [3] IMPLICIT NULL,
+ fourth [4] IMPLICIT NULL},
+ season [5] CHOICE{
+ winter [1] IMPLICIT NULL,
+ spring [2] IMPLICIT NULL,
+ summer [3] IMPLICIT NULL,
+ autumn [4] IMPLICIT NULL}
+ } OPTIONAL,
+ flags [3] IMPLICIT SEQUENCE{
+ circa [1] IMPLICIT NULL OPTIONAL,
+ -- if this flag is set then the date is "approximate".
+ era [2] CHOICE{
+ -- If era occurs, partOfYear should not occur.
+ decade [1] IMPLICIT NULL,
+ -- year must be multiple of 10.
+ -- For example, 1900 refers to
+ -- the decade covering the years
+ -- 1900 through 1909.
+ century [2] IMPLICIT NULL,
+ -- year must be multiple of 100.
+ millennium [3] IMPLICIT NULL
+ -- year must be multiple of 1000.
+ } OPTIONAL
+ } OPTIONAL
+ }
+
+
+Z3950Time ::= SEQUENCE{
+ hour [1] IMPLICIT INTEGER,
+ -- Value 0-23.
+ minute [2] IMPLICIT INTEGER OPTIONAL,
+ -- value 0-59. May be omitted when hour only is
+ -- significant (in which case second and
+ -- partOfSecond must also be omitted).
+ second [3] IMPLICIT INTEGER OPTIONAL,
+ -- value 0-59. May be omitted when only hour, or
+ -- hour and minute, is significant (in which case
+ -- partOfSecond must also be omitted).
+ partOfSecond [4] IMPLICIT IntUnit OPTIONAL,
+ -- Use Unit System = 'si', Unit type = 'time';
+ -- Unit = 'second', with appropriate value and
+ -- scale factor.
+ zone [5] CHOICE{
+ local [1] IMPLICIT NULL,
+ utc [2] IMPLICIT NULL,
+ utcOffset [3] IMPLICIT INTEGER -- in minutes
+ }}
+END
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: diagbib1.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#include <stdio.h>
+
+#include <yaz/diagbib1.h>
+
+static struct {
+ int code;
+ char *msg;
+} msg_tab[] = {
+{ 1, "Permanent system error" },
+{ 2, "Temporary system error" },
+{ 3, "Unsupported search" },
+{ 4, "Terms only exclusion (stop) words" },
+{ 5, "Too many argument words" },
+{ 6, "Too many boolean operators" },
+{ 7, "Too many truncated words" },
+{ 8, "Too many incomplete subfields" },
+{ 9, "Truncated words too short" },
+{ 10, "Invalid format for record number (search term)" },
+{ 11, "Too many characters in search statement" },
+{ 12, "Too many records retrieved" },
+{ 13, "Present request out of range" },
+{ 14, "System error in presenting records" },
+{ 15, "Record no authorized to be sent intersystem" },
+{ 16, "Record exceeds Preferred-message-size" },
+{ 17, "Record exceeds Maximum-record-size" },
+{ 18, "Result set not supported as a search term" },
+{ 19, "Only single result set as search term supported" },
+{ 20, "Only ANDing of a single result set as search term supported" },
+{ 21, "Result set exists and replace indicator off" },
+{ 22, "Result set naming not supported" },
+{ 23, "Combination of specified databases not supported" },
+{ 24, "Element set names not supported" },
+{ 25, "Specified element set name not valid for specified database" },
+{ 26, "Only a single element set name supported" },
+{ 27, "Result set no longer exists - unilaterally deleted by target" },
+{ 28, "Result set is in use" },
+{ 29, "One of the specified databases is locked" },
+{ 30, "Specified result set does not exist" },
+{ 31, "Resources exhausted - no results available" },
+{ 32, "Resources exhausted - unpredictable partial results available" },
+{ 33, "Resources exhausted - valid subset of results available" },
+{ 100, "Unspecified error" },
+{ 101, "Access-control failure" },
+{ 102, "Security challenge required but could not be issued -"
+" request terminated" },
+{ 103, "Security challenge required but could not be issued -"
+" record not included" },
+{ 104, "Security challenge failed - record not included" },
+{ 105, "Terminated by negative continue response" },
+{ 106, "No abstract syntaxes agreed to for this record" },
+{ 107, "Query type not supported" },
+{ 108, "Malformed query" },
+{ 109, "Database unavailable" },
+{ 110, "Operator unsupported" },
+{ 111, "Too many databases specified" },
+{ 112, "Too many result sets created" },
+{ 113, "Unsupported attribute type" },
+{ 114, "Unsupported Use attribute" },
+{ 115, "Unsupported value for Use attribute" },
+{ 116, "Use attribute required but not supplied" },
+{ 117, "Unsupported Relation attribute" },
+{ 118, "Unsupported Structure attribute" },
+{ 119, "Unsupported Position attribute" },
+{ 120, "Unsupported Truncation attribute" },
+{ 121, "Unsupported Attribute Set" },
+{ 122, "Unsupported Completeness attribute" },
+{ 123, "Unsupported attribute combination" },
+{ 124, "Unsupported coded value for term" },
+{ 125, "Malformed search term" },
+{ 126, "Illegal term value for attribute" },
+{ 127, "Unparsable format for un-normalized value" },
+{ 128, "Illegal result set name" },
+{ 129, "Proximity search of sets not supported" },
+{ 130, "Illegal result set in proximity search" },
+{ 131, "Unsupported proximity relation" },
+{ 132, "Unsupported proximity unit code" },
+{ 201, "Proximity not supported with this attribute combination" },
+{ 202, "Unsupported distance for proximity" },
+{ 203, "Ordered flag not supported for proximity" },
+{ 205, "Only zero step size supported for Scan" },
+{ 206, "Specified step size not supported for Scan" },
+{ 207, "Cannot sort according to sequence" },
+{ 208, "No result set name supplied on Sort" },
+{ 209, "Generic sort not supported (database-specific sort only supported)" },
+{ 210, "Database specific sort not supported" },
+{ 211, "Too many sort keys" },
+{ 212, "Duplicate sort keys" },
+{ 213, "Unsupported missing data action" },
+{ 214, "Illegal sort relation" },
+{ 215, "Illegal case value" },
+{ 216, "Illegal missing data action" },
+{ 217, "Segmentation: Cannot guarantee records will fit in specified segments"
+},
+{ 218, "ES: Package name already in use" },
+{ 219, "ES: no such package, on modify/delete" },
+{ 220, "ES: quota exceeded" },
+{ 221, "ES: extended service type not supported" },
+{ 222, "ES: permission denied on ES - id not authorized" },
+{ 223, "ES: permission denied on ES - cannot modify or delete" },
+{ 224, "ES: immediate execution failed" },
+{ 225, "ES: immediate execution not supported for this service" },
+{ 226, "ES: immediate execution not supported for these parameters" },
+{ 227, "No data available in requested record syntax" },
+{ 228, "Scan: malformed scan" },
+{ 229, "Term type not supported" },
+{ 230, "Sort: too many input results" },
+{ 231, "Sort: incompatible record formats" },
+{ 232, "Scan: term list not supported" },
+{ 233, "Scan: unsupported value of position-in-response" },
+{ 234, "Too many index terms processed" },
+{ 235, "Database does not exist" },
+{ 236, "Access to specified database denied" },
+{ 237, "Sort: illegal sort" },
+{ 238, "Record not available in requested syntax" },
+{ 239, "Record syntax not supported" },
+{ 240, "Scan: Resources exhausted looking for satisfying terms" },
+{ 241, "Scan: Beginning or end of term list" },
+{ 242, "Segmentation: max-segment-size too small to segment record" },
+{ 243, "Present: additional-ranges parameter not supported" },
+{ 244, "Present: comp-spec parameter not supported" },
+{ 245, "Type-1 query: restriction ('resultAttr') operand not supported" },
+{ 246, "Type-1 query: 'complex' attributeValue not supported" },
+{ 247, "Type-1 query: 'attributeSet' as part of AttributeElement not supported" },
+{ 1001, "Malformed APDU"},
+{ 1002, "ES: EXTERNAL form of Item Order request not supported" },
+{ 1003, "ES: Result set item form of Item Order request not supported" },
+{ 1004, "ES: Extended services not supported unless access control is in effect" },
+{ 1005, "Response records in Search response not supported" },
+{ 1006, "Response records in Search response not possible for specified database (or database combination)" },
+{ 1007, "No Explain server. Addinfo: pointers to servers that have a surrogate Explain database for this server" },
+{ 1008, "ES: missing mandatory parameter for specified function. Addinfo: parameter" },
+{ 1009, "ES: Item Order, unsupported OID in itemRequest. Addinfo: OID" },
+{ 1010, "Init/AC: Bad Userid" },
+{ 1011, "Init/AC: Bad Userid and/or Password" },
+{ 1012, "Init/AC: No searches remaining (pre-purchased searches exhausted)" },
+{ 1013, "Init/AC: Incorrect interface type (specified id valid only when used with a particular access method or client)" },
+{ 1014, "Init/AC: Authentication System error" },
+{ 1015, "Init/AC: Maximum number of simultaneous sessions for Userid" },
+{ 1016, "Init/AC: Blocked network address"},
+{ 1017, "Init/AC: No databases available for specified userId"},
+{ 1018, "Init/AC: System temporarily out of resources"},
+{ 1019, "Init/AC: System not available due to maintenance" },
+{ 1020, "Init/AC: System temporarily unavailable (Addinfo: when it's expected back up)"},
+{ 1021, "Init/AC: Account has expired"},
+{ 1022, "Init/AC: Password has expired so a new one must be supplied"},
+{ 1023, "Init/AC: Password has been changed by an administrator so a new one must be supplied"},
+{ 1024, "Unsupported Attribute" },
+{ 1025, "Service not supported for this database" },
+{ 1026, "Record cannot be opened because it is locked"},
+{ 1027, "SQL error" },
+{ 1028, "Record deleted" },
+{ 1029, "Scan: too many terms requested. Addinfo: max terms supported" },
+/* 1030 - 1039 /currently unnassigned */
+
+/* The following, 1040 - 1047, were approved at the June 1998 ZIG meeting.
+ These were originally proposed for addition to the Extended Services
+ diagnostic set. */
+{ 1040, "ES: Invalid function" },
+{ 1041, "ES: Error in retention time" },
+{ 1042, "ES: Permissions data not understood" },
+{ 1043, "ES: Invalid OID for task specific parameters" },
+{ 1044, "ES: Invalid action" },
+{ 1045, "ES: Unknown schema" },
+{ 1046, "ES: Too many records in package" },
+{ 1047, "ES: Invalid wait action" },
+/* The following, 1048 - 1053, were approved at the October 1998 ZIG
+ meeting. */
+{ 1048, "ES: Cannot create task package -- exceeds maximum permissable size"},
+{ 1049, "ES: Cannot return task package -- exceeds maximum permissable size"},
+{ 1050, "ES: Extended services request too large"},
+{ 1051, "Scan: Attribute set id required -- not supplied"},
+{ 1052, "ES: Cannot process task package record -- exceeds maximum "
+ "permissible record size for ES" },
+{ 1053, "ES: Cannot return task package record -- exceeds maximum "
+ "permissible record size for ES response" },
+/* The following, 1054 - 1057, were approved at the March 1999 ZIG
+ meeting. 1054 and 1055 are added for support of the Model for Z39.50
+ Negotiation During Initialization
+ <http://lcweb.loc.gov/z3950/agency/nego.html>. 1056 was added in
+ conjunction with the clarification Single-PDU, Multi-database Searching
+ -- Status <http://lcweb.loc.gov/z3950/agency/clarify/db-status.html> */
+{ 1054, "Init: Required negotiation record not included"},
+{ 1055, "Init: negotiation option required"},
+{ 1056, "Attribute not supported for database" },
+{ 1057, "ES: Unsupported value of task package parameter"},
+/* The following, 1058 - 1066, were approved at the August 1999 ZIG
+ meeting. 1058 through 1065 are added for support of the Z39.50 Duplicate
+ Detection Service <http://lcweb.loc.gov/z3950/agency/amend/dedup.html>. */
+{ 1058, "Duplicate Detection: Cannot dedup on requested record portion" },
+{ 1059, "Duplicate Detection: Requested detection criterion not supported" },
+{ 1060, "Duplicate Detection: Requested level of match not supported" },
+{ 1061, "Duplicate Detection: Requested regular expression not supported" },
+{ 1062, "Duplicate Detection: Cannot do clustering" },
+{ 1063, "Duplicate Detection: Retention criterion not supported"},
+{ 1064, "Duplicate Detection: Requested number (or percentage) of entries "
+ "for retention too large" },
+{ 1065, "Duplicate Detection: Requested sort criterion not supported" },
+{ 1066, "CompSpec: Unknown schema, or schema not supported."},
+/* The following, 1067 - 1069, were approved at the January 2000 ZIG
+ meeting. 1067 and 1068 are added for support of encapsulation
+ <http://lcweb.loc.gov/z3950/agency/amend/encapsulation.html> . */
+{ 1067, "Encapsulation: Encapsulated sequence of PDUs not supported" },
+{ 1068, "Encapsulation: Base operation (and encapsulated PDUs) not executed "
+ "based on pre-screening analysis" },
+{ 1069, "No syntaxes available for this request" },
+/* The following, 1070-1071, were approved at the July 2000 ZIG meeting.
+ These are defined in conjunction with the clarification Server Selected
+ Record Syntax <http://lcweb.loc.gov/z3950/agency/clarify/altsyntax.html> */
+{ 1070, "user not authorized to receive record(s) in requested syntax" },
+{ 1071, "preferredRecordSyntax not supplied" },
+/* The following diagnostic was approved at the October 2001 ZIG meeting.
+ See http://lists.w3.org/Archives/Public/www-zig/2001Jun/0006.html */
+{ 1072, "Query term includes characters that do not translate into the "
+ "target character set"},
+{ 0, NULL}
+};
+
+const char *diagbib1_str (int code)
+{
+ int i;
+ for (i=0; msg_tab[i].msg; i++)
+ if (msg_tab[i].code == code)
+ return msg_tab[i].msg;
+ return "Unknown error";
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: dumpber.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "odr-priv.h"
+
+static int do_dumpBER(FILE *f, const char *buf, int len, int level, int offset)
+{
+ int res, ll, zclass, tag, cons, lenlen, taglen;
+ const char *b = buf, *bp = buf;
+
+ if (!len)
+ return 0;
+ if (!buf[0] && !buf[1])
+ return 0;
+ if ((res = ber_dectag((unsigned char*)b, &zclass, &tag, &cons, len)) <= 0)
+ return 0;
+ if (res > len)
+ {
+ fprintf(stderr, "Unexpected end of buffer\n");
+ return 0;
+ }
+ fprintf(f, "%5d: %*s", offset, level * 4, "");
+ if (zclass == ODR_UNIVERSAL)
+ {
+ static char *nl[] =
+ {
+ "[Univ 0]", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING",
+ "NULL", "OID", "OBJECT DESCIPTOR", "EXTERNAL", "REAL",
+ "ENUM", "[UNIV 11]", "[UNIV 12]", "[UNIV 13]", "[UNIV 14]",
+ "[UNIV 15]", "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING",
+ "[UNIV 20]", "[UNIV 21]", "[UNIV 22]", "[UNIV 23]", "[UNIV 24]",
+ "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "[UNIV 28]"
+ };
+
+ if (tag >= 0 && tag < 28)
+ fprintf(f, "%s", nl[tag]);
+ else
+ fprintf(f, "[UNIV %d]", tag);
+ }
+ else if (zclass == ODR_CONTEXT)
+ fprintf(f, "[%d]", tag);
+ else
+ fprintf(f, "[%d:%d]", zclass, tag);
+ b += res;
+ taglen = res;
+ len -= res;
+ bp = b;
+ if ((res = ber_declen((unsigned char*)b, &ll, len)) <= 0)
+ {
+ fprintf(f, "\n%*sBad length\n", level*4+5, "");
+ return 0;
+ }
+ lenlen = res;
+ b += res;
+ len -= res;
+ if (ll >= 0)
+ fprintf(f, " len=%d", ll);
+ else
+ fprintf(f, " len=?");
+ fprintf(f, " tl=%d, ll=%d cons=%d\n", taglen, lenlen, cons);
+ if (!cons)
+ {
+ if (ll < 0 || ll > len)
+ {
+ fprintf(f, "%*sBad length on primitive type. ll=%d len=%d\n",
+ level*4+5, "", ll, len);
+ return 0;
+ }
+ return ll + (b - buf);
+ }
+ if (ll >= 0)
+ {
+ if (ll > len)
+ {
+ fprintf(f, "%*sBad length of constructed type ll=%d len=%d.\n",
+ level*4+5, "", ll, len);
+ return 0;
+ }
+ len = ll;
+ }
+ /* constructed - cycle through children */
+ while ((ll == -1 && len >= 2) || (ll >= 0 && len))
+ {
+ if (ll == -1 && *b == 0 && *(b + 1) == 0)
+ break;
+ if (!(res = do_dumpBER(f, b, len, level + 1, offset + (b - buf))))
+ {
+ fprintf(f, "%*sDump of content element failed.\n", level*4+5, "");
+ return 0;
+ }
+ b += res;
+ len -= res;
+ if (len < 0)
+ {
+ fprintf(f, "%*sBad length\n", level*4+5, "");
+ return 0;
+ }
+ }
+ if (ll == -1)
+ {
+ if (len < 2)
+ {
+ fprintf(f, "%*sBuffer too short in indefinite length.\n",
+ level*4+5, "");
+ return 0;
+ }
+ return (b - buf) + 2;
+ }
+ return b - buf;
+}
+
+int odr_dumpBER(FILE *f, const char *buf, int len)
+{
+ return do_dumpBER(f, buf, len, 0, 0);
+}
--- /dev/null
+ESFormat-Admin
+{Z39-50-extendedService Index-Data(81) AdminES (1)} DEFINITIONS ::=
+ -- oid is 1.2.840.10003.9.81.1
+BEGIN
+IMPORTS DiagRec, InternationalString, Segment
+FROM Z39-50-APDU-1995;
+Admin ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1]
+ OriginPartToKeep,
+ targetPart [2] TargetPart}}
+
+OriginPartToKeep ::= SEQUENCE{
+action [1] CHOICE{
+ reIndex [1] NULL,
+ truncate [2] NULL,
+ drop [3] NULL,
+ create [4] NULL,
+ import [5] ImportParameters,
+ refresh [6] NULL, -- Review internal representation of records against source files on disk to
+ -- see if they have been updated.
+ commit [7] NULL,
+ shutdown [8] NULL,
+ start [9] NULL},
+databaseName [2] IMPLICIT InternationalString OPTIONAL}
+
+OriginPartNotToKeep ::= CHOICE{
+records [1] Segment,
+recordsWillFollow [0] NULL}
+
+TargetPart ::= SEQUENCE{
+ updateStatus [1] IMPLICIT INTEGER{
+ success (1),
+ partial (2),
+ failure (3)},
+ globalDiagnostics [2] IMPLICIT SEQUENCE OF
+ DiagRec OPTIONAL
+ }
+
+-- Auxiliary definitions for Admin
+
+ImportParameters ::= SEQUENCE{
+ recordType [1] IMPLICIT InternationalString
+}
+
+END
--- /dev/null
+ESFormat-Update
+{Z39-50-extendedService Update (5) revisions (1) revision-1 (1)} DEFINITIONS ::=
+ -- oid is 1.2.840.10003.9.5.1.1
+BEGIN
+IMPORTS DiagRec, InternationalString
+FROM Z39-50-APDU-1995;
+Update ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1]
+ OriginPartToKeep,
+ targetPart [2] TargetPart}}
+
+OriginPartToKeep ::= SEQUENCE{
+action [1] IMPLICIT INTEGER{
+ recordInsert (1),
+ recordReplace (2),
+ recordDelete (3),
+ elementUpdate (4),
+ specialUpdate (5)},
+ databaseName [2] IMPLICIT InternationalString,
+ schema [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ elementSetName [4] IMPLICIT InternationalString OPTIONAL,
+ actionQualifier [5] IMPLICIT EXTERNAL OPTIONAL}
+
+OriginPartNotToKeep ::= SuppliedRecords
+
+TargetPart ::= SEQUENCE{
+ updateStatus [1] IMPLICIT INTEGER{
+ success (1),
+ partial (2),
+ failure (3)},
+ globalDiagnostics [2] IMPLICIT SEQUENCE OF
+ DiagRec OPTIONAL,
+ -- These are non-surrogate
+ -- diagnosticsrelating to the task,
+ -- not to individual records.
+ taskPackageRecords [3] IMPLICIT SEQUENCE OF
+TaskPackageRecordStructure
+ -- There should be a
+ -- TaskPackageRecordStructure
+ -- for every record supplied.
+ -- The target should create
+ -- such a structure for every
+ -- record immediately upon
+ -- creating the task package
+ -- to include correlation
+ -- information and status.
+ -- The record itself would not
+ -- be included until processing
+ -- for that record is complete.
+ }
+
+-- Auxiliary definitions for Update
+SuppliedRecords ::= SEQUENCE OF SEQUENCE{
+ recordId [1] CHOICE{
+ number [1] IMPLICIT INTEGER,
+ string [2] IMPLICIT InternationalString,
+ opaque [3] IMPLICIT OCTET STRING} OPTIONAL,
+ supplementalId [2] CHOICE{
+ timeStamp [1] IMPLICIT GeneralizedTime,
+ versionNumber [2] IMPLICIT InternationalString,
+ previousVersion [3] IMPLICIT EXTERNAL} OPTIONAL,
+ correlationInfo [3] IMPLICIT CorrelationInfo OPTIONAL,
+ record [4] IMPLICIT EXTERNAL}
+
+CorrelationInfo ::= SEQUENCE{
+ -- origin may supply one or both for any record:
+ note [1] IMPLICIT InternationalString OPTIONAL,
+ id [2] IMPLICIT INTEGER OPTIONAL}
+
+TaskPackageRecordStructure ::= SEQUENCE{
+ recordOrSurDiag [1] CHOICE {
+ record [1] IMPLICIT EXTERNAL,
+ -- Choose 'record' if
+ -- recordStatus is 'success', and
+ -- elementSetName was supplied.
+
+ surrogateDiagnostics [2] IMPLICIT
+ SEQUENCE OF DiagRec
+ -- Choose 'SurrogateDiagnostics', if
+ -- RecordStatus is failure.
+ } OPTIONAL,
+ -- The parameter recordOrSurDiag
+ -- will thus be omitted only if
+ -- 'elementSetName' was omitted and
+ -- recordStatus is 'success'; or
+ --if record status is 'queued'
+ -- or in 'process'.
+ correlationInfo [2] IMPLICIT
+ CorrelationInfo OPTIONAL,
+ -- This should be included
+ -- if it was supplied by the origin.
+ recordStatus [3] IMPLICIT INTEGER{
+ success (1),
+ queued (2),
+ inProcess (3),
+ failure (4)},
+ supplementalDiagnostics [4] IMPLICIT
+ SEQUENCE OF DiagRec OPTIONAL}
+END
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: eventl.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include <yaz/yconfig.h>
+#include <yaz/log.h>
+#include <yaz/comstack.h>
+#include <yaz/xmalloc.h>
+#include "eventl.h"
+#include "session.h"
+#include <yaz/statserv.h>
+
+#if YAZ_GNU_THREADS
+#include <pth.h>
+#define YAZ_EV_SELECT pth_select
+#endif
+
+#ifndef YAZ_EV_SELECT
+#define YAZ_EV_SELECT select
+#endif
+
+IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
+{
+ IOCHAN new_iochan;
+
+ if (!(new_iochan = (IOCHAN)xmalloc(sizeof(*new_iochan))))
+ return 0;
+ new_iochan->destroyed = 0;
+ new_iochan->fd = fd;
+ new_iochan->flags = flags;
+ new_iochan->fun = cb;
+ new_iochan->force_event = 0;
+ new_iochan->last_event = new_iochan->max_idle = 0;
+ new_iochan->next = NULL;
+ return new_iochan;
+}
+
+int event_loop(IOCHAN *iochans)
+{
+ do /* loop as long as there are active associations to process */
+ {
+ IOCHAN p, nextp;
+ fd_set in, out, except;
+ int res, max;
+ static struct timeval to;
+ time_t now = time(0);
+
+ if (statserv_must_terminate())
+ {
+ for (p = *iochans; p; p = p->next)
+ p->force_event = EVENT_TIMEOUT;
+ }
+ FD_ZERO(&in);
+ FD_ZERO(&out);
+ FD_ZERO(&except);
+ to.tv_sec = 3600;
+ to.tv_usec = 0;
+ max = 0;
+ for (p = *iochans; p; p = p->next)
+ {
+ time_t w, ftime;
+ yaz_log(LOG_DEBUG, "fd=%d flags=%d force_event=%d",
+ p->fd, p->flags, p->force_event);
+ if (p->force_event)
+ to.tv_sec = 0; /* polling select */
+ if (p->flags & EVENT_INPUT)
+ FD_SET(p->fd, &in);
+ if (p->flags & EVENT_OUTPUT)
+ FD_SET(p->fd, &out);
+ if (p->flags & EVENT_EXCEPT)
+ FD_SET(p->fd, &except);
+ if (p->fd > max)
+ max = p->fd;
+ if (p->max_idle && p->last_event)
+ {
+ ftime = p->last_event + p->max_idle;
+ if (ftime < now)
+ w = p->max_idle;
+ else
+ w = ftime - now;
+ if (w < to.tv_sec)
+ to.tv_sec = w;
+ }
+ }
+ yaz_log(LOG_DEBUG, "select start %ld", (long) to.tv_sec);
+ res = YAZ_EV_SELECT(max + 1, &in, &out, &except, &to);
+ yaz_log(LOG_DEBUG, "select end");
+ if (res < 0)
+ {
+ if (yaz_errno() == EINTR)
+ {
+ if (statserv_must_terminate())
+ {
+ for (p = *iochans; p; p = p->next)
+ p->force_event = EVENT_TIMEOUT;
+ }
+ continue;
+ }
+ else
+ {
+ /* Destroy the first member in the chain, and try again */
+ association *assoc = (association *)iochan_getdata(*iochans);
+ COMSTACK conn = assoc->client_link;
+
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(*iochans);
+ yaz_log(LOG_DEBUG, "error select, destroying iochan %p",
+ *iochans);
+ }
+ }
+ now = time(0);
+ for (p = *iochans; p; p = p->next)
+ {
+ int force_event = p->force_event;
+
+ p->force_event = 0;
+ if (!p->destroyed && (FD_ISSET(p->fd, &in) ||
+ force_event == EVENT_INPUT))
+ {
+ p->last_event = now;
+ (*p->fun)(p, EVENT_INPUT);
+ }
+ if (!p->destroyed && (FD_ISSET(p->fd, &out) ||
+ force_event == EVENT_OUTPUT))
+ {
+ p->last_event = now;
+ (*p->fun)(p, EVENT_OUTPUT);
+ }
+ if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
+ force_event == EVENT_EXCEPT))
+ {
+ p->last_event = now;
+ (*p->fun)(p, EVENT_EXCEPT);
+ }
+ if (!p->destroyed && ((p->max_idle && now - p->last_event >=
+ p->max_idle) || force_event == EVENT_TIMEOUT))
+ {
+ p->last_event = now;
+ (*p->fun)(p, EVENT_TIMEOUT);
+ }
+ }
+ for (p = *iochans; p; p = nextp)
+ {
+ nextp = p->next;
+
+ if (p->destroyed)
+ {
+ IOCHAN tmp = p, pr;
+
+ /* We need to inform the threadlist that this channel has been destroyed */
+ statserv_remove(p);
+
+ /* Now reset the pointers */
+ if (p == *iochans)
+ *iochans = p->next;
+ else
+ {
+ for (pr = *iochans; pr; pr = pr->next)
+ if (pr->next == p)
+ break;
+ assert(pr); /* grave error if it weren't there */
+ pr->next = p->next;
+ }
+ if (nextp == p)
+ nextp = p->next;
+ xfree(tmp);
+ }
+ }
+ }
+ while (*iochans);
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: eventl.h,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#ifndef EVENTL_H
+#define EVENTL_H
+
+#include <time.h>
+
+struct iochan;
+
+typedef void (*IOC_CALLBACK)(struct iochan *i, int event);
+
+typedef struct iochan
+{
+ int fd;
+ int flags;
+#define EVENT_INPUT 0x01
+#define EVENT_OUTPUT 0x02
+#define EVENT_EXCEPT 0x04
+#define EVENT_TIMEOUT 0x08
+#define EVENT_WORK 0x10
+int force_event;
+ IOC_CALLBACK fun;
+ void *data;
+ int destroyed;
+ time_t last_event;
+ time_t max_idle;
+
+ struct iochan *next;
+} *IOCHAN;
+
+#define iochan_destroy(i) (void)((i)->destroyed = 1)
+#define iochan_getfd(i) ((i)->fd)
+#define iochan_setfd(i, f) ((i)->fd = (f))
+#define iochan_getdata(i) ((i)->data)
+#define iochan_setdata(i, d) ((i)->data = d)
+#define iochan_getflags(i) ((i)->flags)
+#define iochan_setflags(i, d) ((i)->flags = d)
+#define iochan_setflag(i, d) ((i)->flags |= d)
+#define iochan_clearflag(i, d) ((i)->flags &= ~(d))
+#define iochan_getflag(i, d) ((i)->flags & d ? 1 : 0)
+#define iochan_getfun(i) ((i)->fun)
+#define iochan_setfun(i, d) ((i)->fun = d)
+#define iochan_setevent(i, e) ((i)->force_event = (e))
+#define iochan_getnext(i) ((i)->next)
+#define iochan_settimeout(i, t) ((i)->max_idle = (t), (i)->last_event = time(0))
+
+IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags);
+int event_loop(IOCHAN *iochans);
+void statserv_remove (IOCHAN pIOChannel);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2002, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: grs1disp.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <yaz/proto.h>
+
+static void display_variant(WRBUF w, Z_Variant *v, int level)
+{
+ int i;
+
+ for (i = 0; i < v->num_triples; i++)
+ {
+ printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
+ *v->triples[i]->type);
+ if (v->triples[i]->which == Z_Triple_internationalString)
+ printf(",value=%s\n", v->triples[i]->value.internationalString);
+ else
+ printf("\n");
+ }
+}
+
+static void display_grs1(WRBUF w, Z_GenericRecord *r, int level)
+{
+ int i;
+
+ if (!r)
+ {
+ return;
+ }
+ for (i = 0; i < r->num_elements; i++)
+ {
+ Z_TaggedElement *t;
+
+ wrbuf_printf(w, "%*s", level * 4, "");
+ t = r->elements[i];
+ wrbuf_printf(w, "(");
+ if (t->tagType)
+ wrbuf_printf(w, "%d,", *t->tagType);
+ else
+ wrbuf_printf(w, "?,");
+ if (t->tagValue->which == Z_StringOrNumeric_numeric)
+ wrbuf_printf(w, "%d) ", *t->tagValue->u.numeric);
+ else
+ wrbuf_printf(w, "%s) ", t->tagValue->u.string);
+ if (t->content->which == Z_ElementData_subtree)
+ {
+ if (!t->content->u.subtree)
+ printf (" (no subtree)\n");
+ else
+ {
+ wrbuf_printf(w, "\n");
+ display_grs1(w, t->content->u.subtree, level+1);
+ }
+ }
+ else if (t->content->which == Z_ElementData_string)
+ wrbuf_printf(w, "%s\n", t->content->u.string);
+ else if (t->content->which == Z_ElementData_numeric)
+ wrbuf_printf(w, "%d\n", *t->content->u.numeric);
+ else if (t->content->which == Z_ElementData_oid)
+ {
+ int *ip = t->content->u.oid;
+ oident *oent;
+
+ if ((oent = oid_getentbyoid(t->content->u.oid)))
+ wrbuf_printf(w, "OID: %s\n", oent->desc);
+ else
+ {
+ wrbuf_printf(w, "{");
+ while (ip && *ip >= 0)
+ wrbuf_printf(w, " %d", *(ip++));
+ wrbuf_printf(w, " }\n");
+ }
+ }
+ else if (t->content->which == Z_ElementData_noDataRequested)
+ wrbuf_printf(w, "[No data requested]\n");
+ else if (t->content->which == Z_ElementData_elementEmpty)
+ wrbuf_printf(w, "[Element empty]\n");
+ else if (t->content->which == Z_ElementData_elementNotThere)
+ wrbuf_printf(w, "[Element not there]\n");
+ else if (t->content->which == Z_ElementData_date)
+ wrbuf_printf(w, "Date: %s\n", t->content->u.date);
+ else if (t->content->which == Z_ElementData_ext)
+ {
+ printf ("External\n");
+ /* we cannot print externals here. Srry */
+ }
+ else
+ wrbuf_printf(w, "? type = %d\n",t->content->which);
+ if (t->appliedVariant)
+ display_variant(w, t->appliedVariant, level+1);
+ if (t->metaData && t->metaData->supportedVariants)
+ {
+ int c;
+
+ wrbuf_printf(w, "%*s---- variant list\n", (level+1)*4, "");
+ for (c = 0; c < t->metaData->num_supportedVariants; c++)
+ {
+ wrbuf_printf(w, "%*svariant #%d\n", (level+1)*4, "", c);
+ display_variant(w, t->metaData->supportedVariants[c], level+2);
+ }
+ }
+ }
+}
+
+void yaz_display_grs1(WRBUF wrbuf, Z_GenericRecord *r, int flags)
+{
+ display_grs1 (wrbuf, r, 0);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1999-2001, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Log: ill-get.c,v $
+ * Revision 1.1 2003-10-27 12:21:30 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.9 2001/03/25 21:55:12 adam
+ * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
+ *
+ * Revision 1.8 2001/02/21 13:46:53 adam
+ * C++ fixes.
+ *
+ * Revision 1.7 2001/02/20 11:25:32 adam
+ * Added ill_get_APDU and ill_get_Cancel.
+ *
+ * Revision 1.6 2000/08/10 08:41:26 adam
+ * Fixes for ILL.
+ *
+ * Revision 1.5 2000/02/24 08:52:01 adam
+ * Bug fix.
+ *
+ * Revision 1.4 2000/02/04 11:01:15 adam
+ * Added more elements.
+ *
+ * Revision 1.3 2000/01/31 13:15:21 adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.2 2000/01/15 09:38:51 adam
+ * Implemented ill_get_ILLRequest. Added some type mappings for ILL protocol.
+ *
+ * Revision 1.1 1999/12/16 23:36:19 adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ */
+
+#include <yaz/ill.h>
+
+bool_t *ill_get_bool (struct ill_get_ctl *gc, const char *name,
+ const char *sub, int val)
+{
+ ODR o = gc->odr;
+ char element[128];
+ const char *v;
+ bool_t *r = (bool_t *) odr_malloc (o, sizeof(*r));
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+
+ v = (gc->f)(gc->clientData, element);
+ if (v)
+ val = atoi(v);
+ else if (val < 0)
+ return 0;
+ *r = val;
+ return r;
+}
+
+int *ill_get_int (struct ill_get_ctl *gc, const char *name,
+ const char *sub, int val)
+{
+ ODR o = gc->odr;
+ char element[128];
+ const char *v;
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ v = (gc->f)(gc->clientData, element);
+ if (v)
+ val = atoi(v);
+ return odr_intdup(o, val);
+}
+
+int *ill_get_enumerated (struct ill_get_ctl *gc, const char *name,
+ const char *sub, int val)
+{
+ return ill_get_int(gc, name, sub, val);
+}
+
+ILL_String *ill_get_ILL_String_x (struct ill_get_ctl *gc, const char *name,
+ const char *sub, const char *vdefault)
+{
+ ILL_String *r = (ILL_String *) odr_malloc (gc->odr, sizeof(*r));
+ char element[128];
+ const char *v;
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ v = (gc->f)(gc->clientData, element);
+ if (!v)
+ v = vdefault;
+ if (!v)
+ return 0;
+ r->which = ILL_String_GeneralString;
+ r->u.GeneralString = odr_strdup (gc->odr, v);
+ return r;
+}
+
+ILL_String *ill_get_ILL_String(struct ill_get_ctl *gc, const char *name,
+ const char *sub)
+{
+ return ill_get_ILL_String_x (gc, name, sub, 0);
+}
+
+ILL_ISO_Date *ill_get_ILL_ISO_Date (struct ill_get_ctl *gc, const char *name,
+ const char *sub, const char *val)
+{
+ char element[128];
+ const char *v;
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ v = (gc->f)(gc->clientData, element);
+ if (!v)
+ v = val;
+ if (!v)
+ return 0;
+ return odr_strdup (gc->odr, v);
+}
+
+ILL_ISO_Time *ill_get_ILL_ISO_Time (struct ill_get_ctl *gc, const char *name,
+ const char *sub, const char *val)
+{
+ char element[128];
+ const char *v;
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ v = (gc->f)(gc->clientData, element);
+ if (!v)
+ v = val;
+ if (!v)
+ return 0;
+ return odr_strdup (gc->odr, v);
+}
+
+ILL_Person_Or_Institution_Symbol *ill_get_Person_Or_Insitution_Symbol (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ char element[128];
+ ODR o = gc->odr;
+ ILL_Person_Or_Institution_Symbol *p =
+ (ILL_Person_Or_Institution_Symbol *) odr_malloc (o, sizeof(*p));
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ p->which = ILL_Person_Or_Institution_Symbol_person_symbol;
+ if ((p->u.person_symbol = ill_get_ILL_String (gc, element, "person")))
+ return p;
+
+ p->which = ILL_Person_Or_Institution_Symbol_institution_symbol;
+ if ((p->u.institution_symbol =
+ ill_get_ILL_String (gc, element, "institution")))
+ return p;
+ return 0;
+}
+
+static ILL_Name_Of_Person_Or_Institution *ill_get_Name_Of_Person_Or_Institution(
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ char element[128];
+ ODR o = gc->odr;
+ ILL_Name_Of_Person_Or_Institution *p =
+ (ILL_Name_Of_Person_Or_Institution *) odr_malloc (o, sizeof(*p));
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ p->which = ILL_Name_Of_Person_Or_Institution_name_of_person;
+ if ((p->u.name_of_person =
+ ill_get_ILL_String (gc, element, "name-of-person")))
+ return p;
+
+ p->which = ILL_Name_Of_Person_Or_Institution_name_of_institution;
+ if ((p->u.name_of_institution =
+ ill_get_ILL_String (gc, element, "name-of-institution")))
+ return p;
+ return 0;
+}
+
+ILL_System_Id *ill_get_System_Id(struct ill_get_ctl *gc,
+ const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ char element[128];
+ ILL_System_Id *p;
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ p = (ILL_System_Id *) odr_malloc (o, sizeof(*p));
+ p->person_or_institution_symbol = ill_get_Person_Or_Insitution_Symbol (
+ gc, element, "person-or-institution-symbol");
+ p->name_of_person_or_institution = ill_get_Name_Of_Person_Or_Institution (
+ gc, element, "name-of-person-or-institution");
+ return p;
+}
+
+ILL_Transaction_Id *ill_get_Transaction_Id (struct ill_get_ctl *gc,
+ const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Transaction_Id *r = (ILL_Transaction_Id *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->initial_requester_id =
+ ill_get_System_Id (gc, element, "initial-requester-id");
+ r->transaction_group_qualifier =
+ ill_get_ILL_String_x (gc, element, "transaction-group-qualifier", "");
+ r->transaction_qualifier =
+ ill_get_ILL_String_x (gc, element, "transaction-qualifier", "");
+ r->sub_transaction_qualifier =
+ ill_get_ILL_String (gc, element, "sub-transaction-qualifier");
+ return r;
+}
+
+
+ILL_Service_Date_this *ill_get_Service_Date_this (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Service_Date_this *r =
+ (ILL_Service_Date_this *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->date = ill_get_ILL_ISO_Date (gc, element, "date", "20000101");
+ r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
+ return r;
+}
+
+ILL_Service_Date_original *ill_get_Service_Date_original (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Service_Date_original *r =
+ (ILL_Service_Date_original *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->date = ill_get_ILL_ISO_Date (gc, element, "date", 0);
+ r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
+ if (!r->date && !r->time)
+ return 0;
+ return r;
+}
+
+ILL_Service_Date_Time *ill_get_Service_Date_Time (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Service_Date_Time *r =
+ (ILL_Service_Date_Time *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->date_time_of_this_service = ill_get_Service_Date_this (
+ gc, element, "this");
+ r->date_time_of_original_service = ill_get_Service_Date_original (
+ gc, element, "original");
+ return r;
+}
+
+ILL_Requester_Optional_Messages_Type *ill_get_Requester_Optional_Messages_Type (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Requester_Optional_Messages_Type *r =
+ (ILL_Requester_Optional_Messages_Type *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->can_send_RECEIVED = ill_get_bool (gc, element, "can-send-RECEIVED", 0);
+ r->can_send_RETURNED = ill_get_bool (gc, element, "can-send-RETURNED", 0);
+ r->requester_SHIPPED =
+ ill_get_enumerated (gc, element, "requester-SHIPPED", 1);
+ r->requester_CHECKED_IN =
+ ill_get_enumerated (gc, element, "requester-CHECKED-IN", 1);
+ return r;
+}
+
+ILL_Item_Id *ill_get_Item_Id (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Item_Id *r = (ILL_Item_Id *) odr_malloc (o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->item_type = ill_get_enumerated (gc, element, "item-type",
+ ILL_Item_Id_monograph);
+ r->held_medium_type = 0;
+ r->call_number = ill_get_ILL_String(gc, element, "call-number");
+ r->author = ill_get_ILL_String(gc, element, "author");
+ r->title = ill_get_ILL_String(gc, element, "title");
+ r->sub_title = ill_get_ILL_String(gc, element, "sub-title");
+ r->sponsoring_body = ill_get_ILL_String(gc, element, "sponsoring-body");
+ r->place_of_publication =
+ ill_get_ILL_String(gc, element, "place-of-publication");
+ r->publisher = ill_get_ILL_String(gc, element, "publisher");
+ r->series_title_number =
+ ill_get_ILL_String(gc, element, "series-title-number");
+ r->volume_issue = ill_get_ILL_String(gc, element, "volume-issue");
+ r->edition = ill_get_ILL_String(gc, element, "edition");
+ r->publication_date = ill_get_ILL_String(gc, element, "publication-date");
+ r->publication_date_of_component =
+ ill_get_ILL_String(gc, element, "publication-date-of-component");
+ r->author_of_article = ill_get_ILL_String(gc, element,
+ "author-of-article");
+ r->title_of_article = ill_get_ILL_String(gc, element, "title-of-article");
+ r->pagination = ill_get_ILL_String(gc, element, "pagination");
+ r->national_bibliography_no = 0;
+ r->iSBN = ill_get_ILL_String(gc, element, "ISBN");
+ r->iSSN = ill_get_ILL_String(gc, element, "ISSN");
+ r->system_no = 0;
+ r->additional_no_letters =
+ ill_get_ILL_String(gc, element, "additional-no-letters");
+ r->verification_reference_source =
+ ill_get_ILL_String(gc, element, "verification-reference-source");
+ return r;
+}
+
+
+ILL_Client_Id *ill_get_Client_Id (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ char element[128];
+ ODR o = gc->odr;
+ ILL_Client_Id *r = (ILL_Client_Id *) odr_malloc(o, sizeof(*r));
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->client_name = ill_get_ILL_String (gc, element, "client-name");
+ r->client_status = ill_get_ILL_String (gc, element, "client-status");
+ r->client_identifier = ill_get_ILL_String (gc, element,
+ "client-identifier");
+ return r;
+}
+
+ILL_Postal_Address *ill_get_Postal_Address (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Postal_Address *r =
+ (ILL_Postal_Address *) odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->name_of_person_or_institution =
+ ill_get_Name_Of_Person_Or_Institution (
+ gc, element, "name-of-person-or-institution");
+ r->extended_postal_delivery_address =
+ ill_get_ILL_String (
+ gc, element, "extended-postal-delivery-address");
+ r->street_and_number =
+ ill_get_ILL_String (gc, element, "street-and-number");
+ r->post_office_box =
+ ill_get_ILL_String (gc, element, "post-office-box");
+ r->city = ill_get_ILL_String (gc, element, "city");
+ r->region = ill_get_ILL_String (gc, element, "region");
+ r->country = ill_get_ILL_String (gc, element, "country");
+ r->postal_code = ill_get_ILL_String (gc, element, "postal-code");
+ return r;
+}
+
+ILL_System_Address *ill_get_System_Address (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_System_Address *r =
+ (ILL_System_Address *) odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->telecom_service_identifier =
+ ill_get_ILL_String (gc, element, "telecom-service-identifier");
+ r->telecom_service_address =
+ ill_get_ILL_String (gc, element, "telecom-service-addreess");
+ return r;
+}
+
+ILL_Delivery_Address *ill_get_Delivery_Address (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Delivery_Address *r =
+ (ILL_Delivery_Address *) odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->postal_address =
+ ill_get_Postal_Address (gc, element, "postal-address");
+ r->electronic_address =
+ ill_get_System_Address (gc, element, "electronic-address");
+ return r;
+}
+
+ILL_Search_Type *ill_get_Search_Type (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Search_Type *r = (ILL_Search_Type *) odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->level_of_service = ill_get_ILL_String (gc, element, "level-of-service");
+ r->need_before_date = ill_get_ILL_ISO_Date (gc, element,
+ "need-before-date", 0);
+ r->expiry_date = ill_get_ILL_ISO_Date (gc, element, "expiry-date", 0);
+ r->expiry_flag = ill_get_enumerated (gc, element, "expiry-flag", 3);
+
+ return r;
+}
+
+ILL_Request *ill_get_ILLRequest (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Request *r = (ILL_Request *) odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->protocol_version_num =
+ ill_get_enumerated (gc, element, "protocol-version-num",
+ ILL_Request_version_2);
+
+ r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
+ r->service_date_time =
+ ill_get_Service_Date_Time (gc, element, "service-date-time");
+ r->requester_id = ill_get_System_Id (gc, element, "requester-id");
+ r->responder_id = ill_get_System_Id (gc, element, "responder-id");
+ r->transaction_type =
+ ill_get_enumerated(gc, element, "transaction-type", 1);
+
+ r->delivery_address =
+ ill_get_Delivery_Address (gc, element, "delivery-address");
+ r->delivery_service = 0; /* TODO */
+ /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
+ r->billing_address =
+ ill_get_Delivery_Address (gc, element, "billing-address");
+
+ r->num_iLL_service_type = 1;
+ r->iLL_service_type = (ILL_Service_Type **)
+ odr_malloc (o, sizeof(*r->iLL_service_type));
+ *r->iLL_service_type =
+ ill_get_enumerated (gc, element, "ill-service-type",
+ ILL_Service_Type_copy_non_returnable);
+
+ r->responder_specific_service = 0;
+ r->requester_optional_messages =
+ ill_get_Requester_Optional_Messages_Type (
+ gc, element,"requester-optional-messages");
+ r->search_type = ill_get_Search_Type(gc, element, "search-type");
+ r->num_supply_medium_info_type = 0;
+ r->supply_medium_info_type = 0;
+
+ r->place_on_hold = ill_get_enumerated (
+ gc, element, "place-on-hold",
+ ILL_Place_On_Hold_Type_according_to_responder_policy);
+ r->client_id = ill_get_Client_Id (gc, element, "client-id");
+
+ r->item_id = ill_get_Item_Id (gc, element, "item-id");
+ r->supplemental_item_description = 0;
+ r->cost_info_type = 0;
+ r->copyright_compliance =
+ ill_get_ILL_String(gc, element, "copyright-complicance");
+ r->third_party_info_type = 0;
+ r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
+ r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
+ r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
+ r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
+ r->num_iLL_request_extensions = 0;
+ r->iLL_request_extensions = 0;
+ return r;
+}
+
+ILL_ItemRequest *ill_get_ItemRequest (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_ItemRequest *r = (ILL_ItemRequest *)odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->protocol_version_num =
+ ill_get_enumerated (gc, element, "protocol-version-num",
+ ILL_Request_version_2);
+
+ r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
+ r->service_date_time =
+ ill_get_Service_Date_Time (gc, element, "service-date-time");
+ r->requester_id = ill_get_System_Id (gc, element, "requester-id");
+ r->responder_id = ill_get_System_Id (gc, element, "responder-id");
+ r->transaction_type =
+ ill_get_enumerated(gc, element, "transaction-type", 1);
+
+ r->delivery_address =
+ ill_get_Delivery_Address (gc, element, "delivery-address");
+ r->delivery_service = 0; /* TODO */
+ /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
+ r->billing_address =
+ ill_get_Delivery_Address (gc, element, "billing-address");
+
+ r->num_iLL_service_type = 1;
+ r->iLL_service_type = (ILL_Service_Type **)
+ odr_malloc (o, sizeof(*r->iLL_service_type));
+ *r->iLL_service_type =
+ ill_get_enumerated (gc, element, "ill-service-type",
+ ILL_Service_Type_copy_non_returnable);
+
+ r->responder_specific_service = 0;
+ r->requester_optional_messages =
+ ill_get_Requester_Optional_Messages_Type (
+ gc, element,"requester-optional-messages");
+ r->search_type = ill_get_Search_Type(gc, element, "search-type");
+ r->num_supply_medium_info_type = 0;
+ r->supply_medium_info_type = 0;
+
+ r->place_on_hold = ill_get_enumerated (
+ gc, element, "place-on-hold",
+ ILL_Place_On_Hold_Type_according_to_responder_policy);
+ r->client_id = ill_get_Client_Id (gc, element, "client-id");
+
+ r->item_id = ill_get_Item_Id (gc, element, "item-id");
+ r->supplemental_item_description = 0;
+ r->cost_info_type = 0;
+ r->copyright_compliance =
+ ill_get_ILL_String(gc, element, "copyright-complicance");
+ r->third_party_info_type = 0;
+ r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
+ r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
+ r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
+ r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
+ r->num_iLL_request_extensions = 0;
+ r->iLL_request_extensions = 0;
+ return r;
+}
+
+ILL_Cancel *ill_get_Cancel (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_Cancel *r = (ILL_Cancel *)odr_malloc(o, sizeof(*r));
+ char element[128];
+
+ strcpy(element, name);
+ if (sub)
+ {
+ strcat (element, ",");
+ strcat (element, sub);
+ }
+ r->protocol_version_num =
+ ill_get_enumerated (gc, element, "protocol-version-num",
+ ILL_Request_version_2);
+
+ r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
+ r->service_date_time =
+ ill_get_Service_Date_Time (gc, element, "service-date-time");
+ r->requester_id = ill_get_System_Id (gc, element, "requester-id");
+ r->responder_id = ill_get_System_Id (gc, element, "responder-id");
+ r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
+
+ r->num_cancel_extensions = 0;
+ r->cancel_extensions = 0;
+ return r;
+}
+
+ILL_APDU *ill_get_APDU (
+ struct ill_get_ctl *gc, const char *name, const char *sub)
+{
+ ODR o = gc->odr;
+ ILL_APDU *r = (ILL_APDU *)odr_malloc(o, sizeof(*r));
+ char element[128];
+ const char *v;
+
+ strcpy (element, name);
+ strcat (element, ",which");
+
+ v = (gc->f)(gc->clientData, element);
+ if (!v)
+ v = "request";
+ if (!strcmp (v, "request"))
+ {
+ r->which = ILL_APDU_ILL_Request;
+ r->u.illRequest = ill_get_ILLRequest(gc, name, sub);
+ }
+ else if (!strcmp (v, "cancel"))
+ {
+ r->which = ILL_APDU_Cancel;
+ r->u.Cancel = ill_get_Cancel(gc, name, sub);
+ }
+ else
+ return 0;
+ return r;
+}
--- /dev/null
+# Config File for ILL
+# $Id: ill.tcl,v 1.1 2003-10-27 12:21:30 adam Exp $
+# ----------------------------------------------------------
+# Prefix Specifications
+#
+# 1: C function prefix
+# 2: C type prefix
+# 3: C preprocessor prefix
+
+# Default prefix
+set default-prefix {ill_ ILL_ ILL_}
+
+# ----------------------------------------------------------
+set m ISO-10161-ILL-1
+
+# Filename
+set filename($m) ill-core
+
+# Header initialization code
+set init($m,h) "
+"
+
+# Header body code
+set body($m,h) "
+#ifdef __cplusplus
+extern \"C\" \{
+#endif
+
+#ifdef __cplusplus
+\}
+#endif
+"
+
+# C body code
+set body($m,c) "
+"
+
+# Some mappings - that map ill_ILL_<name> to ill_<name>
+set map($m,ILL-APDU) APDU
+set map($m,ILL-Request) Request
+set map($m,ILL-Answer) Answer
+set map($m,ILL-String) String
+set map($m,ILL-APDU-Type) APDU_Type
+set map($m,ILL-Service-Type) Service_Type
+set map($m,Service_Date_Time_0) Service_Date_this
+set map($m,Service_Date_Time_1) Service_Date_original
+set map($m,Overdue_0) Overdue_ExtensionS
+set membermap($m,APDU,ILL-Request) {APDU_ILL_Request illRequest}
+set membermap($m,APDU,ILL-Answer) {APDU_ILL_Answer illAnswer}
+
+# ----------------------------------------------------------
+set m Z39.50-extendedService-ItemOrder-ItemRequest-1
+# Filename
+set filename($m) item-req
+
+# Mappings of a few basic types
+proc asnBasicPrintableString {} {
+ return {odr_visiblestring char}
+}
+
+proc asnBasicANY {} {
+ return {odr_any Odr_any}
+}
--- /dev/null
+-- use of parameters and types is to be consistent with their definitions in clause 3
+
+ISO-10161-ILL-1 DEFINITIONS EXPLICIT TAGS ::=
+
+BEGIN
+-- ISO-10161-ILL-1 refers to the ILL ISO standard 10161 version 1
+-- and version 2 as specified in ISO standard 10161 Amendment 1
+
+ILL-APDU ::= CHOICE {
+ ILL-Request,
+ Forward-Notification,
+ Shipped,
+ ILL-Answer,
+ Conditional-Reply,
+ Cancel,
+ Cancel-Reply,
+ Received,
+ Recall,
+ Returned,
+ Checked-In,
+ Overdue,
+ Renew,
+ Renew-Answer,
+ Lost,
+ Damaged,
+ Message,
+ Status-Query,
+ Status-Or-Error-Report,
+ Expired
+ }
+
+-- The tagging scheme used in the APDU definitions is as follows:
+-- each named type that is a component type of an APDU definition is assigned a different tag
+-- that is unique within the set of APDU definitions. Where these component types themselves
+-- have structure, the tagging within such type definitions has only local scope.
+
+ILL-Request ::= [APPLICATION 1] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
+ delivery-address [6] IMPLICIT Delivery-Address OPTIONAL,
+ delivery-service Delivery-Service OPTIONAL,
+ billing-address [8] IMPLICIT Delivery-Address OPTIONAL,
+ iLL-service-type [9] IMPLICIT SEQUENCE SIZE (1..5) OF
+ ILL-Service-Type,
+ -- this sequence is a list, in order of preference
+ responder-specific-service [10] EXTERNAL OPTIONAL,
+ -- use direct reference style
+ requester-optional-messages [11] IMPLICIT Requester-Optional-Messages-Type,
+ search-type [12] IMPLICIT Search-Type OPTIONAL,
+ supply-medium-info-type [13] IMPLICIT SEQUENCE SIZE (1..7) OF
+ Supply-Medium-Info-Type OPTIONAL,
+ -- this sequence is a list, in order of preference,
+ -- with a maximum number of 7 entries
+ place-on-hold [14] IMPLICIT Place-On-Hold-Type DEFAULT 3,
+ client-id [15] IMPLICIT Client-Id OPTIONAL,
+ item-id [16] IMPLICIT Item-Id,
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ cost-info-type [18] IMPLICIT Cost-Info-Type OPTIONAL,
+ copyright-compliance [19] ILL-String OPTIONAL,
+ third-party-info-type [20] IMPLICIT Third-Party-Info-Type OPTIONAL,
+ -- mandatory when initiating a FORWARD service or an
+ -- ILL-REQUEST service for a partitioned ILL sub-
+ -- transaction or when initiating an ILL-REQUEST service for
+ -- an ILL sub-transaction if the received ILL-REQUEST
+ -- included an "already-tried-list";optional otherwise
+ retry-flag [21] IMPLICIT BOOLEAN DEFAULT FALSE,
+ forward-flag [22] IMPLICIT BOOLEAN DEFAULT FALSE,
+ requester-note [46] ILL-String OPTIONAL,
+ forward-note [47] ILL-String OPTIONAL,
+ iLL-request-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Forward-Notification ::= [APPLICATION 2] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id,
+ -- mandatory in this APDU
+ responder-address [24] IMPLICIT System-Address OPTIONAL,
+ intermediary-id [25] IMPLICIT System-Id,
+ notification-note [48] ILL-String OPTIONAL,
+ forward-notification-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Shipped ::= [APPLICATION 3] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-address [24] IMPLICIT System-Address OPTIONAL,
+ intermediary-id [25] IMPLICIT System-Id OPTIONAL,
+ supplier-id [26] IMPLICIT System-Id OPTIONAL,
+ client-id [15] IMPLICIT Client-Id OPTIONAL,
+ transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ shipped-service-type [27] IMPLICIT Shipped-Service-Type,
+ responder-optional-messages [28] IMPLICIT Responder-Optional-Messages-Type
+ OPTIONAL,
+ supply-details [29] IMPLICIT Supply-Details,
+ return-to-address [30] IMPLICIT Postal-Address OPTIONAL,
+ responder-note [46] ILL-String OPTIONAL,
+ shipped-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+ILL-Answer ::= [APPLICATION 4] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ transaction-results [31] IMPLICIT Transaction-Results,
+ results-explanation [32] CHOICE {
+ conditional-results [1] Conditional-Results,
+ -- chosen if transaction-results=CONDITIONAL
+ retry-results [2] Retry-Results,
+ -- chosen if transaction-results=RETRY
+ unfilled-results [3] Unfilled-Results,
+ --chosen if transaction-results=UNFILLED
+ locations-results [4] Locations-Results,
+ -- chosen if transaction-results=LOCATIONS-PROVIDED
+ will-supply-results [5] Will-Supply-Results,
+ -- chosen if transaction-results=WILL-SUPPLY
+ hold-placed-results [6] Hold-Placed-Results,
+ -- chosen if transaction-results=HOLD-PLACED
+ estimate-results [7] Estimate-Results
+ -- chosen if transaction-results=ESTIMATE
+ } OPTIONAL,
+ -- optional if transaction-results equals RETRY, UNFILLED,
+ -- WILL-SUPPLY or HOLD-PLACED;
+ -- required if transaction-results equals CONDITIONAL,
+ -- LOCATIONS-PROVIDED or ESTIMATE
+ responder-specific-results [33] EXTERNAL OPTIONAL,
+ -- this type is mandatory if results-explanation
+ -- chosen for any result
+ -- has the value "responder-specific".
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ send-to-list [23] IMPLICIT Send-To-List-Type OPTIONAL,
+ already-tried-list [34] IMPLICIT Already-Tried-List-Type OPTIONAL,
+ responder-optional-messages [28] IMPLICIT Responder-Optional-Messages-Type
+ OPTIONAL,
+ responder-note [46] ILL-String OPTIONAL,
+ ill-answer-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Conditional-Reply ::= [APPLICATION 5] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ answer [35] IMPLICIT BOOLEAN,
+ requester-note [46] ILL-String OPTIONAL,
+ conditional-reply-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Cancel ::= [APPLICATION 6] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ requester-note [46] ILL-String OPTIONAL,
+ cancel-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Cancel-Reply ::= [APPLICATION 7] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ answer [35] IMPLICIT BOOLEAN,
+ responder-note [46] ILL-String OPTIONAL,
+ cancel-reply-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Received ::= [APPLICATION 8] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ supplier-id [26] IMPLICIT System-Id OPTIONAL,
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ date-received [36] IMPLICIT ISO-Date,
+ shipped-service-type [27] IMPLICIT Shipped-Service-Type,
+ requester-note [46] ILL-String OPTIONAL,
+ received-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Recall ::= [APPLICATION 9] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-note [46] ILL-String OPTIONAL,
+ recall-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Returned ::= [APPLICATION 10] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ date-returned [37] IMPLICIT ISO-Date,
+ returned-via [38] Transportation-Mode OPTIONAL,
+ insured-for [39] IMPLICIT Amount OPTIONAL,
+ requester-note [46] ILL-String OPTIONAL,
+ returned-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Checked-In ::= [APPLICATION 11] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ date-checked-in [40] IMPLICIT ISO-Date,
+ responder-note [46] ILL-String OPTIONAL,
+ checked-in-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Overdue ::= [APPLICATION 12] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ date-due [41] IMPLICIT Date-Due,
+ responder-note [46] ILL-String OPTIONAL,
+ overdue-extensions [49] SEQUENCE OF Extension OPTIONAL
+ }
+
+Renew ::= [APPLICATION 13] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ desired-due-date [42] IMPLICIT ISO-Date OPTIONAL,
+ requester-note [46] ILL-String OPTIONAL,
+ renew-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Renew-Answer ::= [APPLICATION 14] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ answer [35] IMPLICIT BOOLEAN,
+ date-due [41] IMPLICIT Date-Due OPTIONAL,
+ responder-note [46] ILL-String OPTIONAL,
+ renew-answer-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Lost ::= [APPLICATION 15] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ note [46] ILL-String OPTIONAL,
+ lost-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Damaged ::= [APPLICATION 16] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ damaged-details [5] IMPLICIT Damaged-Details OPTIONAL,
+ -- this parameter may only be present in APDU's with a
+ -- protocol-version-num value of 2 or greater
+ note [46] ILL-String OPTIONAL,
+ damaged-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Message ::= [APPLICATION 17] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ note [46] ILL-String,
+ message-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Status-Query ::= [APPLICATION 18] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ note [46] ILL-String OPTIONAL,
+ status-query-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Status-Or-Error-Report ::= [APPLICATION 19] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ reason-no-report [43] IMPLICIT Reason-No-Report OPTIONAL,
+ -- mandatory if no report is present;
+ -- not present otherwise
+ status-report [44] IMPLICIT Status-Report OPTIONAL,
+ error-report [45] IMPLICIT Error-Report OPTIONAL,
+ note [46] ILL-String OPTIONAL,
+ status-or-error-report-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Expired ::= [APPLICATION 20] SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id,
+ service-date-time [2] IMPLICIT Service-Date-Time,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ -- mandatory when using store-and-forward communications
+ -- optional when using connection-oriented communications
+ expired-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+
+Account-Number ::= ILL-String
+
+Already-Forwarded ::= SEQUENCE {
+ responder-id [0] IMPLICIT System-Id,
+ responder-address [1] IMPLICIT System-Address OPTIONAL
+ }
+
+Already-Tried-List-Type ::= SEQUENCE OF System-Id
+
+Amount ::= SEQUENCE {
+ currency-code [0] IMPLICIT PrintableString (SIZE (3)) OPTIONAL,
+ -- values defined in ISO 4217-1981
+ monetary-value [1] IMPLICIT AmountString (SIZE (1..10))
+ }
+
+AmountString ::= PrintableString (FROM ("1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"|"0"|" "|"."|","))
+
+Client-Id ::= SEQUENCE {
+ client-name [0] ILL-String OPTIONAL,
+ client-status [1] ILL-String OPTIONAL,
+ client-identifier [2] ILL-String OPTIONAL
+ }
+
+Conditional-Results ::= SEQUENCE {
+ conditions [0] IMPLICIT ENUMERATED {
+ cost-exceeds-limit (13),
+ charges (14),
+ prepayment-required (15),
+ lacks-copyright-compliance (16),
+ library-use-only (22),
+ no-reproduction (23),
+ client-signature-required (24),
+ special-collections-supervision-required (25),
+ other (27),
+ responder-specific (28),
+ proposed-delivery-service (30)
+ },
+ date-for-reply [1] IMPLICIT ISO-Date OPTIONAL,
+ locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL,
+ proposed-delivery-service Delivery-Service OPTIONAL
+ -- this parameter specifies a proposed delivery service the
+ -- acceptance of which is a condition of supply. It may be a
+ -- physical service or an electronic service. This parameter
+ -- may only be present in APDUs with a
+ -- protocol-version-num value of 2 or greater
+ }
+
+Cost-Info-Type ::= SEQUENCE {
+ account-number [0] Account-Number OPTIONAL,
+ maximum-cost [1] IMPLICIT Amount OPTIONAL,
+ reciprocal-agreement [2] IMPLICIT BOOLEAN DEFAULT FALSE,
+ will-pay-fee [3] IMPLICIT BOOLEAN DEFAULT FALSE,
+ payment-provided [4] IMPLICIT BOOLEAN DEFAULT FALSE
+ }
+
+Current-State ::= ENUMERATED {
+ nOT-SUPPLIED (1),
+ pENDING (2),
+ iN-PROCESS (3),
+ fORWARD (4),
+ cONDITIONAL (5),
+ cANCEL-PENDING (6),
+ cANCELLED (7),
+ sHIPPED (8),
+ rECEIVED (9),
+ rENEW-PENDING (10),
+ nOT-RECEIVED-OVERDUE (11),
+ rENEW-OVERDUE (12),
+ oVERDUE (13),
+ rETURNED (14),
+ cHECKED-IN (15),
+ rECALL (16),
+ lOST (17),
+ uNKNOWN (18)
+ }
+
+Damaged-Details ::= SEQUENCE {
+ document-type-id [0] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ -- identifies an OSI document type registered in accordance
+ -- with ISO 9834-2, for use in an automated environment
+ damaged-portion CHOICE {
+ complete-document [1] IMPLICIT NULL,
+ specific-units [2] IMPLICIT SEQUENCE
+ OF INTEGER
+ -- the nature and extent of a "unit" is implicit in the
+ -- value of document-type-id if one is supplied
+ }
+ }
+
+Date-Due ::= SEQUENCE {
+ date-due-field [0] IMPLICIT ISO-Date,
+ renewable [1] IMPLICIT BOOLEAN DEFAULT TRUE
+ }
+
+Delivery-Address ::= SEQUENCE {
+ postal-address [0] IMPLICIT Postal-Address OPTIONAL,
+ electronic-address [1] IMPLICIT System-Address OPTIONAL
+ }
+
+Delivery-Service ::= CHOICE {
+ physical-delivery [7] Transportation-Mode,
+ electronic-delivery [50] IMPLICIT SEQUENCE OF Electronic-Delivery-Service
+ -- electronic-delivery may only be present in APDUs
+ -- with a protocol-version-num value of 2 or greater
+ }
+
+Electronic-Delivery-Service ::= SEQUENCE {
+ -- the first four parameters are intended to be used in an automated
+ -- environment
+ e-delivery-service [0] IMPLICIT SEQUENCE {
+ -- identifies the kind of electronic delivery service, e.g.
+ -- MOTIS IPM,FTAM, etc., using the assigned object
+ -- identifier for the standard e.g. {joint-iso-ccitt mhs-motis
+ -- ipms}
+ e-delivery-mode [0] IMPLICIT OBJECT IDENTIFIER,
+ e-delivery-parameters [1] ANY DEFINED BY e-delivery-mode
+ } OPTIONAL,
+ document-type [1] IMPLICIT SEQUENCE {
+ document-type-id [2] IMPLICIT OBJECT IDENTIFIER,
+ -- identifies an OSI document type registered in accordance
+ -- with ISO 9834-2
+ document-type-parameters [3] ANY DEFINED BY document-type-id
+ -- any parameters relating to the registered document type
+ } OPTIONAL,
+ e-delivery-description [4] ILL-String OPTIONAL,
+ -- holds a human readable name or description of the
+ -- required electronic delivery service and document type;
+ -- this may also be used to identify an electronic delivery
+ -- service for which there is no object identifier.
+ -- This parameter may be present instead of, or in addition
+ -- to, the previous 4 parameters
+ e-delivery-details [5] CHOICE {
+ e-delivery-address [0] IMPLICIT System-Address,
+ e-delivery-id [1] IMPLICIT System-Id
+ },
+ name-or-code [6] ILL-String OPTIONAL,
+ -- holds a human-readable identifier or correlation
+ -- information for the document as shipped, e.g. a directory
+ -- and/or file name or message-id
+ delivery-time [7] IMPLICIT ISO-Time OPTIONAL
+ -- holds the requester's preferred delivery time or
+ -- the responder's proposed or actual delivery time
+ }
+
+Error-Report ::= SEQUENCE {
+ correlation-information [0] ILL-String,
+ report-source [1] IMPLICIT Report-Source,
+ user-error-report [2] User-Error-Report OPTIONAL,
+ -- mandatory if report-source is "user"; not present otherwise
+ provider-error-report [3] Provider-Error-Report OPTIONAL
+ -- mandatory if report-source is "provider"; not
+ -- present otherwise
+ }
+
+Estimate-Results ::= SEQUENCE {
+ cost-estimate [0] ILL-String,
+ locations [1] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
+ }
+
+Extension ::= SEQUENCE {
+ identifier [0] IMPLICIT INTEGER,
+ critical [1] IMPLICIT BOOLEAN DEFAULT FALSE,
+ item [2] ANY DEFINED BY identifier
+ }
+
+General-Problem ::= ENUMERATED {
+ unrecognized-APDU (1),
+ mistyped-APDU (2),
+ badly-structured-APDU (3),
+ protocol-version-not-supported (4),
+ other (5)
+ }
+
+History-Report ::= SEQUENCE {
+ date-requested [0] IMPLICIT ISO-Date OPTIONAL,
+ author [1] ILL-String OPTIONAL,
+ title [2] ILL-String OPTIONAL,
+ author-of-article [3] ILL-String OPTIONAL,
+ title-of-article [4] ILL-String OPTIONAL,
+ date-of-last-transition [5] IMPLICIT ISO-Date,
+ most-recent-service [6] IMPLICIT ENUMERATED {
+ iLL-REQUEST (1),
+ fORWARD (21),
+ fORWARD-NOTIFICATION (2),
+ sHIPPED (3),
+ iLL-ANSWER (4),
+ cONDITIONAL-REPLY (5),
+ cANCEL (6),
+ cANCEL-REPLY (7),
+ rECEIVED (8),
+ rECALL (9),
+ rETURNED (10),
+ cHECKED-IN (11),
+ rENEW-ANSWER (14),
+ lOST (15),
+ dAMAGED (16),
+ mESSAGE (17),
+ sTATUS-QUERY (18),
+ sTATUS-OR-ERROR-REPORT (19),
+ eXPIRED (20)
+ },
+ date-of-most-recent-service [7] IMPLICIT ISO-Date,
+ initiator-of-most-recent-service [8] IMPLICIT System-Id,
+ shipped-service-type [9] IMPLICIT Shipped-Service-Type OPTIONAL,
+ -- If the information is available, i.e. if a SHIPPED or
+ -- RECEIVED APDU has been sent or received, then the
+ -- value in this parameter shall be supplied.
+ -- Value must contain the most current information, e.g. if a
+ -- requester has received a SHIPPED APDU and then
+ -- invokes a RECEIVED.request, then the value from the
+ -- RECEIVED.request is used
+ transaction-results [10] IMPLICIT Transaction-Results OPTIONAL,
+ -- If the information is available, i.e. if an ILL-ANWSER
+ -- APDU has been sent or received, then the value in this
+ -- parameter shall be supplied.
+ most-recent-service-note [11] ILL-String OPTIONAL
+ -- If the information is available, i.e. if a note has been
+ -- supplied in the most recent service primitive, then the
+ -- value in this parameter shall be supplied.
+ }
+
+Hold-Placed-Results ::= SEQUENCE {
+ estimated-date-available [0] IMPLICIT ISO-Date,
+ hold-placed-medium-type [1] IMPLICIT Medium-Type OPTIONAL,
+ locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
+ }
+
+ILL-APDU-Type ::= ENUMERATED {
+ iLL-REQUEST (1),
+ fORWARD-NOTIFICATION (2),
+ sHIPPED (3),
+ iLL-ANSWER (4),
+ cONDITIONAL-REPLY (5),
+ cANCEL (6),
+ cANCEL-REPLY (7),
+ rECEIVED (8),
+ rECALL (9),
+ rETURNED (10),
+ cHECKED-IN (11),
+ oVERDUE (12),
+ rENEW (13),
+ rENEW-ANSWER (14),
+ lOST (15),
+ dAMAGED (16),
+ mESSAGE (17),
+ sTATUS-QUERY (18),
+ sTATUS-OR-ERROR-REPORT (19),
+ eXPIRED (20)
+ }
+
+ILL-Service-Type ::= ENUMERATED {
+ loan (1),
+ copy-non-returnable (2),
+ locations (3),
+ estimate (4),
+ responder-specific (5)
+ }
+
+ILL-String ::= CHOICE {
+ GeneralString,
+ -- may contain any ISO registered G (graphic) and C
+ -- (control) character set
+ EDIFACTString
+ }
+ -- may not include leading or trailing spaces
+ -- may not consist only of space (" ") or non-printing
+ -- characters
+
+Intermediary-Problem ::= ENUMERATED {
+ cannot-send-onward (1)
+ }
+
+ISO-Date ::= VisibleString
+ -- conforms to ISO 8601
+ -- length = 8
+ -- fixed
+ -- YYYYMMDD
+
+ISO-Time ::= VisibleString
+ -- conforms to ISO 8601
+ -- length = 6,
+ -- fixed
+ -- HHMMSS
+ -- local time of person or institution invoking service
+
+Item-Id ::= SEQUENCE {
+ item-type [0] IMPLICIT ENUMERATED {
+ monograph (1),
+ serial (2),
+ other (3)
+ } OPTIONAL,
+ held-medium-type [1] IMPLICIT Medium-Type OPTIONAL,
+ call-number [2] ILL-String OPTIONAL,
+ author [3] ILL-String OPTIONAL,
+ title [4] ILL-String OPTIONAL,
+ sub-title [5] ILL-String OPTIONAL,
+ sponsoring-body [6] ILL-String OPTIONAL,
+ place-of-publication [7] ILL-String OPTIONAL,
+ publisher [8] ILL-String OPTIONAL,
+ series-title-number [9] ILL-String OPTIONAL,
+ volume-issue [10] ILL-String OPTIONAL,
+ edition [11] ILL-String OPTIONAL,
+ publication-date [12] ILL-String OPTIONAL,
+ publication-date-of-component [13] ILL-String OPTIONAL,
+ author-of-article [14] ILL-String OPTIONAL,
+ title-of-article [15] ILL-String OPTIONAL,
+ pagination [16] ILL-String OPTIONAL,
+ national-bibliography-no [17] EXTERNAL OPTIONAL,
+ iSBN [18] ILL-String (SIZE (10)) OPTIONAL,
+ -- must conform to ISO 2108-1978
+ iSSN [19] ILL-String (SIZE (8)) OPTIONAL,
+ -- must conform to ISO 3297-1986
+ system-no [20] EXTERNAL OPTIONAL,
+ additional-no-letters [21] ILL-String OPTIONAL,
+ verification-reference-source [22] ILL-String OPTIONAL
+ }
+
+Location-Info ::= SEQUENCE {
+ location-id [0] IMPLICIT System-Id,
+ location-address [1] IMPLICIT System-Address OPTIONAL,
+ location-note [2] ILL-String OPTIONAL
+ }
+
+Locations-Results ::= SEQUENCE {
+ reason-locs-provided [0] IMPLICIT Reason-Locs-Provided OPTIONAL,
+ locations [1] IMPLICIT SEQUENCE OF Location-Info
+ }
+
+Medium-Type ::= ENUMERATED {
+ printed (1),
+ microform (3),
+ film-or-video-recording (4),
+ audio-recording (5),
+ machine-readable (6),
+ other (7)
+ }
+
+Name-Of-Person-Or-Institution ::= CHOICE {
+ name-of-person [0] ILL-String,
+ name-of-institution [1] ILL-String
+ }
+
+Person-Or-Institution-Symbol ::= CHOICE {
+ person-symbol [0] ILL-String,
+ institution-symbol [1] ILL-String
+ }
+
+Place-On-Hold-Type ::= ENUMERATED {
+ yes (1),
+ no (2),
+ according-to-responder-policy (3)
+ }
+
+Postal-Address ::= SEQUENCE {
+ name-of-person-or-institution [0] Name-Of-Person-Or-Institution OPTIONAL,
+ extended-postal-delivery-address [1] ILL-String OPTIONAL,
+ street-and-number [2] ILL-String OPTIONAL,
+ post-office-box [3] ILL-String OPTIONAL,
+ city [4] ILL-String OPTIONAL,
+ region [5] ILL-String OPTIONAL,
+ country [6] ILL-String OPTIONAL,
+ postal-code [7] ILL-String OPTIONAL
+ }
+
+Provider-Error-Report ::= CHOICE {
+ general-problem [0] IMPLICIT General-Problem,
+ transaction-id-problem [1] IMPLICIT Transaction-Id-Problem,
+ state-transition-prohibited [2] IMPLICIT State-Transition-Prohibited
+ }
+
+Reason-Locs-Provided ::= ENUMERATED {
+ in-use-on-loan (1),
+ in-process (2),
+ lost (3),
+ non-circulating (4),
+ not-owned (5),
+ on-order (6),
+ volume-issue-not-yet-available (7),
+ at-bindery (8),
+ lacking (9),
+ not-on-shelf (10),
+ on-reserve (11),
+ poor-condition (12),
+ cost-exceeds-limit (13),
+ on-hold (19),
+ other (27),
+ responder-specific (28)
+ }
+
+Reason-No-Report ::= ENUMERATED {
+ temporary (1),
+ permanent (2)
+ }
+
+Reason-Unfilled ::= ENUMERATED {
+ in-use-on-loan (1),
+ in-process (2),
+ lost (3),
+ non-circulating (4),
+ not-owned (5),
+ on-order (6),
+ volume-issue-not-yet-available (7),
+ at-bindery (8),
+ lacking (9),
+ not-on-shelf (10),
+ on-reserve (11),
+ poor-condition (12),
+ cost-exceeds-limit (13),
+ charges (14),
+ prepayment-required (15),
+ lacks-copyright-compliance (16),
+ not-found-as-cited (17),
+ locations-not-found (18),
+ on-hold (19),
+ policy-problem (20),
+ mandatory-messaging-not-supported (21),
+ expiry-not-supported (22) ,
+ requested-delivery-services-not-supported (23),
+ preferred-delivery-time-not-possible (24),
+ other (27),
+ responder-specific (28)
+ }
+
+Report-Source ::= ENUMERATED {
+ user (1),
+ provider (2)
+ }
+
+Requester-Optional-Messages-Type ::= SEQUENCE {
+ can-send-RECEIVED [0] IMPLICIT BOOLEAN,
+ can-send-RETURNED [1] IMPLICIT BOOLEAN,
+ requester-SHIPPED [2] IMPLICIT ENUMERATED {
+ requires (1),
+ desires (2),
+ neither (3)
+ },
+ requester-CHECKED-IN [3] IMPLICIT ENUMERATED {
+ requires (1),
+ desires (2),
+ neither (3)
+ }
+ }
+
+Responder-Optional-Messages-Type ::= SEQUENCE {
+ can-send-SHIPPED [0] IMPLICIT BOOLEAN,
+ can-send-CHECKED-IN [1] IMPLICIT BOOLEAN,
+ responder-RECEIVED [2] IMPLICIT ENUMERATED {
+ requires (1),
+ desires (2),
+ neither (3)
+ },
+ responder-RETURNED [3] IMPLICIT ENUMERATED {
+ requires (1),
+ desires (2),
+ neither (3)
+ }
+ }
+
+Retry-Results ::= SEQUENCE {
+ reason-not-available [0] IMPLICIT ENUMERATED {
+ in-use-on-loan (1),
+ in-process (2),
+ on-order (6),
+ volume-issue-not-yet-available (7),
+ at-bindery (8),
+ cost-exceeds-limit (13),
+ charges (14),
+ prepayment-required (15),
+ lacks-copyright-compliance (16),
+ not-found-as-cited (17),
+ on-hold (19),
+ other (27),
+ responder-specific (28)
+ } OPTIONAL,
+ retry-date [1] IMPLICIT ISO-Date OPTIONAL,
+ locations [2] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
+ }
+
+Search-Type ::= SEQUENCE {
+ level-of-service [0] ILL-String (SIZE (1)) OPTIONAL,
+ need-before-date [1] IMPLICIT ISO-Date OPTIONAL,
+ expiry-flag [2] IMPLICIT ENUMERATED {
+ need-Before-Date (1),
+ other-Date (2),
+ no-Expiry (3)
+ } DEFAULT 3,
+ -- value of "need-Before-Date" indicates that
+ -- need-before-date also specifies transaction expiry
+ -- date
+ expiry-date [3] IMPLICIT ISO-Date OPTIONAL
+ -- alternative expiry date can be used only when expiry-flag
+ -- is set to "Other-Date"
+ }
+
+Security-Problem ::= ILL-String
+
+Send-To-List-Type ::= SEQUENCE OF SEQUENCE {
+ system-id [0] IMPLICIT System-Id,
+ account-number [1] Account-Number OPTIONAL,
+ system-address [2] IMPLICIT System-Address OPTIONAL
+ }
+
+Service-Date-Time ::= SEQUENCE {
+ date-time-of-this-service [0] IMPLICIT SEQUENCE {
+ date [0] IMPLICIT ISO-Date,
+ time [1] IMPLICIT ISO-Time OPTIONAL
+ -- mandatory for 2nd and subsequent services
+ -- invoked for a given
+ -- ILL-transaction on the same day
+ },
+ date-time-of-original-service [1] IMPLICIT SEQUENCE {
+ date [0] IMPLICIT ISO-Date,
+ time [1] IMPLICIT ISO-Time OPTIONAL
+ } OPTIONAL
+ }
+
+Shipped-Service-Type ::= ILL-Service-Type (loan | copy-non-returnable)
+ -- subtype of ILL-Service-Type
+
+State-Transition-Prohibited ::= SEQUENCE {
+ aPDU-type [0] IMPLICIT ILL-APDU-Type,
+ current-state [1] IMPLICIT Current-State
+ }
+
+Status-Report ::= SEQUENCE {
+ user-status-report [0] IMPLICIT History-Report,
+ provider-status-report [1] IMPLICIT Current-State
+ }
+
+Supplemental-Item-Description ::= SEQUENCE OF EXTERNAL
+ -- the syntax of supplementary item description information is defined outside this standard
+
+Supply-Details ::= SEQUENCE {
+ date-shipped [0] IMPLICIT ISO-Date OPTIONAL,
+ date-due [1] IMPLICIT Date-Due OPTIONAL,
+ chargeable-units [2] IMPLICIT INTEGER (1..9999) OPTIONAL,
+ cost [3] IMPLICIT Amount OPTIONAL,
+ shipped-conditions [4] IMPLICIT ENUMERATED {
+ library-use-only (22),
+ no-reproduction (23),
+ client-signature-required (24),
+ special-collections-supervision-required (25),
+ other (27)
+ } OPTIONAL,
+ shipped-via CHOICE {
+ physical-delivery [5] Transportation-Mode,
+ electronic-delivery [50] IMPLICIT
+ Electronic-Delivery-Service
+ } OPTIONAL,
+ -- electronic-delivery may only be present in APDUs with a
+ -- protocol-version-num value of 2 or greater
+ insured-for [6] IMPLICIT Amount OPTIONAL,
+ return-insurance-require [7] IMPLICIT Amount OPTIONAL,
+ no-of-units-per-medium [8] IMPLICIT SEQUENCE OF Units-Per-Medium-Type
+ OPTIONAL
+ }
+
+Supply-Medium-Info-Type ::= SEQUENCE {
+ supply-medium-type [0] IMPLICIT Supply-Medium-Type,
+ medium-characteristics [1] ILL-String OPTIONAL
+ }
+
+Supply-Medium-Type ::= ENUMERATED {
+ printed (1),
+ photocopy (2),
+ microform (3),
+ film-or-video-recording (4),
+ audio-recording (5),
+ machine-readable (6),
+ other (7)
+ }
+
+System-Address ::= SEQUENCE {
+ telecom-service-identifier [0] ILL-String OPTIONAL,
+ telecom-service-address [1] ILL-String OPTIONAL
+ }
+
+System-Id ::= SEQUENCE {
+ --at least one of the following must be present
+ person-or-institution-symbol [0] Person-Or-Institution-Symbol OPTIONAL,
+ name-of-person-or-institution [1] Name-Of-Person-Or-Institution OPTIONAL
+ }
+
+Third-Party-Info-Type ::= SEQUENCE {
+ permission-to-forward [0] IMPLICIT BOOLEAN DEFAULT FALSE,
+ permission-to-chain [1] IMPLICIT BOOLEAN DEFAULT FALSE,
+ permission-to-partition [2] IMPLICIT BOOLEAN DEFAULT FALSE,
+ permission-to-change-send-to-list [3] IMPLICIT BOOLEAN DEFAULT FALSE,
+ initial-requester-address [4] IMPLICIT System-Address OPTIONAL,
+ -- mandatory when initiating a FORWARD service or an
+ -- ILL-REQUEST service for a partitioned ILL
+ -- sub-transaction; optional otherwise
+ preference [5] IMPLICIT ENUMERATED {
+ ordered (1),
+ unordered (2)
+ } DEFAULT 2,
+ send-to-list [6] IMPLICIT Send-To-List-Type OPTIONAL,
+ already-tried-list [7] IMPLICIT Already-Tried-List-Type OPTIONAL
+ -- mandatory when initiating a FORWARD service, or when
+ -- initiating an ILL-REQUEST service for an ILL
+ -- sub-transaction if the received ILL-REQUEST included an
+ -- "already-tried-list"; optional otherwise
+ }
+
+Transaction-Id ::= SEQUENCE {
+ initial-requester-id [0] IMPLICIT System-Id OPTIONAL,
+ -- mandatory for sub-transactions; not called
+ -- "requester-id" to distinguish id of initial-requester
+ --from id of requester of sub-transaction if there is one
+ transaction-group-qualifier [1] ILL-String,
+ transaction-qualifier [2] ILL-String,
+ sub-transaction-qualifier [3] ILL-String OPTIONAL
+ -- mandatory for sub-transactions
+ }
+
+Transaction-Id-Problem ::= ENUMERATED {
+ duplicate-transaction-id (1),
+ invalid-transaction-id (2),
+ unknown-transaction-id (3)
+ }
+
+Transaction-Results ::= ENUMERATED {
+ conditional (1),
+ retry (2),
+ unfilled (3),
+ locations-provided (4),
+ will-supply (5),
+ hold-placed (6),
+ estimate (7)
+ }
+
+Transaction-Type ::= ENUMERATED {
+ simple (1),
+ chained (2),
+ partitioned (3)
+ }
+
+Transportation-Mode ::= ILL-String
+
+Unable-To-Perform ::= ENUMERATED {
+ not-available (1),
+ resource-limitation (2),
+ other (3)
+ }
+
+Unfilled-Results ::= SEQUENCE {
+ reason-unfilled [0] IMPLICIT Reason-Unfilled,
+ locations [1] IMPLICIT SEQUENCE OF Location-Info OPTIONAL
+ }
+
+Units-Per-Medium-Type ::= SEQUENCE {
+ medium [0] Supply-Medium-Type,
+ no-of-units [1] INTEGER (1..9999)
+ }
+
+User-Error-Report ::= CHOICE {
+ already-forwarded [0] IMPLICIT Already-Forwarded,
+ intermediary-problem [1] IMPLICIT Intermediary-Problem,
+ security-problem [2] Security-Problem,
+ unable-to-perform [3] IMPLICIT Unable-To-Perform
+ }
+
+
+Will-Supply-Results ::= SEQUENCE {
+ reason-will-supply [0] ENUMERATED {
+ in-use-on-loan (1),
+ in-process (2),
+ on-order (6),
+ at-bindery (8),
+ on-hold (19),
+ being-processed-for-supply (26),
+ other (27),
+ responder-specific (28),
+ electronic-delivery (30)
+ },
+ supply-date [1] ISO-Date OPTIONAL,
+ return-to-address [2] Postal-Address OPTIONAL,
+ locations [3] IMPLICIT SEQUENCE OF Location-Info OPTIONAL,
+ electronic-delivery-service [4] Electronic-Delivery-Service OPTIONAL
+ -- if present, this must be one of the services proposed by
+ -- the requester
+ }
+
+EDIFACTString ::= VisibleString
+ (FROM ("A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|
+ "I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|
+ "V"|"W"|"X"|"Y"|"Z"|"a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|
+ "i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|
+ "v"|"w"|"x"|"y"|"z"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|
+ "9"|"0"|" "|"."|","|"-"|"("|")"|"/"|"="|"!"|"""|"%"|"&"|
+ "*"|";"|"<"|">"|"'"|"+"|":"|"?"))
+
+END
+
+
--- /dev/null
+Z39.50-extendedService-ItemOrder-ItemRequest-1 DEFINITIONS ::=
+BEGIN
+IMPORTS
+ Transaction-Id,
+ Service-Date-Time,
+ System-Id,
+ Transaction-Type,
+ Delivery-Address,
+ ILL-Service-Type,
+ Requester-Optional-Messages-Type,
+ Search-Type,
+ Supply-Medium-Info-Type,
+ Place-On-Hold-Type,
+ Client-Id,
+ Item-Id,
+ Supplemental-Item-Description,
+ Cost-Info-Type,
+ ILL-String,
+ Third-Party-Info-Type,
+ Extension
+FROM ISO-10161-ILL-1;
+
+ItemRequest ::=SEQUENCE {
+ protocol-version-num [0] IMPLICIT INTEGER {
+ version-1 (1),
+ version-2 (2)
+ },
+ transaction-id [1] IMPLICIT Transaction-Id OPTIONAL,
+ service-date-time [2] IMPLICIT Service-Date-Time OPTIONAL,
+ requester-id [3] IMPLICIT System-Id OPTIONAL,
+ responder-id [4] IMPLICIT System-Id OPTIONAL,
+ transaction-type [5] IMPLICIT Transaction-Type DEFAULT 1,
+ delivery-address [6] IMPLICIT Delivery-Address OPTIONAL,
+ delivery-service Delivery-Service OPTIONAL,
+ billing-address [8] IMPLICIT Delivery-Address OPTIONAL,
+ iLL-service-type [9] IMPLICIT SEQUENCE SIZE (1..5) OF
+ ILL-Service-Type OPTIONAL,
+ responder-specific-service [10] EXTERNAL OPTIONAL,
+ -- use direct reference style
+ requester-optional-messages [11] IMPLICIT Requester-Optional-Messages-Type OPTIONAL,
+ search-type [12] IMPLICIT Search-Type OPTIONAL,
+ supply-medium-info-type [13] IMPLICIT SEQUENCE SIZE (1..7) OF
+ Supply-Medium-Info-Type OPTIONAL,
+ place-on-hold [14] IMPLICIT Place-On-Hold-Type DEFAULT 3,
+ client-id [15] IMPLICIT Client-Id OPTIONAL,
+ item-id [16] IMPLICIT Item-Id OPTIONAL,
+ supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
+ cost-info-type [18] IMPLICIT Cost-Info-Type OPTIONAL,
+ copyright-compliance [19] ILL-String OPTIONAL,
+ third-party-info-type [20] IMPLICIT Third-Party-Info-Type OPTIONAL,
+ retry-flag [21] IMPLICIT BOOLEAN DEFAULT FALSE,
+ forward-flag [22] IMPLICIT BOOLEAN DEFAULT FALSE,
+ requester-note [46] ILL-String OPTIONAL,
+ forward-note [47] ILL-String OPTIONAL,
+ iLL-request-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
+ }
+END
+
--- /dev/null
+/* $Id: lexer.h,v 1.1 2003-10-27 12:21:30 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+static void putb(YYSTYPE *lval, CQL_parser cp, int c)
+{
+ if (lval->len+1 >= lval->size)
+ {
+ char *nb = nmem_malloc(cp->nmem, (lval->size = lval->len * 2 + 20));
+ memcpy (nb, lval->buf, lval->len);
+ lval->buf = nb;
+ }
+ if (c)
+ lval->buf[lval->len++] = c;
+ lval->buf[lval->len] = '\0';
+}
+
+/*
+ * bison lexer for CQL.
+ */
+
+int yylex(YYSTYPE *lval, void *vp)
+{
+ CQL_parser cp = (CQL_parser) vp;
+ int c;
+ lval->cql = 0;
+ lval->rel = 0;
+ lval->len = 0;
+ lval->size = 10;
+ lval->buf = nmem_malloc(cp->nmem, lval->size);
+ lval->buf[0] = '\0';
+ do
+ {
+ c = cp->getbyte(cp->client_data);
+ if (c == 0)
+ return 0;
+ if (c == '\n')
+ return 0;
+ } while (isspace(c));
+ if (strchr("()=></", c))
+ {
+ int c1;
+ putb(lval, cp, c);
+ if (c == '>')
+ {
+ c1 = cp->getbyte(cp->client_data);
+ if (c1 == '=')
+ {
+ putb(lval, cp, c1);
+ return GE;
+ }
+ else
+ cp->ungetbyte(c1, cp->client_data);
+ }
+ else if (c == '<')
+ {
+ c1 = cp->getbyte(cp->client_data);
+ if (c1 == '=')
+ {
+ putb(lval, cp, c1);
+ return LE;
+ }
+ else if (c1 == '>')
+ {
+ putb(lval, cp, c1);
+ return NE;
+ }
+ else
+ cp->ungetbyte(c1, cp->client_data);
+ }
+ return c;
+ }
+ if (c == '"')
+ {
+ while ((c = cp->getbyte(cp->client_data)) != EOF && c != '"')
+ {
+ if (c == '\\')
+ c = cp->getbyte(cp->client_data);
+ putb(lval, cp, c);
+ }
+ putb(lval, cp, 0);
+ }
+ else
+ {
+ putb(lval, cp, c);
+ while ((c = cp->getbyte(cp->client_data)) != 0 &&
+ !strchr(" \n()=<>/", c))
+ {
+ if (c == '\\')
+ c = cp->getbyte(cp->client_data);
+ putb(lval, cp, c);
+ }
+#if YYDEBUG
+ printf ("got %s\n", lval->buf);
+#endif
+ if (c != 0)
+ cp->ungetbyte(c, cp->client_data);
+ if (!strcmp(lval->buf, "and"))
+ return AND;
+ if (!strcmp(lval->buf, "or"))
+ return OR;
+ if (!strcmp(lval->buf, "not"))
+ return NOT;
+ if (!strncmp(lval->buf, "prox", 4))
+ return PROX;
+ }
+ return TERM;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: log.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <yaz/nmem.h>
+#include <yaz/log.h>
+
+#define HAS_STRERROR 1
+
+#if HAS_STRERROR
+
+#else
+char *strerror(int n)
+{
+ extern char *sys_errlist[];
+ return sys_errlist[n];
+}
+
+#endif
+
+static int l_level = LOG_DEFAULT_LEVEL;
+static FILE *l_file = NULL;
+static char l_prefix[512] = "";
+static char l_prefix2[512] = "";
+static char l_fname[512] = "";
+
+static struct {
+ int mask;
+ char *name;
+} mask_names[] =
+{
+ { LOG_FATAL, "fatal"},
+ { LOG_DEBUG, "debug"},
+ { LOG_WARN, "warn" },
+ { LOG_LOG, "log" },
+ { LOG_ERRNO, ""},
+ { LOG_MALLOC, "malloc"},
+ { LOG_APP, "app" },
+ { LOG_NOTIME, "" },
+ { LOG_APP2 , "app2" },
+ { LOG_APP3 , "app3" },
+ { LOG_ALL, "all" },
+ { 0, "none" },
+ { 0, NULL }
+};
+
+FILE *yaz_log_file(void)
+{
+ if (!l_file)
+ l_file = stderr;
+ return l_file;
+}
+
+void yaz_log_init_file (const char *fname)
+{
+ if (fname)
+ {
+ strncpy(l_fname, fname, sizeof(l_fname)-1);
+ l_fname[sizeof(l_fname)-1] = '\0';
+ }
+ else
+ l_fname[0] = '\0';
+ yaz_log_reopen();
+}
+
+void yaz_log_reopen(void)
+{
+ FILE *new_file;
+ if (!l_file)
+ l_file = stderr;
+
+ if (!*l_fname)
+ new_file=stderr;
+ else if (!(new_file = fopen(l_fname, "a")))
+ return;
+ if (l_file != stderr)
+ {
+ fclose (l_file);
+ }
+ setvbuf(new_file, 0, _IONBF, 0);
+ l_file = new_file;
+}
+
+void yaz_log_init_level (int level)
+{
+ l_level = level;
+}
+
+void yaz_log_init_prefix (const char *prefix)
+{
+ if (prefix && *prefix)
+ sprintf(l_prefix, "%.511s ", prefix);
+ else
+ *l_prefix = 0;
+}
+
+void yaz_log_init_prefix2 (const char *prefix)
+{
+ if (prefix && *prefix)
+ sprintf(l_prefix2, "%.511s ", prefix);
+ else
+ *l_prefix2 = 0;
+}
+
+void yaz_log_init(int level, const char *prefix, const char *fname)
+{
+ yaz_log_init_level (level);
+ yaz_log_init_prefix (prefix);
+ if (fname && *fname)
+ yaz_log_init_file (fname);
+}
+
+static void (*start_hook_func)(int, const char *, void *) = NULL;
+static void *start_hook_info;
+static void (*end_hook_func)(int, const char *, void *) = NULL;
+static void *end_hook_info;
+
+void log_event_start (void (*func)(int, const char *, void *), void *info)
+{
+ start_hook_func = func;
+ start_hook_info = info;
+}
+
+void log_event_end (void (*func)(int, const char *, void *), void *info)
+{
+ end_hook_func = func;
+ end_hook_info = info;
+}
+
+void yaz_log(int level, const char *fmt, ...)
+{
+ va_list ap;
+ char buf[4096], flags[1024];
+ int i;
+ time_t ti;
+ struct tm *tim;
+ char tbuf[50]="";
+ int o_level = level;
+
+ if (!(level & l_level))
+ return;
+ if (!l_file)
+ l_file = stderr;
+ *flags = '\0';
+ for (i = 0; level && mask_names[i].name; i++)
+ if (mask_names[i].mask & level)
+ {
+ if (*mask_names[i].name)
+ sprintf(flags + strlen(flags), "[%s]", mask_names[i].name);
+ level -= mask_names[i].mask;
+ }
+ va_start(ap, fmt);
+#ifdef WIN32
+ _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+#else
+/* !WIN32 */
+#if HAVE_VSNPRINTF
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+#else
+ vsprintf(buf, fmt, ap);
+#endif
+#endif
+/* WIN32 */
+ if (o_level & LOG_ERRNO)
+ {
+ strcat(buf, " [");
+ yaz_strerror(buf+strlen(buf), 2048);
+ strcat(buf, "]");
+ }
+ va_end (ap);
+ if (start_hook_func)
+ (*start_hook_func)(o_level, buf, start_hook_info);
+ ti = time(0);
+ tim = localtime(&ti);
+ if (l_level & LOG_NOTIME)
+ tbuf[0]='\0';
+ else
+ strftime(tbuf, 50, "%H:%M:%S-%d/%m: ", tim);
+ fprintf(l_file, "%s%s%s %s%s\n", tbuf, l_prefix, flags,
+ l_prefix2, buf);
+ fflush(l_file);
+ if (end_hook_func)
+ (*end_hook_func)(o_level, buf, end_hook_info);
+}
+
+int yaz_log_mask_str (const char *str)
+{
+ return yaz_log_mask_str_x (str, LOG_DEFAULT_LEVEL);
+}
+
+int yaz_log_mask_str_x (const char *str, int level)
+{
+ const char *p;
+ int i;
+
+ while (*str)
+ {
+ for (p = str; *p && *p != ','; p++)
+ ;
+ if (*str == '-' || isdigit(*str))
+ level = atoi (str);
+ else
+ for (i = 0; mask_names[i].name; i++)
+ if (strlen (mask_names[i].name) == (size_t) (p-str) &&
+ memcmp (mask_names[i].name, str, p-str) == 0)
+ {
+ if (mask_names[i].mask)
+ level |= mask_names[i].mask;
+ else
+ level = 0;
+ }
+ if (*p == ',')
+ p++;
+ str = p;
+ }
+ return level;
+}
--- /dev/null
+/*
+ * Copyright (C) 1995-2003, Index Data
+ * All rights reserved.
+ *
+ * $Id: logrpn.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+#include <stdio.h>
+
+#include <yaz/log.h>
+#include <yaz/logrpn.h>
+
+static const char *relToStr(int v)
+{
+ const char *str = 0;
+ switch (v)
+ {
+ case 1: str = "Less than"; break;
+ case 2: str = "Less than or equal"; break;
+ case 3: str = "Equal"; break;
+ case 4: str = "Greater or equal"; break;
+ case 5: str = "Greater than"; break;
+ case 6: str = "Not equal"; break;
+ case 100: str = "Phonetic"; break;
+ case 101: str = "Stem"; break;
+ case 102: str = "Relevance"; break;
+ case 103: str = "AlwaysMatches"; break;
+ }
+ return str;
+}
+static void attrStr (int type, int value, enum oid_value ast, char *str)
+{
+ const char *rstr;
+ *str = '\0';
+ switch (ast)
+ {
+ case VAL_BIB1:
+ case VAL_EXP1:
+ case VAL_GILS:
+ switch (type)
+ {
+ case 1:
+ sprintf (str, "use");
+ break;
+ case 2:
+ rstr = relToStr(value);
+ if (rstr)
+ sprintf (str, "relation=%s", rstr);
+ else
+ sprintf (str, "relation=%d", value);
+ break;
+ case 3:
+ switch (value)
+ {
+ case 1:
+ sprintf (str, "position=First in field");
+ break;
+ case 2:
+ sprintf (str, "position=First in any subfield");
+ break;
+ case 3:
+ sprintf (str, "position=Any position in field");
+ break;
+ default:
+ sprintf (str, "position");
+ }
+ break;
+ case 4:
+ switch (value)
+ {
+ case 1:
+ sprintf (str, "structure=Phrase");
+ break;
+ case 2:
+ sprintf (str, "structure=Word");
+ break;
+ case 3:
+ sprintf (str, "structure=Key");
+ break;
+ case 4:
+ sprintf (str, "structure=Year");
+ break;
+ case 5:
+ sprintf (str, "structure=Date");
+ break;
+ case 6:
+ sprintf (str, "structure=Word list");
+ break;
+ case 100:
+ sprintf (str, "structure=Date (un)");
+ break;
+ case 101:
+ sprintf (str, "structure=Name (norm)");
+ break;
+ case 102:
+ sprintf (str, "structure=Name (un)");
+ break;
+ case 103:
+ sprintf (str, "structure=Structure");
+ break;
+ case 104:
+ sprintf (str, "structure=urx");
+ break;
+ case 105:
+ sprintf (str, "structure=free-form-text");
+ break;
+ case 106:
+ sprintf (str, "structure=document-text");
+ break;
+ case 107:
+ sprintf (str, "structure=local-number");
+ break;
+ case 108:
+ sprintf (str, "structure=string");
+ break;
+ case 109:
+ sprintf (str, "structure=numeric string");
+ break;
+ default:
+ sprintf (str, "structure");
+ }
+ break;
+ case 5:
+ switch (value)
+ {
+ case 1:
+ sprintf (str, "truncation=Right");
+ break;
+ case 2:
+ sprintf (str, "truncation=Left");
+ break;
+ case 3:
+ sprintf (str, "truncation=Left&right");
+ break;
+ case 100:
+ sprintf (str, "truncation=Do not truncate");
+ break;
+ case 101:
+ sprintf (str, "truncation=Process #");
+ break;
+ case 102:
+ sprintf (str, "truncation=re-1");
+ break;
+ case 103:
+ sprintf (str, "truncation=re-2");
+ break;
+ case 104:
+ sprintf (str, "truncation=CCL");
+ break;
+ default:
+ sprintf (str, "truncation");
+ }
+ break;
+ case 6:
+ switch (value)
+ {
+ case 1:
+ sprintf (str, "completeness=Incomplete subfield");
+ break;
+ case 2:
+ sprintf (str, "completeness=Complete subfield");
+ break;
+ case 3:
+ sprintf (str, "completeness=Complete field");
+ break;
+ default:
+ sprintf (str, "completeness");
+ }
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if (*str)
+ sprintf (str + strlen(str), " (%d=%d)", type, value);
+ else
+ sprintf (str, "%d=%d", type, value);
+}
+
+/*
+ * zlog_attributes: print attributes of term
+ */
+static void zlog_attributes (Z_AttributesPlusTerm *t, int level,
+ enum oid_value ast)
+{
+ int of, i;
+ char str[80];
+ int num_attributes = t->attributes->num_attributes;
+
+ for (of = 0; of < num_attributes; of++)
+ {
+ const char *attset_name = "";
+ Z_AttributeElement *element;
+ element = t->attributes->attributes[of];
+ if (element->attributeSet)
+ {
+ oident *attrset;
+ attrset = oid_getentbyoid (element->attributeSet);
+ attset_name = attrset->desc;
+ }
+ switch (element->which)
+ {
+ case Z_AttributeValue_numeric:
+ attrStr (*element->attributeType,
+ *element->value.numeric, ast, str);
+ yaz_log (LOG_LOG, "%*.0s%s %s", level, "", attset_name, str);
+ break;
+ case Z_AttributeValue_complex:
+ yaz_log (LOG_LOG, "%*.0s%s attributeType=%d complex",
+ level, "", attset_name, *element->attributeType);
+ for (i = 0; i<element->value.complex->num_list; i++)
+ {
+ if (element->value.complex->list[i]->which ==
+ Z_StringOrNumeric_string)
+ yaz_log (LOG_LOG, "%*.0s string: '%s'", level, "",
+ element->value.complex->list[i]->u.string);
+ else if (element->value.complex->list[i]->which ==
+ Z_StringOrNumeric_numeric)
+ yaz_log (LOG_LOG, "%*.0s numeric: '%d'", level, "",
+ *element->value.complex->list[i]->u.numeric);
+ }
+ break;
+ default:
+ yaz_log (LOG_LOG, "%.*s%s attribute unknown",
+ level, "", attset_name);
+ }
+ }
+}
+
+static void zlog_structure (Z_RPNStructure *zs, int level, enum oid_value ast)
+{
+ if (zs->which == Z_RPNStructure_complex)
+ {
+ Z_Operator *op = zs->u.complex->roperator;
+ const char *rstr = 0;
+ const char *unit = "private";
+ switch (op->which)
+ {
+ case Z_Operator_and:
+ yaz_log (LOG_LOG, "%*.0s and", level, "");
+ break;
+ case Z_Operator_or:
+ yaz_log (LOG_LOG, "%*.0s or", level, "");
+ break;
+ case Z_Operator_and_not:
+ yaz_log (LOG_LOG, "%*.0s and-not", level, "");
+ break;
+ case Z_Operator_prox:
+ if (op->u.prox->which == Z_ProximityOperator_known)
+ {
+ switch(*op->u.prox->u.known)
+ {
+ case Z_ProxUnit_character: unit = "character"; break;
+ case Z_ProxUnit_word: unit = "word"; break;
+ case Z_ProxUnit_sentence: unit = "sentence"; break;
+ case Z_ProxUnit_paragraph: unit = "paragraph"; break;
+ case Z_ProxUnit_section: unit = "section"; break;
+ case Z_ProxUnit_chapter: unit = "chapter"; break;
+ case Z_ProxUnit_document: unit = "document"; break;
+ case Z_ProxUnit_element: unit = "element"; break;
+ case Z_ProxUnit_subelement: unit = "subelement"; break;
+ case Z_ProxUnit_elementType: unit = "elementType"; break;
+ case Z_ProxUnit_byte: unit = "byte"; break;
+ default: unit = "unknown"; break;
+ }
+ }
+ rstr = relToStr(*op->u.prox->relationType);
+ yaz_log (LOG_LOG, "%*.0s prox excl=%s dist=%d order=%s "
+ "rel=%s unit=%s",
+ level, "", op->u.prox->exclusion ?
+ (*op->u.prox->exclusion ? "T" : "F") : "N",
+ *op->u.prox->distance,
+ *op->u.prox->ordered ? "T" : "F",
+ rstr ? rstr : "unknown",
+ unit);
+ break;
+ default:
+ yaz_log (LOG_LOG, "%*.0s unknown complex", level, "");
+ return;
+ }
+ zlog_structure (zs->u.complex->s1, level+2, ast);
+ zlog_structure (zs->u.complex->s2, level+2, ast);
+ }
+ else if (zs->which == Z_RPNStructure_simple)
+ {
+ if (zs->u.simple->which == Z_Operand_APT)
+ {
+ Z_AttributesPlusTerm *zapt = zs->u.simple->u.attributesPlusTerm;
+
+ switch (zapt->term->which)
+ {
+ case Z_Term_general:
+ yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
+ zapt->term->u.general->len,
+ zapt->term->u.general->buf);
+ break;
+ case Z_Term_characterString:
+ yaz_log (LOG_LOG, "%*.0s term '%s' (string)", level, "",
+ zapt->term->u.characterString);
+ break;
+ case Z_Term_numeric:
+ yaz_log (LOG_LOG, "%*.0s term '%d' (numeric)", level, "",
+ *zapt->term->u.numeric);
+ break;
+ case Z_Term_null:
+ yaz_log (LOG_LOG, "%*.0s term (null)", level, "");
+ break;
+ default:
+ yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
+ }
+ zlog_attributes (zapt, level+2, ast);
+ }
+ else if (zs->u.simple->which == Z_Operand_resultSetId)
+ {
+ yaz_log (LOG_LOG, "%*.0s set '%s'", level, "",
+ zs->u.simple->u.resultSetId);
+ }
+ else
+ yaz_log (LOG_LOG, "%*.0s unknown simple structure", level, "");
+ }
+ else
+ yaz_log (LOG_LOG, "%*.0s unknown structure", level, "");
+}
+
+void log_rpn_query (Z_RPNQuery *rpn)
+{
+ oident *attrset;
+ enum oid_value ast;
+
+ attrset = oid_getentbyoid (rpn->attributeSetId);
+ if (attrset)
+ {
+ ast = attrset->value;
+ yaz_log (LOG_LOG, "RPN query. Type: %s", attrset->desc);
+ }
+ else
+ {
+ ast = VAL_NONE;
+ yaz_log (LOG_LOG, "RPN query. Unknown type");
+ }
+ zlog_structure (rpn->RPNStructure, 0, ast);
+}
+
+void log_scan_term (Z_AttributesPlusTerm *zapt, oid_value ast)
+{
+ int level = 0;
+ if (zapt->term->which == Z_Term_general)
+ {
+ yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
+ zapt->term->u.general->len, zapt->term->u.general->buf);
+ }
+ else
+ yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
+ zlog_attributes (zapt, level+2, ast);
+}
+
+void yaz_log_zquery (Z_Query *q)
+{
+ switch (q->which)
+ {
+ case Z_Query_type_1: case Z_Query_type_101:
+ log_rpn_query (q->u.type_1);
+ break;
+ case Z_Query_type_104:
+ if (q->u.type_104->which == Z_External_CQL)
+ yaz_log (LOG_LOG, "CQL: %s", q->u.type_104->u.cql);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: marcdisp.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <yaz/marcdisp.h>
+#include <yaz/wrbuf.h>
+#include <yaz/yaz-util.h>
+
+struct yaz_marc_t_ {
+ WRBUF m_wr;
+ int xml;
+ int debug;
+};
+
+yaz_marc_t yaz_marc_create(void)
+{
+ yaz_marc_t mt = (yaz_marc_t) xmalloc(sizeof(*mt));
+ mt->xml = YAZ_MARC_LINE;
+ mt->debug = 0;
+ mt->m_wr = wrbuf_alloc();
+ return mt;
+}
+
+void yaz_marc_destroy(yaz_marc_t mt)
+{
+ if (!mt)
+ return ;
+ wrbuf_free (mt->m_wr, 1);
+ xfree (mt);
+}
+
+static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len, WRBUF wr)
+{
+ size_t i;
+ for (i = 0; i<len; i++)
+ {
+ if (mt->xml)
+ {
+ switch (buf[i]) {
+ case '<':
+ wrbuf_puts(wr, "<");
+ break;
+ case '>':
+ wrbuf_puts(wr, ">");
+ break;
+ case '&':
+ wrbuf_puts(wr, "&");
+ break;
+ case '"':
+ wrbuf_puts(wr, """);
+ break;
+ case '\'':
+ wrbuf_puts(wr, "'");
+ break;
+ default:
+ wrbuf_putc(wr, buf[i]);
+ }
+ }
+ else
+ wrbuf_putc(wr, buf[i]);
+ }
+}
+
+#if 0
+static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len)
+{
+ if (!mt->cd)
+ marc_cdata2 (mt, buf, len);
+ else
+ {
+ char outbuf[12];
+ size_t inbytesleft = len;
+ const char *inp = buf;
+
+ while (inbytesleft)
+ {
+ size_t outbytesleft = sizeof(outbuf);
+ char *outp = outbuf;
+ size_t r = yaz_iconv (mt->cd, (char**) &inp, &inbytesleft,
+ &outp, &outbytesleft);
+ if (r == (size_t) (-1))
+ {
+ int e = yaz_iconv_error(mt->cd);
+ if (e != YAZ_ICONV_E2BIG)
+ break;
+ }
+ marc_cdata2 (mt, outbuf, outp - outbuf);
+ }
+ }
+}
+#endif
+
+int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)
+{
+ int entry_p;
+ int record_length;
+ int indicator_length;
+ int identifier_length;
+ int base_address;
+ int length_data_entry;
+ int length_starting;
+ int length_implementation;
+
+ wrbuf_rewind(wr);
+
+ record_length = atoi_n (buf, 5);
+ if (record_length < 25)
+ {
+ if (mt->debug)
+ {
+ char str[40];
+
+ sprintf (str, "Record length %d - aborting\n", record_length);
+ wrbuf_puts (wr, str);
+ }
+ return -1;
+ }
+ /* ballout if bsize is known and record_length is than that */
+ if (bsize != -1 && record_length > bsize)
+ return -1;
+ if (isdigit(buf[10]))
+ indicator_length = atoi_n (buf+10, 1);
+ else
+ indicator_length = 2;
+ if (isdigit(buf[11]))
+ identifier_length = atoi_n (buf+11, 1);
+ else
+ identifier_length = 2;
+ base_address = atoi_n (buf+12, 5);
+
+ length_data_entry = atoi_n (buf+20, 1);
+ length_starting = atoi_n (buf+21, 1);
+ length_implementation = atoi_n (buf+22, 1);
+
+ if (mt->xml)
+ {
+ char str[80];
+ int i;
+ switch(mt->xml)
+ {
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_puts (wr, "<iso2709\n");
+ sprintf (str, " RecordStatus=\"%c\"\n", buf[5]);
+ wrbuf_puts (wr, str);
+ sprintf (str, " TypeOfRecord=\"%c\"\n", buf[6]);
+ wrbuf_puts (wr, str);
+ for (i = 1; i<=19; i++)
+ {
+ sprintf (str, " ImplDefined%d=\"%c\"\n", i, buf[6+i]);
+ wrbuf_puts (wr, str);
+ }
+ wrbuf_puts (wr, ">\n");
+ break;
+ case YAZ_MARC_OAIMARC:
+ wrbuf_puts(
+ wr,
+ "<oai_marc xmlns=\"http://www.openarchives.org/OIA/oai_marc\""
+ "\n"
+ " xmlns:xsi=\"http://www.w3.org/2000/10/XMLSchema-instance\""
+ "\n"
+ " xsi:schemaLocation=\"http://www.openarchives.org/OAI/oai_marc.xsd\""
+ "\n"
+ );
+
+ sprintf (str, " status=\"%c\" type=\"%c\" catForm=\"%c\">\n",
+ buf[5], buf[6], buf[7]);
+ wrbuf_puts (wr, str);
+ break;
+ case YAZ_MARC_MARCXML:
+ wrbuf_printf(
+ wr,
+ "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
+ " <leader>%.24s</leader>\n", buf);
+ break;
+ }
+ }
+ if (mt->debug)
+ {
+ char str[40];
+
+ if (mt->xml)
+ wrbuf_puts (wr, "<!--\n");
+ sprintf (str, "Record length %5d\n", record_length);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Indicator length %5d\n", indicator_length);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Identifier length %5d\n", identifier_length);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Base address %5d\n", base_address);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Length data entry %5d\n", length_data_entry);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Length starting %5d\n", length_starting);
+ wrbuf_puts (wr, str);
+ sprintf (str, "Length implementation %5d\n", length_implementation);
+ wrbuf_puts (wr, str);
+ if (mt->xml)
+ wrbuf_puts (wr, "-->\n");
+ }
+
+ for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+ {
+ entry_p += 3+length_data_entry+length_starting;
+ if (entry_p >= record_length)
+ return -1;
+ }
+ base_address = entry_p+1;
+ for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+ {
+ int data_length;
+ int data_offset;
+ int end_offset;
+ int i, j;
+ char tag[4];
+ int identifier_flag = 1;
+
+ memcpy (tag, buf+entry_p, 3);
+ entry_p += 3;
+ tag[3] = '\0';
+ data_length = atoi_n (buf+entry_p, length_data_entry);
+ entry_p += length_data_entry;
+ data_offset = atoi_n (buf+entry_p, length_starting);
+ entry_p += length_starting;
+ i = data_offset + base_address;
+ end_offset = i+data_length-1;
+
+ if (indicator_length < 4 && indicator_length > 0)
+ {
+ if (buf[i + indicator_length] != ISO2709_IDFS)
+ identifier_flag = 0;
+ }
+ else if (!memcmp (tag, "00", 2))
+ identifier_flag = 0;
+
+ switch(mt->xml)
+ {
+ case YAZ_MARC_LINE:
+ if (mt->debug)
+ wrbuf_puts (wr, "Tag: ");
+ wrbuf_puts (wr, tag);
+ wrbuf_puts (wr, " ");
+ break;
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_printf (wr, "<field tag=\"%s\"", tag);
+ break;
+ case YAZ_MARC_OAIMARC:
+ if (identifier_flag)
+ wrbuf_printf (wr, " <varfield id=\"%s\"", tag);
+ else
+ wrbuf_printf (wr, " <fixfield id=\"%s\"", tag);
+ break;
+ case YAZ_MARC_MARCXML:
+ if (identifier_flag)
+ wrbuf_printf (wr, " <datafield tag=\"%s\"", tag);
+ else
+ wrbuf_printf (wr, " <controlfield tag=\"%s\"", tag);
+ }
+
+ if (identifier_flag)
+ {
+ for (j = 0; j<indicator_length; j++, i++)
+ {
+ switch(mt->xml)
+ {
+ case YAZ_MARC_LINE:
+ if (mt->debug)
+ wrbuf_puts (wr, " Ind: ");
+ wrbuf_putc (wr, buf[i]);
+ break;
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_printf (wr, " Indicator%d=\"%c\"", j+1, buf[i]);
+ break;
+ case YAZ_MARC_OAIMARC:
+ wrbuf_printf (wr, " i%d=\"%c\"", j+1, buf[i]);
+ break;
+ case YAZ_MARC_MARCXML:
+ wrbuf_printf (wr, " ind%d=\"%c\"", j+1, buf[i]);
+ }
+ }
+ }
+ if (mt->xml)
+ {
+ wrbuf_puts (wr, ">");
+ if (identifier_flag)
+ wrbuf_puts (wr, "\n");
+ }
+ else
+ {
+ if (mt->debug && !mt->xml)
+ wrbuf_puts (wr, " Fields: ");
+ }
+ if (identifier_flag)
+ {
+ while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
+ {
+ int i0;
+ i++;
+ switch(mt->xml)
+ {
+ case YAZ_MARC_LINE:
+ wrbuf_puts (wr, " $");
+ for (j = 1; j<identifier_length; j++, i++)
+ wrbuf_putc (wr, buf[i]);
+ wrbuf_putc (wr, ' ');
+ break;
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_puts (wr, " <subfield code=\"");
+ for (j = 1; j<identifier_length; j++, i++)
+ wrbuf_putc (wr, buf[i]);
+ wrbuf_puts (wr, "\">");
+ break;
+ case YAZ_MARC_OAIMARC:
+ wrbuf_puts (wr, " <subfield label=\"");
+ for (j = 1; j<identifier_length; j++, i++)
+ wrbuf_putc (wr, buf[i]);
+ wrbuf_puts (wr, "\">");
+ break;
+ case YAZ_MARC_MARCXML:
+ wrbuf_puts (wr, " <subfield code=\"");
+ for (j = 1; j<identifier_length; j++, i++)
+ wrbuf_putc (wr, buf[i]);
+ wrbuf_puts (wr, "\">");
+ break;
+ }
+ i0 = i;
+ while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS &&
+ buf[i] != ISO2709_FS && i < end_offset)
+ i++;
+ marc_cdata(mt, buf + i0, i - i0, wr);
+
+ if (mt->xml)
+ wrbuf_puts (wr, "</subfield>\n");
+ }
+ }
+ else
+ {
+ int i0 = i;
+ while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
+ i++;
+ marc_cdata(mt, buf + i0, i - i0, wr);
+ }
+ if (!mt->xml)
+ wrbuf_putc (wr, '\n');
+ if (i < end_offset)
+ wrbuf_puts (wr, " <!-- separator but not at end of field -->\n");
+ if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS)
+ wrbuf_puts (wr, " <!-- no separator at end of field -->\n");
+ switch(mt->xml)
+ {
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_puts (wr, "</field>\n");
+ break;
+ case YAZ_MARC_OAIMARC:
+ if (identifier_flag)
+ wrbuf_puts (wr, " </varfield>\n");
+ else
+ wrbuf_puts (wr, " </fixfield>\n");
+ break;
+ case YAZ_MARC_MARCXML:
+ if (identifier_flag)
+ wrbuf_puts (wr, " </datafield>\n");
+ else
+ wrbuf_puts (wr, " </controlfield>\n");
+ break;
+ }
+ }
+ switch (mt->xml)
+ {
+ case YAZ_MARC_LINE:
+ wrbuf_puts (wr, "");
+ break;
+ case YAZ_MARC_SIMPLEXML:
+ wrbuf_puts (wr, "</iso2709>\n");
+ break;
+ case YAZ_MARC_OAIMARC:
+ wrbuf_puts (wr, "</oai_marc>\n");
+ break;
+ case YAZ_MARC_MARCXML:
+ wrbuf_puts (wr, "</record>\n");
+ break;
+ }
+ return record_length;
+}
+
+int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize,
+ char **result, int *rsize)
+{
+ int r = yaz_marc_decode_wrbuf(mt, buf, bsize, mt->m_wr);
+ if (r > 0)
+ {
+ if (result)
+ *result = wrbuf_buf(mt->m_wr);
+ if (rsize)
+ *rsize = wrbuf_len(mt->m_wr);
+ }
+ return r;
+}
+
+void yaz_marc_xml(yaz_marc_t mt, int xmlmode)
+{
+ if (mt)
+ mt->xml = xmlmode;
+}
+
+void yaz_marc_debug(yaz_marc_t mt, int level)
+{
+ if (mt)
+ mt->debug = level;
+}
+
+/* depricated */
+int yaz_marc_decode(const char *buf, WRBUF wr, int debug, int bsize, int xml)
+{
+ yaz_marc_t mt = yaz_marc_create();
+ int r;
+
+ mt->debug = debug;
+ mt->xml = xml;
+ r = yaz_marc_decode_wrbuf(mt, buf, bsize, wr);
+ yaz_marc_destroy(mt);
+ return r;
+}
+
+/* depricated */
+int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int bsize)
+{
+ return yaz_marc_decode(buf, wr, debug, bsize, 0);
+}
+
+/* depricated */
+int marc_display_exl (const char *buf, FILE *outf, int debug, int bsize)
+{
+ yaz_marc_t mt = yaz_marc_create();
+ int r;
+
+ mt->debug = debug;
+ r = yaz_marc_decode_wrbuf (mt, buf, bsize, mt->m_wr);
+ if (!outf)
+ outf = stdout;
+ if (r > 0)
+ fwrite (wrbuf_buf(mt->m_wr), 1, wrbuf_len(mt->m_wr), outf);
+ yaz_marc_destroy(mt);
+ return r;
+}
+
+/* depricated */
+int marc_display_ex (const char *buf, FILE *outf, int debug)
+{
+ return marc_display_exl (buf, outf, debug, -1);
+}
+
+/* depricated */
+int marc_display (const char *buf, FILE *outf)
+{
+ return marc_display_ex (buf, outf, 0);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: matchstr.c,v 1.1 2003-10-27 12:21:31 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <string.h>
+#include <yaz/yaz-util.h>
+
+/*
+ * Match strings, independently of case and occurences of '-'.
+ * fairly inefficient - will be replaced with an indexing scheme for
+ * the various subsystems if we get a bottleneck here.
+ */
+
+int yaz_matchstr(const char *s1, const char *s2)
+{
+ while (*s1 && *s2)
+ {
+ char c1 = *s1;
+ char c2 = *s2;
+
+ if (c2 == '?')
+ return 0;
+ if (c1 == '-')
+ c1 = *++s1;
+ if (c2 == '-')
+ c2 = *++s2;
+ if (!c1 || !c2)
+ break;
+ if (c2 != '.')
+ {
+ if (isupper(c1))
+ c1 = tolower(c1);
+ if (isupper(c2))
+ c2 = tolower(c2);
+ if (c1 != c2)
+ break;
+ }
+ s1++;
+ s2++;
+ }
+ return *s1 || *s2;
+}
+
+int yaz_strcmp_del(const char *a, const char *b, const char *b_del)
+{
+ while (*a && *b)
+ {
+ if (*a != *b)
+ return *a - *b;
+ a++;
+ b++;
+ }
+ if (b_del && strchr(b_del, *b))
+ return *a;
+ return *a - *b;
+}
+
+#ifdef __GNUC__
+#ifdef __CHECKER__
+void __assert_fail (const char *assertion, const char *file,
+ unsigned int line, const char *function)
+{
+ fprintf (stderr, "%s in file %s line %d func %s\n",
+ assertion, file, line, function);
+ abort ();
+}
+#endif
+#endif
--- /dev/null
+UserInfoFormat-multipleSearchTerms-2
+{Z39-50-userInfoFormat MultipleSearchTerms-2 (5)} DEFINITIONS ::=
+BEGIN
+IMPORTS Term FROM Z39-50-APDU-1995;
+
+MultipleSearchTerms-2 ::= SEQUENCE OF SEQUENCE{
+ term [1] IMPLICIT Term,
+ flag [2] IMPLICIT BOOLEAN OPTIONAL}
+
+END
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: nmem.c,v 1.1 2003-10-27 12:21:32 adam Exp $
+ */
+
+/*
+ * This is a simple and fairly wasteful little module for nibble memory
+ * allocation. Evemtually we'll put in something better.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <yaz/xmalloc.h>
+#include <yaz/nmem.h>
+#include <yaz/log.h>
+#include <yaz/oid.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#if YAZ_POSIX_THREADS
+#include <pthread.h>
+#endif
+
+#if YAZ_GNU_THREADS
+#include <pth.h>
+#endif
+
+#define NMEM_CHUNK (4*1024)
+
+#ifdef WIN32
+static CRITICAL_SECTION critical_section;
+#define NMEM_ENTER EnterCriticalSection(&critical_section)
+#define NMEM_LEAVE LeaveCriticalSection(&critical_section)
+struct nmem_mutex {
+ CRITICAL_SECTION m_handle;
+};
+#elif YAZ_POSIX_THREADS
+static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER;
+#define NMEM_ENTER pthread_mutex_lock(&nmem_mutex);
+#define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex);
+struct nmem_mutex {
+ pthread_mutex_t m_handle;
+};
+#elif YAZ_GNU_THREADS
+static pth_mutex_t nmem_mutex = PTH_MUTEX_INIT;
+#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0)
+#define NMEM_LEAVE pth_mutex_release(&nmem_mutex)
+struct nmem_mutex {
+ pth_mutex_t m_handle;
+};
+#else
+#define NMEM_ENTER
+#define NMEM_LEAVE
+struct nmem_mutex {
+ int dummy;
+};
+#endif
+
+YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p)
+{
+ NMEM_ENTER;
+ if (!*p)
+ {
+ *p = (NMEM_MUTEX) malloc (sizeof(**p));
+#ifdef WIN32
+ InitializeCriticalSection(&(*p)->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_init (&(*p)->m_handle, 0);
+#elif YAZ_GNU_THREADS
+ pth_mutex_init (&(*p)->m_handle);
+#endif
+ }
+ NMEM_LEAVE;
+}
+
+YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p)
+{
+ if (p)
+ {
+#ifdef WIN32
+ EnterCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_lock(&p->m_handle);
+#endif
+ }
+}
+
+YAZ_EXPORT void nmem_mutex_leave(NMEM_MUTEX p)
+{
+ if (p)
+ {
+#ifdef WIN32
+ LeaveCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_unlock(&p->m_handle);
+#endif
+ }
+}
+
+YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p)
+{
+ NMEM_ENTER;
+ if (*p)
+ {
+#ifdef WIN32
+ DeleteCriticalSection(&(*p)->m_handle);
+#endif
+ free (*p);
+ *p = 0;
+ }
+ NMEM_LEAVE;
+}
+
+static nmem_block *freelist = NULL; /* "global" freelists */
+static nmem_control *cfreelist = NULL;
+static int nmem_active_no = 0;
+static int nmem_init_flag = 0;
+
+#if NMEM_DEBUG
+struct nmem_debug_info {
+ void *p;
+ char file[40];
+ int line;
+ struct nmem_debug_info *next;
+};
+
+struct nmem_debug_info *nmem_debug_list = 0;
+#endif
+
+static void free_block(nmem_block *p)
+{
+ p->next = freelist;
+ freelist = p;
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "nmem free_block p=%p", p);
+#endif
+}
+
+#if NMEM_DEBUG
+void nmem_print_list (void)
+{
+ struct nmem_debug_info *p;
+
+ yaz_log (LOG_DEBUG, "nmem print list");
+ NMEM_ENTER;
+ for (p = nmem_debug_list; p; p = p->next)
+ yaz_log (LOG_DEBUG, " %s:%d p=%p size=%d", p->file, p->line, p->p,
+ nmem_total(p->p));
+ NMEM_LEAVE;
+}
+#endif
+/*
+ * acquire a block with a minimum of size free bytes.
+ */
+static nmem_block *get_block(int size)
+{
+ nmem_block *r, *l;
+
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "nmem get_block size=%d", size);
+#endif
+ for (r = freelist, l = 0; r; l = r, r = r->next)
+ if (r->size >= size)
+ break;
+ if (r)
+ {
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "nmem get_block found free block p=%p", r);
+#endif
+ if (l)
+ l->next = r->next;
+ else
+ freelist = r->next;
+ }
+ else
+ {
+ int get = NMEM_CHUNK;
+
+ if (get < size)
+ get = size;
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "nmem get_block alloc new block size=%d", get);
+#endif
+ r = (nmem_block *)xmalloc(sizeof(*r));
+ r->buf = (char *)xmalloc(r->size = get);
+ }
+ r->top = 0;
+ return r;
+}
+
+void nmem_reset(NMEM n)
+{
+ nmem_block *t;
+
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "nmem_reset p=%p", n);
+#endif
+ if (!n)
+ return;
+ NMEM_ENTER;
+ while (n->blocks)
+ {
+ t = n->blocks;
+ n->blocks = n->blocks->next;
+ free_block(t);
+ }
+ n->total = 0;
+ NMEM_LEAVE;
+}
+
+#if NMEM_DEBUG
+void *nmem_malloc_f (const char *file, int line, NMEM n, int size)
+#else
+void *nmem_malloc(NMEM n, int size)
+#endif
+{
+ struct nmem_block *p;
+ char *r;
+
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "%s:%d: nmem_malloc p=%p size=%d", file, line,
+ n, size);
+#endif
+ if (!n)
+ {
+ yaz_log (LOG_FATAL, "calling nmem_malloc with an null pointer");
+ abort ();
+ }
+#ifdef WIN32
+ assert (nmem_init_flag);
+#endif
+ NMEM_ENTER;
+ p = n->blocks;
+ if (!p || p->size - p->top < size)
+ {
+ p = get_block(size);
+ p->next = n->blocks;
+ n->blocks = p;
+ }
+ r = p->buf + p->top;
+ /* align size */
+ p->top += (size + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
+ n->total += size;
+ NMEM_LEAVE;
+ return r;
+}
+
+int nmem_total(NMEM n)
+{
+ return n->total;
+}
+
+#if NMEM_DEBUG
+NMEM nmem_create_f(const char *file, int line)
+#else
+NMEM nmem_create(void)
+#endif
+{
+ NMEM r;
+#if NMEM_DEBUG
+ struct nmem_debug_info *debug_p;
+#endif
+
+ NMEM_ENTER;
+ nmem_active_no++;
+ r = cfreelist;
+ if (r)
+ cfreelist = cfreelist->next;
+ else
+ r = (nmem_control *)xmalloc(sizeof(*r));
+ NMEM_LEAVE;
+
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "%s:%d: nmem_create %d p=%p", file, line,
+ nmem_active_no, r);
+#endif
+ r->blocks = 0;
+ r->total = 0;
+ r->next = 0;
+
+#if NMEM_DEBUG
+ for (debug_p = nmem_debug_list; debug_p; debug_p = debug_p->next)
+ if (debug_p->p == r)
+ {
+ yaz_log (LOG_FATAL, "multi used block in nmem");
+ abort ();
+ }
+ debug_p = xmalloc (sizeof(*debug_p));
+ strncpy (debug_p->file, file, sizeof(debug_p->file)-1);
+ debug_p->file[sizeof(debug_p->file)-1] = '\0';
+ debug_p->line = line;
+ debug_p->p = r;
+ debug_p->next = nmem_debug_list;
+ nmem_debug_list = debug_p;
+
+ nmem_print_list();
+#endif
+ return r;
+}
+
+#if NMEM_DEBUG
+void nmem_destroy_f(const char *file, int line, NMEM n)
+#else
+void nmem_destroy(NMEM n)
+#endif
+{
+#if NMEM_DEBUG
+ struct nmem_debug_info **debug_p;
+ int ok = 0;
+#endif
+ if (!n)
+ return;
+
+#if NMEM_DEBUG
+ yaz_log (LOG_DEBUG, "%s:%d: nmem_destroy %d p=%p", file, line,
+ nmem_active_no-1, n);
+ NMEM_ENTER;
+ for (debug_p = &nmem_debug_list; *debug_p; debug_p = &(*debug_p)->next)
+ if ((*debug_p)->p == n)
+ {
+ struct nmem_debug_info *debug_save = *debug_p;
+ *debug_p = (*debug_p)->next;
+ xfree (debug_save);
+ ok = 1;
+ break;
+ }
+ NMEM_LEAVE;
+ nmem_print_list();
+ if (!ok)
+ {
+ yaz_log (LOG_WARN, "%s:%d destroying unallocated nmem block p=%p",
+ file, line, n);
+ return;
+ }
+#endif
+ nmem_reset(n);
+ NMEM_ENTER;
+ nmem_active_no--;
+ n->next = cfreelist;
+ cfreelist = n;
+ NMEM_LEAVE;
+}
+
+void nmem_transfer (NMEM dst, NMEM src)
+{
+ nmem_block *t;
+ while ((t=src->blocks))
+ {
+ src->blocks = t->next;
+ t->next = dst->blocks;
+ dst->blocks = t;
+ }
+ dst->total += src->total;
+ src->total = 0;
+}
+
+void nmem_critical_enter (void)
+{
+ NMEM_ENTER;
+}
+
+void nmem_critical_leave (void)
+{
+ NMEM_LEAVE;
+}
+
+void nmem_init (void)
+{
+ if (++nmem_init_flag == 1)
+ {
+#ifdef WIN32
+ InitializeCriticalSection(&critical_section);
+#elif YAZ_GNU_THREADS
+ yaz_log (LOG_LOG, "pth_init");
+ pth_init ();
+#endif
+ nmem_active_no = 0;
+ freelist = NULL;
+ cfreelist = NULL;
+ }
+}
+
+void nmem_exit (void)
+{
+ if (--nmem_init_flag == 0)
+ {
+ oid_exit();
+ while (freelist)
+ {
+ struct nmem_block *fl = freelist;
+ freelist = freelist->next;
+ xfree (fl->buf);
+ xfree (fl);
+ }
+ while (cfreelist)
+ {
+ struct nmem_control *cfl = cfreelist;
+ cfreelist = cfreelist->next;
+ xfree (cfl);
+ }
+#ifdef WIN32
+ DeleteCriticalSection(&critical_section);
+#endif
+ }
+}
+
+
+#ifdef WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDLL,
+ DWORD reason,
+ LPVOID reserved)
+{
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ nmem_init ();
+ break;
+ case DLL_PROCESS_DETACH:
+ nmem_exit ();
+ }
+ return TRUE;
+}
+#endif
+
+int yaz_errno(void)
+{
+ return errno;
+}
+
+void yaz_set_errno(int v)
+{
+ errno = v;
+}
+
+void yaz_strerror(char *buf, int max)
+{
+ char *cp;
+#ifdef WIN32
+ DWORD err = GetLastError();
+ if (err)
+ {
+ FormatMessage(
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ err,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default lang */
+ (LPTSTR) buf,
+ max-1,
+ NULL);
+ }
+ else
+ *buf = '\0';
+#else
+/* UNIX */
+#if HAVE_STRERROR_R
+#if YAZ_POSIX_THREADS
+ *buf = '\0';
+ strerror_r(errno, buf, max);
+ /* if buffer is unset - use strerror anyway (GLIBC bug) */
+ if (*buf == '\0')
+ strcpy(buf, strerror(yaz_errno()));
+#else
+ strcpy(buf, strerror(yaz_errno()));
+#endif
+#else
+ strcpy(buf, strerror(yaz_errno()));
+#endif
+/* UNIX */
+#endif
+ if ((cp=strrchr(buf, '\n')))
+ *cp = '\0';
+ if ((cp=strrchr(buf, '\r')))
+ *cp = '\0';
+}
--- /dev/null
+/*
+ * Copyright (c) 1997-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: nmemsdup.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <yaz/nmem.h>
+
+char *nmem_strdup (NMEM mem, const char *src)
+{
+ char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
+ strcpy (dst, src);
+ return dst;
+}
+
+char *nmem_strdupn (NMEM mem, const char *src, size_t n)
+{
+ char *dst = (char *)nmem_malloc (mem, n+1);
+ memcpy (dst, src, n);
+ dst[n] = '\0';
+ return dst;
+}
+
+int *nmem_intdup(NMEM mem, int v)
+{
+ int *dst = (int*) nmem_malloc (mem, sizeof(int));
+ *dst = v;
+ return dst;
+}
--- /dev/null
+UserInfoFormat-oclcUserInformation
+{Z39-50-userInfoFormat OCLCUserInformation (7)} DEFINITIONS ::=
+BEGIN
+
+-- $Id: oclcui.asn,v 1.1 2003-10-27 12:21:33 adam Exp $
+--
+-- This format is returned from the server at
+-- fsz3950test.oclc.org:210
+-- I found the definition at
+-- http://www.oclc.org/firstsearch/documentation/z3950/config_guide.htm
+--
+-- I have added OPTIONAL modifiers to the `dblist' and and `code'
+-- elements because they appear to be admitted from the APDU returned
+-- as an Init diagnostic from fsz3950test.oclc.org:210. Adam further
+-- removed the SEQUENCE structure, changed failReason to a BOOLEAN and
+-- deleted diagnosticSetId altogether, to make the ASN.1 conform to
+-- what's actually returned on the wire. Finally, I removed the
+-- OPTIONAL on failReason on the advice of OCLC's Keith Neibarger
+-- <neibarge@oclc.org> (although he'd also advised me, wrongly, that I
+-- could remove the OPTIONAL on dblist).
+
+OCLC-UserInformation ::= SEQUENCE {
+ motd [1] IMPLICIT VisibleString OPTIONAL,
+ dblist SEQUENCE OF DBName OPTIONAL,
+ failReason [3] IMPLICIT BOOLEAN OPTIONAL,
+ code [1] IMPLICIT INTEGER OPTIONAL,
+ text [2] IMPLICIT VisibleString OPTIONAL
+}
+
+DBName ::= [2] IMPLICIT VisibleString
+
+END
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Id: odr-priv.h,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+
+#ifndef ODR_PRIV_H
+
+#define ODR_PRIV_H
+
+#include <yaz/odr.h>
+#include <yaz/yaz-util.h>
+
+struct Odr_ber_tag { /* used to be statics in ber_tag... */
+ int lclass;
+ int ltag;
+ int br;
+ int lcons;
+};
+
+#define odr_max(o) ((o)->size - ((o)->bp - (o)->buf))
+#define odr_offset(o) ((o)->bp - (o)->buf)
+
+struct Odr_private {
+ /* stack for constructed types */
+#define ODR_MAX_STACK 50
+ int stackp; /* top of stack (-1 == initial state) */
+ odr_constack stack[ODR_MAX_STACK];
+
+ struct Odr_ber_tag odr_ber_tag;
+ yaz_iconv_t iconv_handle;
+ int error_id;
+ char element[80];
+};
+
+/* Private macro.
+ * write a single character at the current position - grow buffer if
+ * necessary.
+ * (no, we're not usually this anal about our macros, but this baby is
+ * next to unreadable without some indentation :)
+ */
+#define odr_putc(o, c) \
+( \
+ ( \
+ (o)->pos < (o)->size ? \
+ ( \
+ (o)->buf[(o)->pos++] = (c), \
+ 0 \
+ ) : \
+ ( \
+ odr_grow_block((o), 1) == 0 ? \
+ ( \
+ (o)->buf[(o)->pos++] = (c), \
+ 0 \
+ ) : \
+ ( \
+ (o)->error = OSPACE, \
+ -1 \
+ ) \
+ ) \
+ ) == 0 ? \
+ ( \
+ (o)->pos > (o)->top ? \
+ ( \
+ (o)->top = (o)->pos, \
+ 0 \
+ ) : \
+ 0 \
+ ) : \
+ -1 \
+)
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: odr.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/xmalloc.h>
+#include "odr-priv.h"
+
+Odr_null *ODR_NULLVAL = (Odr_null *) "NULL"; /* the presence of a null value */
+
+Odr_null *odr_nullval (void)
+{
+ return ODR_NULLVAL;
+}
+
+char *odr_errlist[] =
+{
+ "No (unknown) error",
+ "Memory allocation failed",
+ "System error",
+ "No space in buffer",
+ "Required data element missing",
+ "Unexpected tag",
+ "Other error",
+ "Protocol error",
+ "Malformed data",
+ "Stack overflow",
+ "Length of constructed type different from sum of members",
+ "Overflow writing definite length of constructed type",
+ "Bad HTTP Request"
+};
+
+char *odr_errmsg(int n)
+{
+ return odr_errlist[n];
+}
+
+void odr_perror(ODR o, const char *message)
+{
+ const char *e = odr_getelement(o);
+ int err, x;
+
+ err = odr_geterrorx(o, &x);
+ fprintf(stderr, "%s: %s (code %d:%d)", message, odr_errlist[err], err, x);
+ if (e && *e)
+ fprintf (stderr, " element %s", e);
+ fprintf(stderr, "\n");
+}
+
+int odr_geterror(ODR o)
+{
+ return o->error;
+}
+
+int odr_geterrorx(ODR o, int *x)
+{
+ if (x)
+ *x = o->op->error_id;
+ return o->error;
+}
+
+char *odr_getelement(ODR o)
+{
+ return o->op->element;
+}
+
+void odr_seterror(ODR o, int error, int id)
+{
+ o->error = error;
+ o->op->error_id = id;
+ o->op->element[0] = '\0';
+}
+
+void odr_setelement(ODR o, const char *element)
+{
+ if (element)
+ {
+ strncpy(o->op->element, element, sizeof(o->op->element)-1);
+ o->op->element[sizeof(o->op->element)-1] = '\0';
+ }
+}
+
+void odr_setprint(ODR o, FILE *file)
+{
+ o->print = file;
+}
+
+int odr_set_charset(ODR o, const char *to, const char *from)
+{
+ if (o->op->iconv_handle)
+ yaz_iconv_close (o->op->iconv_handle);
+ o->op->iconv_handle = 0;
+ if (to && from)
+ {
+ o->op->iconv_handle = yaz_iconv_open (to, from);
+ if (o->op->iconv_handle == 0)
+ return -1;
+ }
+ return 0;
+}
+
+#include <yaz/log.h>
+
+ODR odr_createmem(int direction)
+{
+ ODR r;
+
+ if (!(r = (ODR)xmalloc(sizeof(*r))))
+ return 0;
+ r->direction = direction;
+ r->print = stderr;
+ r->buf = 0;
+ r->size = r->pos = r->top = 0;
+ r->can_grow = 1;
+ r->mem = nmem_create();
+ r->enable_bias = 1;
+ r->op = (struct Odr_private *) xmalloc (sizeof(*r->op));
+ r->op->odr_ber_tag.lclass = -1;
+ r->op->iconv_handle = 0;
+ odr_reset(r);
+ yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
+ return r;
+}
+
+void odr_reset(ODR o)
+{
+ odr_seterror(o, ONONE, 0);
+ o->bp = o->buf;
+ odr_seek(o, ODR_S_SET, 0);
+ o->top = 0;
+ o->t_class = -1;
+ o->t_tag = -1;
+ o->indent = 0;
+ o->op->stackp = -1;
+ nmem_reset(o->mem);
+ o->choice_bias = -1;
+ o->lenlen = 1;
+ if (o->op->iconv_handle != 0)
+ yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
+ yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
+}
+
+void odr_destroy(ODR o)
+{
+ nmem_destroy(o->mem);
+ if (o->buf && o->can_grow)
+ xfree(o->buf);
+ if (o->print && o->print != stderr)
+ fclose(o->print);
+ if (o->op->iconv_handle != 0)
+ yaz_iconv_close (o->op->iconv_handle);
+ xfree(o->op);
+ xfree(o);
+ yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
+}
+
+void odr_setbuf(ODR o, char *buf, int len, int can_grow)
+{
+ o->bp = (unsigned char *) buf;
+
+ o->buf = (unsigned char *) buf;
+ o->can_grow = can_grow;
+ o->top = o->pos = 0;
+ o->size = len;
+}
+
+char *odr_getbuf(ODR o, int *len, int *size)
+{
+ *len = o->top;
+ if (size)
+ *size = o->size;
+ return (char*) o->buf;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_any.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+/*
+ * This is a catch-all type. It stuffs a random ostring (assumed to be properly
+ * encoded) into the stream, or reads a full data element. Implicit tagging
+ * does not work, and neither does the optional flag, unless the element
+ * is the last in a sequence.
+ */
+int odr_any(ODR o, Odr_any **p, int opt, const char *name)
+{
+ if (o->error)
+ return 0;
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "ANY (len=%d)\n", (*p)->len);
+ return 1;
+ }
+ if (o->direction == ODR_DECODE)
+ *p = (Odr_oct *)odr_malloc(o, sizeof(**p));
+ if (ber_any(o, p))
+ return 1;
+ *p = 0;
+ return odr_missing(o, opt, name);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_bit.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include "odr-priv.h"
+
+/*
+ * Top level bitstring string en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_bitstring(ODR o, Odr_bitmask **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_BITSTRING;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "BITSTRING(len=%d)\n",(*p)->top + 1);
+ return 1;
+ }
+ if (o->direction == ODR_DECODE)
+ {
+ *p = (Odr_bitmask *)odr_malloc(o, sizeof(Odr_bitmask));
+ memset((*p)->bits, 0, ODR_BITMASK_SIZE);
+ (*p)->top = -1;
+ }
+#if 0
+ /* ignoring the cons helps with at least one target.
+ * http://bugzilla.indexdata.dk/cgi-bin/bugzilla/show_bug.cgi?id=24
+ */
+ return ber_bitstring(o, *p, 0);
+#else
+ return ber_bitstring(o, *p, cons);
+#endif
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_bool.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "odr-priv.h"
+
+/*
+ * Top level boolean en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_bool(ODR o, int **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_BOOLEAN;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "%s\n", (**p ? "TRUE" : "FALSE"));
+ return 1;
+ }
+ if (cons)
+ return 0;
+ if (o->direction == ODR_DECODE)
+ *p = (int *)odr_malloc(o, sizeof(int));
+ return ber_boolean(o, *p);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_choice.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
+ const char *name)
+{
+ int i, cl = -1, tg, cn, *which = (int *)whichp, bias = o->choice_bias;
+
+ if (o->error)
+ return 0;
+ if (o->direction != ODR_DECODE && !*(char**)p)
+ return 0;
+
+ if (o->direction == ODR_DECODE)
+ {
+ *which = -1;
+ *(char**)p = 0;
+ }
+ o->choice_bias = -1;
+
+ if (o->direction == ODR_PRINT)
+ {
+ if (name)
+ {
+ odr_prname(o, name);
+ fprintf (o->print, "choice\n");
+ }
+ }
+ for (i = 0; arm[i].fun; i++)
+ {
+ if (o->direction == ODR_DECODE)
+ {
+ if (bias >= 0 && bias != arm[i].which)
+ continue;
+ *which = arm[i].which;
+ }
+ else if (*which != arm[i].which)
+ continue;
+
+ if (arm[i].tagmode != ODR_NONE)
+ {
+ if (o->direction == ODR_DECODE && cl < 0)
+ {
+ if (o->op->stackp > -1 && !odr_constructed_more(o))
+ return 0;
+ if (ber_dectag(o->bp, &cl, &tg, &cn, odr_max(o)) <= 0)
+ return 0;
+ }
+ else if (o->direction != ODR_DECODE)
+ {
+ cl = arm[i].zclass;
+ tg = arm[i].tag;
+ }
+ if (tg == arm[i].tag && cl == arm[i].zclass)
+ {
+ if (arm[i].tagmode == ODR_IMPLICIT)
+ {
+ odr_implicit_settag(o, cl, tg);
+ return (*arm[i].fun)(o, (char **)p, 0, arm[i].name);
+ }
+ /* explicit */
+ if (!odr_constructed_begin(o, p, cl, tg, 0))
+ return 0;
+ return (*arm[i].fun)(o, (char **)p, 0, arm[i].name) &&
+ odr_constructed_end(o);
+ }
+ }
+ else /* no tagging. Have to poll type */
+ {
+ if ((*arm[i].fun)(o, (char **)p, 1, arm[i].name) && *(char**)p)
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void odr_choice_bias(ODR o, int what)
+{
+ if (o->enable_bias)
+ o->choice_bias = what;
+}
+
+void odr_choice_enable_bias (ODR o, int mode)
+{
+ o->enable_bias = mode;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: odr_cons.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+void odr_setlenlen(ODR o, int len)
+{
+ o->lenlen = len;
+}
+
+int odr_constructed_begin(ODR o, void *p, int zclass, int tag,
+ const char *name)
+{
+ int res;
+ int cons = 1;
+ int lenlen = o->lenlen;
+
+ if (o->error)
+ return 0;
+ o->lenlen = 1; /* reset lenlen */
+ if (o->t_class < 0)
+ {
+ o->t_class = zclass;
+ o->t_tag = tag;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, 1, name)) < 0)
+ return 0;
+ if (!res || !cons)
+ return 0;
+
+ if (o->op->stackp == ODR_MAX_STACK - 1)
+ {
+ odr_seterror(o, OSTACK, 30);
+ return 0;
+ }
+ o->op->stack[++(o->op->stackp)].lenb = o->bp;
+ o->op->stack[o->op->stackp].len_offset = odr_tell(o);
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[cons_begin(%d)]", o->op->stackp);
+#endif
+ if (o->direction == ODR_ENCODE)
+ {
+ static unsigned char dummy[sizeof(int)+1];
+
+ o->op->stack[o->op->stackp].lenlen = lenlen;
+
+ if (odr_write(o, dummy, lenlen) < 0) /* dummy */
+ {
+ --(o->op->stackp);
+ return 0;
+ }
+ }
+ else if (o->direction == ODR_DECODE)
+ {
+ if ((res = ber_declen(o->bp, &o->op->stack[o->op->stackp].len,
+ odr_max(o))) < 0)
+ {
+ odr_seterror(o, OOTHER, 31);
+ --(o->op->stackp);
+ return 0;
+ }
+ o->op->stack[o->op->stackp].lenlen = res;
+ o->bp += res;
+ if (o->op->stack[o->op->stackp].len > odr_max(o))
+ {
+ odr_seterror(o, OOTHER, 32);
+ --(o->op->stackp);
+ return 0;
+ }
+ }
+ else if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "{\n");
+ o->indent++;
+ }
+ else
+ {
+ odr_seterror(o, OOTHER, 33);
+ --(o->op->stackp);
+ return 0;
+ }
+ o->op->stack[o->op->stackp].base = o->bp;
+ o->op->stack[o->op->stackp].base_offset = odr_tell(o);
+ return 1;
+}
+
+int odr_constructed_more(ODR o)
+{
+ if (o->error)
+ return 0;
+ if (o->op->stackp < 0)
+ return 0;
+ if (o->op->stack[o->op->stackp].len >= 0)
+ return o->bp - o->op->stack[o->op->stackp].base < o->op->stack[o->op->stackp].len;
+ else
+ return (!(*o->bp == 0 && *(o->bp + 1) == 0));
+}
+
+int odr_constructed_end(ODR o)
+{
+ int res;
+ int pos;
+
+ if (o->error)
+ return 0;
+ if (o->op->stackp < 0)
+ {
+ odr_seterror(o, OOTHER, 34);
+ return 0;
+ }
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ if (o->op->stack[o->op->stackp].len < 0)
+ {
+ if (*o->bp++ == 0 && *(o->bp++) == 0)
+ {
+ o->op->stackp--;
+ return 1;
+ }
+ else
+ {
+ odr_seterror(o, OOTHER, 35);
+ return 0;
+ }
+ }
+ else if (o->bp - o->op->stack[o->op->stackp].base !=
+ o->op->stack[o->op->stackp].len)
+ {
+ odr_seterror(o, OCONLEN, 36);
+ return 0;
+ }
+ o->op->stackp--;
+ return 1;
+ case ODR_ENCODE:
+ pos = odr_tell(o);
+ odr_seek(o, ODR_S_SET, o->op->stack[o->op->stackp].len_offset);
+ if ((res = ber_enclen(o, pos - o->op->stack[o->op->stackp].base_offset,
+ o->op->stack[o->op->stackp].lenlen, 1)) < 0)
+ {
+ odr_seterror(o, OLENOV, 37);
+ return 0;
+ }
+ odr_seek(o, ODR_S_END, 0);
+ if (res == 0) /* indefinite encoding */
+ {
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[cons_end(%d): indefinite]", o->op->stackp);
+#endif
+ if (odr_putc(o, 0) < 0 || odr_putc(o, 0) < 0)
+ return 0;
+ }
+#ifdef ODR_DEBUG
+ else
+ {
+ fprintf(stderr, "[cons_end(%d): definite]", o->op->stackp);
+ }
+#endif
+ o->op->stackp--;
+ return 1;
+ case ODR_PRINT:
+ o->op->stackp--;
+ o->indent--;
+ odr_prname(o, 0);
+ fprintf(o->print, "}\n");
+ return 1;
+ default:
+ odr_seterror(o, OOTHER, 38);
+ return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_enum.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+/*
+ * Top level enum en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_enum(ODR o, int **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_ENUM;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "%d\n", **p);
+ return 1;
+ }
+ if (cons)
+ {
+ odr_seterror(o, OPROTO, 54);
+ return 0;
+ }
+ if (o->direction == ODR_DECODE)
+ *p = (int *)odr_malloc(o, sizeof(int));
+ return ber_integer(o, *p);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_int.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+/*
+ * Top level integer en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_integer(ODR o, int **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_INTEGER;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "%d\n", **p);
+ return 1;
+ }
+ if (cons)
+ {
+ odr_seterror(o, OPROTO, 1);
+ return 0;
+ }
+ if (o->direction == ODR_DECODE)
+ *p = (int *)odr_malloc(o, sizeof(int));
+ return ber_integer(o, *p);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: odr_mem.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "odr-priv.h"
+#include <yaz/xmalloc.h>
+
+/* ------------------------ NIBBLE MEMORY ---------------------- */
+
+/*
+ * Extract the memory control block from o.
+ */
+NMEM odr_extract_mem(ODR o)
+{
+ NMEM r = o->mem;
+
+ o->mem = 0;
+ return r;
+}
+
+void *odr_malloc(ODR o, int size)
+{
+ if (o && !o->mem)
+ o->mem = nmem_create();
+ return nmem_malloc(o ? o->mem : 0, size);
+}
+
+char *odr_strdup(ODR o, const char *str)
+{
+ return nmem_strdup(o->mem, str);
+}
+
+char *odr_strdupn(ODR o, const char *str, size_t n)
+{
+ return nmem_strdupn(o->mem, str, n);
+}
+
+int *odr_intdup(ODR o, int v)
+{
+ return nmem_intdup(o->mem, v);
+}
+
+int odr_total(ODR o)
+{
+ return o->mem ? nmem_total(o->mem) : 0;
+}
+
+/* ---------- memory management for data encoding ----------*/
+
+
+int odr_grow_block(ODR b, int min_bytes)
+{
+ int togrow;
+
+ if (!b->can_grow)
+ return -1;
+ if (!b->size)
+ togrow = 1024;
+ else
+ togrow = b->size;
+ if (togrow < min_bytes)
+ togrow = min_bytes;
+ if (b->size && !(b->buf =
+ (unsigned char *) xrealloc(b->buf, b->size += togrow)))
+ abort();
+ else if (!b->size && !(b->buf = (unsigned char *)
+ xmalloc(b->size = togrow)))
+ abort();
+#ifdef ODR_DEBUG
+ fprintf(stderr, "New size for encode_buffer: %d\n", b->size);
+#endif
+ return 0;
+}
+
+int odr_write(ODR o, unsigned char *buf, int bytes)
+{
+ if (o->pos + bytes >= o->size && odr_grow_block(o, bytes))
+ {
+ odr_seterror(o, OSPACE, 40);
+ return -1;
+ }
+ memcpy(o->buf + o->pos, buf, bytes);
+ o->pos += bytes;
+ if (o->pos > o->top)
+ o->top = o->pos;
+ return 0;
+}
+
+int odr_seek(ODR o, int whence, int offset)
+{
+ if (whence == ODR_S_CUR)
+ offset += o->pos;
+ else if (whence == ODR_S_END)
+ offset += o->top;
+ if (offset > o->size && odr_grow_block(o, offset - o->size))
+ {
+ odr_seterror(o, OSPACE, 41);
+ return -1;
+ }
+ o->pos = offset;
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_null.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+/*
+ * Top level null en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_null(ODR o, Odr_null **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_NULL;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "NULL\n");
+ return 1;
+ }
+ if (cons)
+ {
+#ifdef ODR_STRICT_NULL
+ odr_seterror(OPROTO, 42);
+ return 0;
+#else
+ fprintf(stderr, "odr: Warning: Bad NULL\n");
+#endif
+ }
+ if (o->direction == ODR_DECODE)
+ *p = odr_nullval();
+ return ber_null(o);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_oct.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/log.h>
+#include "odr-priv.h"
+
+/*
+ * Top level octet string en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_octetstring(ODR o, Odr_oct **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_OCTETSTRING;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ int i;
+ odr_prname(o, name);
+ fprintf(o->print, "OCTETSTRING(len=%d)", (*p)->len);
+ for (i = 0; i<(*p)->len; i++)
+ {
+ if (i < 5 || i > ((*p)->len - 4))
+ {
+ fprintf (o->print, " %02X", (*p)->buf[i]);
+ }
+ else if (i == 5)
+ fprintf (o->print, " .. ");
+ }
+ fprintf(o->print, "\n");
+ return 1;
+ }
+ if (o->direction == ODR_DECODE)
+ {
+ *p = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));
+ (*p)->size= 0;
+ (*p)->len = 0;
+ (*p)->buf = 0;
+ }
+ if (ber_octetstring(o, *p, cons))
+ return 1;
+ odr_seterror(o, OOTHER, 43);
+ return 0;
+}
+
+/*
+ * Friendlier interface to octetstring.
+ */
+int odr_cstring(ODR o, char **p, int opt, const char *name)
+{
+ int cons = 0, res;
+ Odr_oct *t;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_OCTETSTRING;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "'%s'\n", *p);
+ return 1;
+ }
+ t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
+ if (o->direction == ODR_ENCODE)
+ {
+ t->buf = (unsigned char *) *p;
+ t->size = t->len = strlen(*p);
+ }
+ else
+ {
+ t->size= 0;
+ t->len = 0;
+ t->buf = 0;
+ }
+ if (!ber_octetstring(o, t, cons))
+ return 0;
+ if (o->direction == ODR_DECODE)
+ {
+ *p = (char *) t->buf;
+ *(*p + t->len) = '\0'; /* ber_octs reserves space for this */
+ }
+ return 1;
+}
+
+/*
+ * iconv interface to octetstring.
+ */
+int odr_iconv_string(ODR o, char **p, int opt, const char *name)
+{
+ int cons = 0, res;
+ Odr_oct *t;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_OCTETSTRING;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (o->direction == ODR_PRINT)
+ {
+ odr_prname(o, name);
+ fprintf(o->print, "'%s'\n", *p);
+ return 1;
+ }
+ t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
+ if (o->direction == ODR_ENCODE)
+ {
+ t->buf = 0;
+
+ if (o->op->iconv_handle != 0)
+ {
+ size_t inleft = strlen(*p);
+ char *inbuf = *p;
+ size_t outleft = 4 * inleft + 2;
+ char *outbuf = (char *) odr_malloc (o, outleft);
+ size_t ret;
+
+ t->buf = (unsigned char *) outbuf;
+
+ ret = yaz_iconv (o->op->iconv_handle, &inbuf, &inleft,
+ &outbuf, &outleft);
+ if (ret == (size_t)(-1))
+ {
+ odr_seterror(o, ODATA, 44);
+ return 0;
+ }
+ t->size = t->len = outbuf - (char*) t->buf;
+ }
+ if (!t->buf)
+ {
+ t->buf = (unsigned char *) *p;
+ t->size = t->len = strlen(*p);
+ }
+ }
+ else
+ {
+ t->size= 0;
+ t->len = 0;
+ t->buf = 0;
+ }
+ if (!ber_octetstring(o, t, cons))
+ return 0;
+ if (o->direction == ODR_DECODE)
+ {
+ *p = 0;
+
+ if (o->op->iconv_handle != 0)
+ {
+ size_t inleft = t->len;
+ char *inbuf = (char *) t->buf;
+ size_t outleft = 4 * inleft + 2;
+ char *outbuf = (char *) odr_malloc (o, outleft);
+ size_t ret;
+
+ *p = outbuf;
+
+ ret = yaz_iconv (o->op->iconv_handle, &inbuf, &inleft,
+ &outbuf, &outleft);
+ if (ret == (size_t)(-1))
+ {
+ odr_seterror(o, ODATA, 45);
+ return 0;
+ }
+ inleft = outbuf - (char*) *p;
+
+ (*p)[inleft] = '\0'; /* null terminate it */
+ }
+ if (!*p)
+ {
+ *p = (char *) t->buf;
+ *(*p + t->len) = '\0'; /* ber_octs reserves space for this */
+ }
+ }
+ return 1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_oid.c,v 1.1 2003-10-27 12:21:33 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+#include <yaz/oid.h>
+
+/*
+ * Top level oid en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_oid(ODR o, Odr_oid **p, int opt, const char *name)
+{
+ int res, cons = 0;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_OID;
+ }
+ if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0)
+ return 0;
+ if (!res)
+ return odr_missing(o, opt, name);
+ if (cons)
+ {
+ odr_seterror(o, OPROTO, 46);
+ return 0;
+ }
+ if (o->direction == ODR_PRINT)
+ {
+ int i;
+
+ odr_prname(o, name);
+ fprintf(o->print, "OID:");
+ for (i = 0; (*p)[i] > -1; i++)
+ fprintf(o->print, " %d", (*p)[i]);
+ fprintf(o->print, "\n");
+ return 1;
+ }
+ if (o->direction == ODR_DECODE)
+ *p = (int *)odr_malloc(o, OID_SIZE * sizeof(**p));
+ return ber_oidc(o, *p);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_seq.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int odr_sequence_begin(ODR o, void *p, int size, const char *name)
+{
+ char **pp = (char**) p;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_SEQUENCE;
+ }
+ if (o->direction == ODR_DECODE)
+ *pp = 0;
+ if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
+ {
+ if (o->direction == ODR_DECODE && size)
+ *pp = (char *)odr_malloc(o, size);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int odr_set_begin(ODR o, void *p, int size, const char *name)
+{
+ char **pp = (char**) p;
+
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = ODR_UNIVERSAL;
+ o->t_tag = ODR_SET;
+ }
+ if (o->direction == ODR_DECODE)
+ *pp = 0;
+ if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
+ {
+ if (o->direction == ODR_DECODE && size)
+ *pp = (char *)odr_malloc(o, size);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int odr_sequence_end(ODR o)
+{
+ return odr_constructed_end(o);
+}
+
+int odr_set_end(ODR o)
+{
+ return odr_constructed_end(o);
+}
+
+static int odr_sequence_more(ODR o)
+{
+ return odr_constructed_more(o);
+}
+
+static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num)
+{
+ char ***pp = (char***) p; /* for dereferencing */
+ char **tmp = 0;
+ int size = 0, i;
+
+ switch (o->direction)
+ {
+ case ODR_DECODE:
+ *num = 0;
+ *pp = (char **)odr_nullval();
+ while (odr_sequence_more(o))
+ {
+ /* outgrown array? */
+ if (*num * (int) sizeof(void*) >= size)
+ {
+ /* double the buffer size */
+ tmp = (char **)odr_malloc(o, sizeof(void*) *
+ (size += size ? size : 128));
+ if (*num)
+ {
+ memcpy(tmp, *pp, *num * sizeof(void*));
+ /*
+ * For now, we just throw the old *p away, since we use
+ * nibble memory anyway (disgusting, isn't it?).
+ */
+ }
+ *pp = tmp;
+ }
+ if (!(*type)(o, (*pp) + *num, 0, 0))
+ return 0;
+ (*num)++;
+ }
+ break;
+ case ODR_ENCODE: case ODR_PRINT:
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[seqof: num=%d]", *num);
+#endif
+ for (i = 0; i < *num; i++)
+ {
+#ifdef ODR_DEBUG
+ fprintf(stderr, "[seqof: elem #%d]", i);
+#endif
+ if (!(*type)(o, *pp + i, 0, 0))
+ return 0;
+ }
+ break;
+ default:
+ odr_seterror(o, OOTHER, 47);
+ return 0;
+ }
+ return odr_sequence_end(o);
+}
+
+int odr_set_of(ODR o, Odr_fun type, void *p, int *num, const char *name)
+{
+ if (!odr_set_begin(o, p, 0, name)) {
+ if (o->direction == ODR_DECODE)
+ *num = 0;
+ return 0;
+ }
+ return odr_sequence_x (o, type, p, num);
+}
+
+int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num,
+ const char *name)
+{
+ if (!odr_sequence_begin(o, p, 0, name)) {
+ if (o->direction == ODR_DECODE)
+ *num = 0;
+ return 0;
+ }
+ return odr_sequence_x (o, type, p, num);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_tag.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int odr_peektag(ODR o, int *zclass, int *tag, int *cons)
+{
+ if (o->direction != ODR_DECODE)
+ {
+ odr_seterror(o, OOTHER, 48);
+ return 0;
+ }
+ if (o->op->stackp > -1 && !odr_constructed_more(o))
+ return 0;
+ if (ber_dectag(o->bp, zclass, tag, cons, odr_max(o)) <= 0)
+ {
+ odr_seterror(o, OREQUIRED, 49);
+ return 0;
+ }
+ return 1;
+}
+
+int odr_implicit_settag(ODR o, int zclass, int tag)
+{
+ if (o->error)
+ return 0;
+ if (o->t_class < 0)
+ {
+ o->t_class = zclass;
+ o->t_tag = tag;
+ }
+ return 1;
+}
+
+int odr_initmember(ODR o, void *p, int size)
+{
+ char **pp = (char **) p;
+
+ if (o->error)
+ return 0;
+ if (o->direction == ODR_DECODE)
+ *pp = (char *)odr_malloc(o, size);
+ else if (!*pp)
+ {
+ o->t_class = -1;
+ return 0;
+ }
+ return 1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: odr_use.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "odr-priv.h"
+
+int odr_external(ODR o, Odr_external **p, int opt, const char *name)
+{
+ Odr_external *pp;
+ static Odr_arm arm[] =
+ {
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, ODR_EXTERNAL_single,
+ (Odr_fun)odr_any, "single"},
+ {ODR_IMPLICIT, ODR_CONTEXT, 1, ODR_EXTERNAL_octet,
+ (Odr_fun)odr_octetstring, "octet"},
+ {ODR_IMPLICIT, ODR_CONTEXT, 2, ODR_EXTERNAL_arbitrary,
+ (Odr_fun)odr_bitstring, "arbitrary"},
+ {-1, -1, -1, -1, 0, 0}
+ };
+
+ odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
+ if (!odr_sequence_begin(o, p, sizeof(Odr_external), name))
+ return odr_missing(o, opt, name);
+ pp = *p;
+ return
+ odr_oid(o, &pp->direct_reference, 1, "direct") &&
+ odr_integer(o, &pp->indirect_reference, 1, "indirect") &&
+ odr_graphicstring(o, &pp->descriptor, 1, "descriptor") &&
+ odr_choice(o, arm, &pp->u, &pp->which, 0) &&
+ odr_sequence_end(o);
+}
+
+int odr_visiblestring(ODR o, char **p, int opt, const char *name)
+{
+ return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+ ODR_VISIBLESTRING, opt, name);
+}
+
+/*
+ * a char may not be sufficient to hold a general string, but we'll deal
+ * with that once we start looking more closely at UniCode & co.
+ */
+int odr_generalstring(ODR o, char **p, int opt, const char *name)
+{
+ return odr_implicit_tag(o, odr_iconv_string, p, ODR_UNIVERSAL,
+ ODR_GENERALSTRING,opt, name);
+}
+
+int odr_graphicstring(ODR o, char **p, int opt, const char *name)
+{
+ return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+ ODR_GRAPHICSTRING, opt, name);
+}
+
+int odr_generalizedtime(ODR o, char **p, int opt, const char *name)
+{
+ return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+ ODR_GENERALIZEDTIME, opt, name);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: odr_util.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "odr-priv.h"
+#include <yaz/oid.h>
+
+void odr_prname(ODR o, const char *name)
+{
+ if (name)
+ fprintf (o->print, "%*s%s ", o->indent*4, "", name);
+ else
+ fprintf (o->print, "%*s", o->indent*4, "");
+}
+
+int odp_more_chunks(ODR o, const unsigned char *base, int len)
+{
+ if (!len)
+ return 0;
+ if (len < 0) /* indefinite length */
+ {
+ if (*o->bp == 0 && *(o->bp + 1) == 0)
+ {
+ o->bp += 2;
+ return 0;
+ }
+ else
+ return 1;
+ }
+ else
+ return o->bp - base < len;
+}
+
+Odr_oid *odr_oiddup_nmem(NMEM nmem, Odr_oid *o)
+{
+ Odr_oid *r;
+
+ if (!o)
+ return 0;
+ if (!(r = (int *)nmem_malloc(nmem, (oid_oidlen(o) + 1) * sizeof(int))))
+ return 0;
+ oid_oidcpy(r, o);
+ return r;
+}
+
+Odr_oid *odr_oiddup(ODR odr, Odr_oid *o)
+{
+ return odr_oiddup_nmem (odr->mem, o);
+}
+
+Odr_oid *odr_getoidbystr_nmem(NMEM nmem, const char *str)
+{
+ int num = 1, i = 0;
+ const char *p = str;
+ Odr_oid *ret;
+
+ if (!isdigit(*str))
+ return 0;
+ while ((p = strchr(p, '.')))
+ num++, p++;
+ ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(num + 1));
+ p = str;
+ do
+ ret[i++] = atoi(p);
+ while ((p = strchr(p, '.')) && *++p);
+ ret[i] = -1;
+ return ret;
+}
+
+Odr_oid *odr_getoidbystr(ODR o, const char *str)
+{
+ return odr_getoidbystr_nmem (o->mem, str);
+}
+
+int odr_missing(ODR o, int opt, const char *name)
+{
+ if (o->error)
+ return 0;
+ if (!opt)
+ {
+ odr_seterror(o, OREQUIRED, 53);
+ odr_setelement(o, name);
+ }
+ return opt;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: oid.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+
+/*
+ * More or less protocol-transparent OID database.
+ * We could (and should?) extend this so that the user app can add new
+ * entries to the list at initialization.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/oid.h>
+#include <yaz/yaz-util.h>
+
+static int z3950_prefix[] = { 1, 2, 840, 10003, -1 };
+static int sr_prefix[] = { 1, 0, 10163, -1 };
+
+struct oident_list {
+ struct oident oident;
+ struct oident_list *next;
+};
+
+static struct oident_list *oident_table = NULL;
+static int oid_value_dynamic = VAL_DYNAMIC;
+static int oid_init_flag = 0;
+static NMEM_MUTEX oid_mutex = 0;
+static NMEM oid_nmem = 0;
+
+/*
+ * OID database
+ */
+static oident standard_oids[] =
+{
+ /* General definitions */
+ {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER, {2,1,1,-1},
+ "BER" },
+ {PROTO_GENERAL, CLASS_TRANSYN, VAL_ISO2709, {1,0,2709,1,1,-1},
+ "ISO2709"},
+ {PROTO_GENERAL, CLASS_GENERAL, VAL_ISO_ILL_1, {1,0,10161,2,1,-1},
+ "ISOILL-1"},
+ /* Z39.50v3 definitions */
+ {PROTO_Z3950, CLASS_ABSYN, VAL_APDU, {2,1,-1},
+ "Z-APDU"},
+ {PROTO_Z3950, CLASS_APPCTX, VAL_BASIC_CTX, {1,1,-1},
+ "Z-BASIC"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_BIB1, {3,1,-1},
+ "Bib-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_EXP1, {3,2,-1},
+ "Exp-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_EXT1, {3,3,-1},
+ "Ext-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_CCL1, {3,4,-1},
+ "CCL-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1},
+ "GILS-attset"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1},
+ "GILS"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_STAS, {3,6,-1},
+ "STAS-attset"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_COLLECT1, {3,7,-1},
+ "Collections-attset"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_CIMI1, {3,8,-1},
+ "CIMI-attset"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_GEO, {3,9,-1},
+ "Geo-attset"},
+
+ {PROTO_Z3950, CLASS_ATTSET, VAL_ZBIG, {3,10,-1},
+ "ZBIG"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_UTIL, {3,11,-1},
+ "Util"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_XD1, {3,12,-1},
+ "XD-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_ZTHES, {3,13,-1},
+ "Zthes"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_FIN1, {3,14,-1},
+ "Fin-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_DAN1, {3,15,-1},
+ "Dan-1"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_HOLDINGS, {3,16,-1},
+ "Holdings"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_USMARC, {3,17,-1},
+ "MARC"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_BIB2, {3,18,-1},
+ "Bib-2"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_ZEEREX, {3,19,-1},
+ "ZeeRex"},
+ /* New applications should use Zthes-1 instead of this Satan-spawn */
+ {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1},
+ "Thesaurus-attset"},
+ {PROTO_Z3950, CLASS_ATTSET, VAL_IDXPATH, {3,1000,81,2,-1},
+ "IDXPATH"},
+ {PROTO_Z3950, CLASS_DIAGSET, VAL_BIB1, {4,1,-1},
+ "Bib-1"},
+ {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG1, {4,2,-1},
+ "Diag-1"},
+ {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_ES, {4,3,-1},
+ "Diag-ES"},
+ {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_GENERAL, {4,3,-1},
+ "Diag-General"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_UNIMARC, {5,1,-1},
+ "Unimarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_INTERMARC, {5,2,-1},
+ "Intermarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_CCF, {5,3,-1},
+ "CCF"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_USMARC, {5,10,-1},
+ "USmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_UKMARC, {5,11,-1},
+ "UKmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_NORMARC, {5,12,-1},
+ "Normarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_LIBRISMARC, {5,13,-1},
+ "Librismarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_DANMARC, {5,14,-1},
+ "Danmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_FINMARC, {5,15,-1},
+ "Finmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_MAB, {5,16,-1},
+ "MAB"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_CANMARC, {5,17,-1},
+ "Canmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SBN, {5,18,-1},
+ "SBN"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_PICAMARC, {5,19,-1},
+ "Picamarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_AUSMARC, {5,20,-1},
+ "Ausmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_IBERMARC, {5,21,-1},
+ "Ibermarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_CATMARC, {5,22,-1},
+ "Carmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_MALMARC, {5,23,-1},
+ "Malmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_JPMARC, {5,24,-1},
+ "JPmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SWEMARC, {5,25,-1},
+ "SWEmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SIGLEMARC, {5,26,-1},
+ "SIGLEmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_ISDSMARC, {5,27,-1},
+ "ISDSmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_RUSMARC, {5,28,-1},
+ "RUSmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_HUNMARC, {5,29,-1},
+ "Hunmarc"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_EXPLAIN, {5,100,-1},
+ "Explain"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SUTRS, {5,101,-1},
+ "SUTRS"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_OPAC, {5,102,-1},
+ "OPAC"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SUMMARY, {5,103,-1},
+ "Summary"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_GRS0, {5,104,-1},
+ "GRS-0"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_GRS1, {5,105,-1},
+ "GRS-1"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_EXTENDED, {5,106,-1},
+ "Extended"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_FRAGMENT, {5,107,-1},
+ "Fragment"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_PDF, {5,109,1,-1},
+ "pdf"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_POSTSCRIPT, {5,109,2,-1},
+ "postscript"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_HTML, {5,109,3,-1},
+ "html"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_TIFF, {5,109,4,-1},
+ "tiff"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_GIF, {5,109,5,-1},
+ "gif"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_JPEG, {5,109,6,-1},
+ "jpeg"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_PNG, {5,109,7,-1},
+ "png"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_MPEG, {5,109,8,-1},
+ "mpeg"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SGML, {5,109,9,-1},
+ "sgml"},
+
+ {PROTO_Z3950, CLASS_RECSYN, VAL_TIFFB, {5,110,1,-1},
+ "tiff-b"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_WAV, {5,110,2,-1},
+ "wav"},
+
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SQLRS, {5,111,-1},
+ "SQL-RS"},
+ {PROTO_Z3950, CLASS_RECSYN, VAL_SOIF, {5,1000,81,2,-1},
+ "SOIF" },
+ {PROTO_Z3950, CLASS_RECSYN, VAL_TEXT_XML, {5,109,10,-1},
+ "text-XML" },
+ {PROTO_Z3950, CLASS_RECSYN, VAL_TEXT_XML, {5,109,10,-1},
+ "XML" },
+ {PROTO_Z3950, CLASS_RECSYN, VAL_APPLICATION_XML, {5,109,11,-1},
+ "application-XML" },
+ {PROTO_Z3950, CLASS_RESFORM, VAL_RESOURCE1, {7,1,-1},
+ "Resource-1"},
+ {PROTO_Z3950, CLASS_RESFORM, VAL_RESOURCE2, {7,2,-1},
+ "Resource-2"},
+ {PROTO_Z3950, CLASS_RESFORM, VAL_UNIVERSE_REPORT, {7,1000,81,1,-1},
+ "UNIverse-Resource-Report"},
+
+ {PROTO_Z3950, CLASS_ACCFORM, VAL_PROMPT1, {8,1,-1},
+ "Prompt-1"},
+ {PROTO_Z3950, CLASS_ACCFORM, VAL_DES1, {8,2,-1},
+ "Des-1"},
+ {PROTO_Z3950, CLASS_ACCFORM, VAL_KRB1, {8,3,-1},
+ "Krb-1"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_PRESSET, {9,1,-1},
+ "Pers. set"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_PQUERY, {9,2,-1},
+ "Pers. query"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_PCQUERY, {9,3,-1},
+ "Per'd query"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1},
+ "Item order"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE0, {9,5,-1},
+ "DB. Update (first version)"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE1, {9,5,1,-1},
+ "DB. Update (second version)"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE, {9,5,1,1,-1},
+ "DB. Update"},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTSPEC, {9,6,-1},
+ "exp. spec."},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1},
+ "exp. inv."},
+ {PROTO_Z3950, CLASS_EXTSERV, VAL_ADMINSERVICE, {9,1000,81,1,-1},
+ "Admin"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_SEARCHRES1, {10,1,-1},
+ "searchResult-1"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_CHARLANG, {10,2,-1},
+ "CharSetandLanguageNegotiation"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_USERINFO1, {10,3,-1},
+ "UserInfo-1"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_MULTISRCH1, {10,4,-1},
+ "MultipleSearchTerms-1"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_MULTISRCH2, {10,5,-1},
+ "MultipleSearchTerms-2"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_DATETIME, {10,6,-1},
+ "DateTime"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_PROXY, {10,1000,81,1,-1},
+ "Proxy" },
+ {PROTO_Z3950, CLASS_USERINFO,VAL_COOKIE, {10,1000,81,2,-1},
+ "Cookie" },
+ {PROTO_Z3950, CLASS_USERINFO,VAL_CLIENT_IP, {10,1000,81,3,-1},
+ "Client-IP" },
+ {PROTO_Z3950, CLASS_ELEMSPEC,VAL_ESPEC1, {11,1,-1},
+ "Espec-1"},
+ {PROTO_Z3950, CLASS_VARSET, VAL_VAR1, {12,1,-1},
+ "Variant-1"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_WAIS, {13,1,-1},
+ "WAIS-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_GILS, {13,2,-1},
+ "GILS-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_COLLECT1, {13,3,-1},
+ "Collections-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_GEO, {13,4,-1},
+ "Geo-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_CIMI1, {13,5,-1},
+ "CIMI-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_UPDATEES, {13,6,-1},
+ "Update ES"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_HOLDINGS, {13,7,-1},
+ "Holdings"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_ZTHES, {13,8,-1},
+ "Zthes"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_THESAURUS, {13,1000,81,1,-1},
+ "thesaurus-schema"},
+ {PROTO_Z3950, CLASS_SCHEMA, VAL_EXPLAIN, {13,1000,81,2,-1},
+ "Explain-schema"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_SETM, {14,1,-1},
+ "TagsetM"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_SETG, {14,2,-1},
+ "TagsetG"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_STAS, {14,3,-1},
+ "STAS-tagset"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_GILS, {14,4,-1},
+ "GILS-tagset"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_COLLECT1, {14,5,-1},
+ "Collections-tagset"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_CIMI1, {14,6,-1},
+ "CIMI-tagset"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_THESAURUS, {14,1000,81,1,-1},
+ "thesaurus-tagset"}, /* What is this Satan-spawn doing here? */
+ {PROTO_Z3950, CLASS_TAGSET, VAL_EXPLAIN, {14,1000,81,2,-1},
+ "Explain-tagset"},
+ {PROTO_Z3950, CLASS_TAGSET, VAL_ZTHES, {14,8,-1},
+ "Zthes-tagset"},
+ {PROTO_Z3950, CLASS_NEGOT, VAL_CHARNEG3, {15,3,-1},
+ "CharSetandLanguageNegotiation-3"},
+ {PROTO_Z3950, CLASS_NEGOT, VAL_ID_CHARSET, {15,1000,81,1,-1},
+ "ID-Charset" },
+ {PROTO_Z3950, CLASS_USERINFO,VAL_CQL, {16, 2, -1},
+ "CQL"},
+ {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS2, {1,0,10646,1,0,2,-1},
+ "UCS-2"},
+ {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS4, {1,0,10646,1,0,4,-1},
+ "UCS-4"},
+ {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF16, {1,0,10646,1,0,5,-1},
+ "UTF-16"},
+ {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF8, {1,0,10646,1,0,8,-1},
+ "UTF-8"},
+ {PROTO_Z3950, CLASS_USERINFO,VAL_OCLCUI, {10, 1000, 17, 1, -1},
+ "OCLC-userInfo"},
+ {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 }
+};
+
+/* OID utilities */
+
+void oid_oidcpy(int *t, int *s)
+{
+ while ((*(t++) = *(s++)) > -1);
+}
+
+void oid_oidcat(int *t, int *s)
+{
+ while (*t > -1)
+ t++;
+ while ((*(t++) = *(s++)) > -1);
+}
+
+int oid_oidcmp(int *o1, int *o2)
+{
+ while (*o1 == *o2 && *o1 > -1)
+ {
+ o1++;
+ o2++;
+ }
+ if (*o1 == *o2)
+ return 0;
+ else if (*o1 > *o2)
+ return 1;
+ else
+ return -1;
+}
+
+int oid_oidlen(int *o)
+{
+ int len = 0;
+
+ while (*(o++) >= 0)
+ len++;
+ return len;
+}
+
+
+static int match_prefix(int *look, int *prefix)
+{
+ int len;
+
+ for (len = 0; *look == *prefix; look++, prefix++, len++);
+ if (*prefix < 0) /* did we reach the end of the prefix? */
+ return len;
+ return 0;
+}
+
+void oid_transfer (struct oident *oidentp)
+{
+ while (*oidentp->oidsuffix >= 0)
+ {
+ oid_addent (oidentp->oidsuffix, oidentp->proto,
+ oidentp->oclass,
+ oidentp->desc, oidentp->value);
+ oidentp++;
+ }
+}
+
+void oid_init (void)
+{
+ if (oid_init_flag == 0)
+ {
+ /* oid_transfer is thread safe, so there's nothing wrong in having
+ two threads calling it simultaniously. On the other hand
+ no thread may exit oid_init before all OID's bave been
+ transferred - which is why checked is set after oid_transfer...
+ */
+ nmem_mutex_create (&oid_mutex);
+ nmem_mutex_enter (oid_mutex);
+ if (!oid_nmem)
+ oid_nmem = nmem_create ();
+ nmem_mutex_leave (oid_mutex);
+ oid_transfer (standard_oids);
+ oid_init_flag = 1;
+ }
+}
+
+void oid_exit (void)
+{
+ if (oid_init_flag)
+ {
+ oid_init_flag = 0;
+ nmem_mutex_destroy (&oid_mutex);
+ nmem_destroy (oid_nmem);
+ oid_nmem = 0;
+ }
+}
+
+static struct oident *oid_getentbyoid_x(int *o)
+{
+ enum oid_proto proto;
+ int prelen;
+ struct oident_list *ol;
+
+ /* determine protocol type */
+ if ((prelen = match_prefix(o, z3950_prefix)) != 0)
+ proto = PROTO_Z3950;
+ else if ((prelen = match_prefix(o, sr_prefix)) != 0)
+ proto = PROTO_SR;
+ else
+ proto = PROTO_GENERAL;
+ for (ol = oident_table; ol; ol = ol->next)
+ {
+ struct oident *p = &ol->oident;
+ if (p->proto == proto && !oid_oidcmp(o + prelen, p->oidsuffix))
+ return p;
+ if (p->proto == PROTO_GENERAL && !oid_oidcmp (o, p->oidsuffix))
+ return p;
+ }
+ return 0;
+}
+
+/*
+ * To query, fill out proto, class, and value of the ent parameter.
+ */
+int *oid_ent_to_oid(struct oident *ent, int *ret)
+{
+ struct oident_list *ol;
+
+ oid_init ();
+ for (ol = oident_table; ol; ol = ol->next)
+ {
+ struct oident *p = &ol->oident;
+ if (ent->value == p->value &&
+ (p->proto == PROTO_GENERAL || (ent->proto == p->proto &&
+ (ent->oclass == p->oclass || ent->oclass == CLASS_GENERAL))))
+ {
+ if (p->proto == PROTO_Z3950)
+ oid_oidcpy(ret, z3950_prefix);
+ else if (p->proto == PROTO_SR)
+ oid_oidcpy(ret, sr_prefix);
+ else
+ ret[0] = -1;
+ oid_oidcat(ret, p->oidsuffix);
+ ent->desc = p->desc;
+ return ret;
+ }
+ }
+ ret[0] = -1;
+ return 0;
+}
+
+/*
+ * To query, fill out proto, class, and value of the ent parameter.
+ */
+int *oid_getoidbyent(struct oident *ent)
+{
+ static int ret[OID_SIZE];
+
+ return oid_ent_to_oid (ent, ret);
+}
+
+struct oident *oid_addent (int *oid, enum oid_proto proto,
+ enum oid_class oclass,
+ const char *desc, int value)
+{
+ struct oident *oident = 0;
+
+ nmem_mutex_enter (oid_mutex);
+ if (!oident)
+ {
+ char desc_str[200];
+ struct oident_list *oident_list;
+ oident_list = (struct oident_list *)
+ nmem_malloc (oid_nmem, sizeof(*oident_list));
+ oident = &oident_list->oident;
+ oident->proto = proto;
+ oident->oclass = oclass;
+
+ if (!desc)
+ {
+ int i;
+
+ sprintf (desc_str, "%d", *oid);
+ for (i = 1; i < 12 && oid[i] >= 0; i++)
+ sprintf (desc_str+strlen(desc_str), ".%d", oid[i]);
+ desc = desc_str;
+ }
+ oident->desc = nmem_strdup (oid_nmem, desc);
+ if (value == VAL_DYNAMIC)
+ oident->value = (enum oid_value) (++oid_value_dynamic);
+ else
+ oident->value = (enum oid_value) value;
+ oid_oidcpy (oident->oidsuffix, oid);
+ oident_list->next = oident_table;
+ oident_table = oident_list;
+ }
+ nmem_mutex_leave (oid_mutex);
+ return oident;
+}
+
+struct oident *oid_getentbyoid(int *oid)
+{
+ struct oident *oident;
+
+ if (!oid)
+ return 0;
+ oid_init ();
+ oident = oid_getentbyoid_x (oid);
+ if (!oident)
+ oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL,
+ NULL, VAL_DYNAMIC);
+ return oident;
+}
+
+static oid_value oid_getval_raw(const char *name)
+{
+ int val = 0, i = 0, oid[OID_SIZE];
+ struct oident *oident;
+
+ while (isdigit (*name))
+ {
+ val = val*10 + (*name - '0');
+ name++;
+ if (*name == '.')
+ {
+ if (i < OID_SIZE-1)
+ oid[i++] = val;
+ val = 0;
+ name++;
+ }
+ }
+ oid[i] = val;
+ oid[i+1] = -1;
+ oident = oid_getentbyoid_x (oid);
+ if (!oident)
+ oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL, NULL,
+ VAL_DYNAMIC);
+ return oident->value;
+}
+
+oid_value oid_getvalbyname(const char *name)
+{
+ struct oident_list *ol;
+
+ oid_init ();
+ if (isdigit (*name))
+ return oid_getval_raw (name);
+ for (ol = oident_table; ol; ol = ol->next)
+ if (!yaz_matchstr(ol->oident.desc, name))
+ {
+ return ol->oident.value;
+ }
+ return VAL_NONE;
+}
+
+void oid_setprivateoids(oident *list)
+{
+ oid_transfer (list);
+}
+
+void oid_trav (void (*func)(struct oident *oidinfo, void *vp), void *vp)
+{
+ struct oident_list *ol;
+
+ oid_init ();
+ for (ol = oident_table; ol; ol = ol->next)
+ (*func)(&ol->oident, vp);
+}
+
+int *oid_name_to_oid(oid_class oclass, const char *name, int *oid) {
+ struct oident ent;
+
+ /* Translate syntax to oid_val */
+ oid_value value = oid_getvalbyname(name);
+
+ /* Build it into an oident */
+ ent.proto = PROTO_Z3950;
+ ent.oclass = oclass;
+ ent.value = value;
+
+ /* Translate to an array of int */
+ return oid_ent_to_oid(&ent, oid);
+}
+
+char *oid_to_dotstring(const int *oid, char *oidbuf) {
+ char tmpbuf[20];
+ int i;
+
+ oidbuf[0] = '\0';
+ for (i = 0; oid[i] != -1; i++) {
+ sprintf(tmpbuf, "%d", oid[i]);
+ if (i > 0) strcat(oidbuf, ".");
+ strcat(oidbuf, tmpbuf);
+ }
+
+ return oidbuf;
+}
+
+char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oidbuf) {
+ int oid[OID_SIZE];
+
+ (void) oid_name_to_oid(oclass, name, oid);
+ return oid_to_dotstring(oid, oidbuf);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: opacdisp.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <yaz/proto.h>
+
+static void opac_element_str(WRBUF wrbuf, int l, const char *elem,
+ const char *data)
+{
+ if (data)
+ {
+ while (--l >= 0)
+ wrbuf_puts(wrbuf, " ");
+ wrbuf_puts(wrbuf, "<");
+ wrbuf_puts(wrbuf, elem);
+ wrbuf_puts(wrbuf, ">");
+ wrbuf_xmlputs(wrbuf, data);
+ wrbuf_puts(wrbuf, "</");
+ wrbuf_puts(wrbuf, elem);
+ wrbuf_puts(wrbuf, ">\n");
+ }
+}
+
+static void opac_element_bool(WRBUF wrbuf, int l, const char *elem, int *data)
+{
+ if (data)
+ {
+ while (--l >= 0)
+ wrbuf_puts(wrbuf, " ");
+ wrbuf_puts(wrbuf, "<");
+ wrbuf_puts(wrbuf, elem);
+ if (*data)
+ wrbuf_puts(wrbuf, " value=\"1\"");
+ else
+ wrbuf_puts(wrbuf, " value=\"0\"");
+ wrbuf_puts(wrbuf, "/>\n");
+ }
+}
+
+void yaz_display_OPAC(WRBUF wrbuf, Z_OPACRecord *r, int flags)
+{
+ int i;
+ wrbuf_puts(wrbuf, "<holdings>\n");
+
+ for (i = 0; i < r->num_holdingsData; i++)
+ {
+ Z_HoldingsRecord *h = r->holdingsData[i];
+ wrbuf_puts(wrbuf, " <holding>\n");
+
+ if (h->which == Z_HoldingsRecord_marcHoldingsRecord)
+ {
+ wrbuf_puts (wrbuf, " <marc/>\n");
+ /* h->u.marcHoldingsRecord) */
+ }
+ else if (h->which == Z_HoldingsRecord_holdingsAndCirc)
+ {
+ int j;
+
+ Z_HoldingsAndCircData *d = h->u.holdingsAndCirc;
+
+ opac_element_str(wrbuf, 2, "typeOfRecord", d->typeOfRecord);
+ opac_element_str(wrbuf, 2, "encodingLevel", d->encodingLevel);
+ opac_element_str(wrbuf, 2, "format", d->format);
+ opac_element_str(wrbuf, 2, "receiptAcqStatus", d->receiptAcqStatus);
+ opac_element_str (wrbuf, 2, "generalRetention", d->generalRetention);
+ opac_element_str (wrbuf, 2, "completeness", d->completeness);
+ opac_element_str (wrbuf, 2, "dateOfReport", d->dateOfReport);
+ opac_element_str (wrbuf, 2, "nucCode", d->nucCode);
+ opac_element_str (wrbuf, 2, "localLocation", d->localLocation);
+ opac_element_str (wrbuf, 2, "shelvingLocation", d->shelvingLocation);
+ opac_element_str (wrbuf, 2, "callNumber", d->callNumber);
+ opac_element_str (wrbuf, 2, "copyNumber", d->copyNumber);
+ opac_element_str (wrbuf, 2, "publicNote", d->publicNote);
+ opac_element_str (wrbuf, 2, "reproductionNote", d->reproductionNote);
+ opac_element_str (wrbuf, 2, "termsUseRepro", d->termsUseRepro);
+ opac_element_str (wrbuf, 2, "enumAndChron", d->enumAndChron);
+ if (d->num_volumes)
+ {
+ wrbuf_puts (wrbuf, " <volumes>\n");
+ for (j = 0; j<d->num_volumes; j++)
+ {
+ wrbuf_puts (wrbuf, " <volume>\n");
+ opac_element_str (wrbuf, 4, "enumeration",
+ d->volumes[j]->enumeration);
+ opac_element_str (wrbuf, 4, "chronology",
+ d->volumes[j]->chronology);
+ opac_element_str (wrbuf, 4, "enumAndChron",
+ d->volumes[j]->enumAndChron);
+ wrbuf_puts (wrbuf, " </volume>\n");
+ }
+ wrbuf_puts (wrbuf, " </volumes>\n");
+ }
+ if (d->num_circulationData)
+ {
+ wrbuf_puts (wrbuf, " <circulations>\n");
+ for (j = 0; j<d->num_circulationData; j++)
+ {
+ wrbuf_puts (wrbuf," <circulation>\n");
+ opac_element_bool (wrbuf, 4, "availableNow",
+ d->circulationData[j]->availableNow);
+ opac_element_str (wrbuf, 4, "availabiltyDate",
+ d->circulationData[j]->availablityDate);
+ opac_element_str (wrbuf, 4, "availableThru",
+ d->circulationData[j]->availableThru);
+ opac_element_str (wrbuf, 4, "restrictions",
+ d->circulationData[j]->restrictions);
+ opac_element_str (wrbuf, 4, "itemId",
+ d->circulationData[j]->itemId);
+ opac_element_bool (wrbuf, 4, "renewable",
+ d->circulationData[j]->renewable);
+ opac_element_bool (wrbuf, 4, "onHold",
+ d->circulationData[j]->onHold);
+ opac_element_str (wrbuf, 4, "enumAndChron",
+ d->circulationData[j]->enumAndChron);
+ opac_element_str (wrbuf, 4, "midspine",
+ d->circulationData[j]->midspine);
+ opac_element_str (wrbuf, 4, "temporaryLocation",
+ d->circulationData[j]->temporaryLocation);
+ wrbuf_puts (wrbuf, " </circulation>\n");
+ }
+ wrbuf_puts (wrbuf, " </circulations>\n");
+ }
+ }
+ wrbuf_puts(wrbuf, " </holding>\n");
+ }
+ wrbuf_puts(wrbuf, "</holdings>\n");
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: options.c,v $
+ * Revision 1.1 2003-10-27 12:21:34 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.8 2000/02/29 13:44:55 adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.7 1999/11/30 13:47:12 adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6 1997/09/01 08:54:13 adam
+ * New windows NT/95 port using MSV5.0. Made prefix query handling
+ * thread safe. The function options ignores empty arguments when met.
+ *
+ * Revision 1.5 1995/12/06 13:00:19 adam
+ * Minus alone not treated as an option.
+ *
+ * Revision 1.4 1995/09/29 17:12:35 quinn
+ * Smallish
+ *
+ * Revision 1.3 1995/09/27 15:03:03 quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2 1995/05/16 08:51:13 quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1 1995/03/27 08:35:18 quinn
+ * Created util library
+ * Added memory debugging module. Imported options-manager
+ *
+ * Revision 1.2 1994/10/04 17:47:10 adam
+ * Function options now returns arg with error option.
+ *
+ * Revision 1.1 1994/08/16 15:57:22 adam
+ * The first utility modules.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <yaz/options.h>
+
+static int arg_no = 1;
+static int arg_off = 0;
+
+int options (const char *desc, char **argv, int argc, char **arg)
+{
+ int ch, i = 0;
+
+ if (arg_no >= argc)
+ return -2;
+ if (arg_off == 0)
+ {
+ while (argv[arg_no][0] == '\0')
+ {
+ arg_no++;
+ if (arg_no >= argc)
+ return -2;
+ }
+ if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0')
+ {
+ *arg = argv[arg_no++];
+ return 0;
+ }
+ arg_off++;
+ }
+ ch = argv[arg_no][arg_off++];
+ while (desc[i])
+ {
+ int desc_char = desc[i++];
+ int type = 0;
+ if (desc[i] == ':')
+ { /* string argument */
+ type = desc[i++];
+ }
+ if (desc_char == ch)
+ { /* option with argument */
+ if (type)
+ {
+ if (argv[arg_no][arg_off])
+ {
+ *arg = argv[arg_no]+arg_off;
+ arg_no++;
+ arg_off = 0;
+ }
+ else
+ {
+ arg_no++;
+ arg_off = 0;
+ if (arg_no < argc)
+ *arg = argv[arg_no++];
+ else
+ *arg = "";
+ }
+ }
+ else /* option with no argument */
+ {
+ if (argv[arg_no][arg_off])
+ arg_off++;
+ else
+ {
+ arg_off = 0;
+ arg_no++;
+ }
+ }
+ return ch;
+ }
+ }
+ *arg = argv[arg_no]+arg_off-1;
+ arg_no = arg_no + 1;
+ arg_off = 0;
+ return -1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1999-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: otherinfo.c,v 1.1 2003-10-27 12:21:34 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <yaz/otherinfo.h>
+
+void yaz_oi_APDU(Z_APDU *apdu, Z_OtherInformation ***oip)
+{
+ switch (apdu->which)
+ {
+ case Z_APDU_initRequest:
+ *oip = &apdu->u.initRequest->otherInfo;
+ break;
+ case Z_APDU_searchRequest:
+ *oip = &apdu->u.searchRequest->otherInfo;
+ break;
+ case Z_APDU_presentRequest:
+ *oip = &apdu->u.presentRequest->otherInfo;
+ break;
+ case Z_APDU_sortRequest:
+ *oip = &apdu->u.sortRequest->otherInfo;
+ break;
+ case Z_APDU_scanRequest:
+ *oip = &apdu->u.scanRequest->otherInfo;
+ break;
+ case Z_APDU_extendedServicesRequest:
+ *oip = &apdu->u.extendedServicesRequest->otherInfo;
+ break;
+ case Z_APDU_deleteResultSetRequest:
+ *oip = &apdu->u.deleteResultSetRequest->otherInfo;
+ break;
+ case Z_APDU_initResponse:
+ *oip = &apdu->u.initResponse->otherInfo;
+ break;
+ case Z_APDU_searchResponse:
+ *oip = &apdu->u.searchResponse->otherInfo;
+ break;
+ case Z_APDU_presentResponse:
+ *oip = &apdu->u.presentResponse->otherInfo;
+ break;
+ case Z_APDU_sortResponse:
+ *oip = &apdu->u.sortResponse->otherInfo;
+ break;
+ case Z_APDU_scanResponse:
+ *oip = &apdu->u.scanResponse->otherInfo;
+ break;
+ case Z_APDU_extendedServicesResponse:
+ *oip = &apdu->u.extendedServicesResponse->otherInfo;
+ break;
+ case Z_APDU_deleteResultSetResponse:
+ *oip = &apdu->u.deleteResultSetResponse->otherInfo;
+ break;
+ case Z_APDU_duplicateDetectionRequest:
+ *oip = &apdu->u.duplicateDetectionRequest->otherInfo;
+ break;
+ case Z_APDU_duplicateDetectionResponse:
+ *oip = &apdu->u.duplicateDetectionResponse->otherInfo;
+ break;
+ default:
+ *oip = 0;
+ break;
+ }
+}
+
+Z_OtherInformationUnit *yaz_oi_update (
+ Z_OtherInformation **otherInformationP, ODR odr,
+ int *oid, int categoryValue, int delete_flag)
+{
+ int i;
+ Z_OtherInformation *otherInformation;
+
+ if (!otherInformationP)
+ return 0;
+ otherInformation = *otherInformationP;
+ if (!otherInformation)
+ {
+ if (!odr)
+ return 0;
+ otherInformation = *otherInformationP = (Z_OtherInformation *)
+ odr_malloc (odr, sizeof(*otherInformation));
+ otherInformation->num_elements = 0;
+ otherInformation->list = 0;
+ }
+ for (i = 0; i<otherInformation->num_elements; i++)
+ {
+ if (!oid)
+ {
+ if (!otherInformation->list[i]->category)
+ return otherInformation->list[i];
+ }
+ else
+ {
+ if (otherInformation->list[i]->category &&
+ categoryValue ==
+ *otherInformation->list[i]->category->categoryValue &&
+ !oid_oidcmp (oid, otherInformation->list[i]->category->
+ categoryTypeId))
+ {
+ Z_OtherInformationUnit *this_list = otherInformation->list[i];
+
+ if (delete_flag)
+ {
+ (otherInformation->num_elements)--;
+ while (i < otherInformation->num_elements)
+ {
+ otherInformation->list[i] =
+ otherInformation->list[i+1];
+ i++;
+ }
+ }
+ return this_list;
+ }
+ }
+ }
+ if (!odr)
+ return 0;
+ else
+ {
+ Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**)
+ odr_malloc(odr, (otherInformation->num_elements+1) *
+ sizeof(*newlist));
+ for (i = 0; i<otherInformation->num_elements; i++)
+ newlist[i] = otherInformation->list[i];
+ otherInformation->list = newlist;
+
+ otherInformation->list[i] = (Z_OtherInformationUnit*)
+ odr_malloc (odr, sizeof(Z_OtherInformationUnit));
+ if (oid)
+ {
+ otherInformation->list[i]->category = (Z_InfoCategory*)
+ odr_malloc (odr, sizeof(Z_InfoCategory));
+ otherInformation->list[i]->category->categoryTypeId = (int*)
+ odr_oiddup (odr, oid);
+ otherInformation->list[i]->category->categoryValue = (int*)
+ odr_malloc (odr, sizeof(int));
+ *otherInformation->list[i]->category->categoryValue =
+ categoryValue;
+ }
+ else
+ otherInformation->list[i]->category = 0;
+ otherInformation->list[i]->which = Z_OtherInfo_characterInfo;
+ otherInformation->list[i]->information.characterInfo = 0;
+
+ otherInformation->num_elements = i+1;
+ return otherInformation->list[i];
+ }
+}
+
+void yaz_oi_set_string_oid (
+ Z_OtherInformation **otherInformation, ODR odr,
+ int *oid, int categoryValue,
+ const char *str)
+{
+ Z_OtherInformationUnit *oi =
+ yaz_oi_update(otherInformation, odr, oid, categoryValue, 0);
+ if (!oi)
+ return;
+ oi->which = Z_OtherInfo_characterInfo;
+ oi->information.characterInfo = odr_strdup (odr, str);
+}
+
+void yaz_oi_set_string_oidval (
+ Z_OtherInformation **otherInformation, ODR odr,
+ int oidval, int categoryValue,
+ const char *str)
+{
+ int oid[OID_SIZE];
+ struct oident ent;
+ ent.proto = PROTO_Z3950;
+ ent.oclass = CLASS_USERINFO;
+ ent.value = (oid_value) oidval;
+ if (!oid_ent_to_oid (&ent, oid))
+ return ;
+ yaz_oi_set_string_oid(otherInformation,
+ odr, oid, categoryValue, str);
+}
+
+char *yaz_oi_get_string_oid (
+ Z_OtherInformation **otherInformation,
+ int *oid, int categoryValue, int delete_flag)
+{
+ Z_OtherInformationUnit *oi;
+
+ if ((oi = yaz_oi_update(otherInformation, 0, oid, 1, delete_flag)) &&
+ oi->which == Z_OtherInfo_characterInfo)
+ return oi->information.characterInfo;
+ return 0;
+}
+
+char *yaz_oi_get_string_oidval(Z_OtherInformation **otherInformation,
+ int oidval, int categoryValue, int delete_flag)
+{
+ int oid[OID_SIZE];
+ struct oident ent;
+ ent.proto = PROTO_Z3950;
+ ent.oclass = CLASS_USERINFO;
+ ent.value = (oid_value) oidval;
+
+ if (!oid_ent_to_oid (&ent, oid))
+ return 0;
+ return yaz_oi_get_string_oid (otherInformation, oid, categoryValue,
+ delete_flag);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: pquery.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <yaz/proto.h>
+#include <yaz/oid.h>
+#include <yaz/pquery.h>
+
+static oid_value p_query_dfset = VAL_NONE;
+
+struct yaz_pqf_parser {
+ const char *query_buf;
+ const char *query_ptr;
+ const char *lex_buf;
+ size_t lex_len;
+ int query_look;
+ char *left_sep;
+ char *right_sep;
+ int escape_char;
+ int term_type;
+ int external_type;
+ int error;
+};
+
+static Z_RPNStructure *rpn_structure (struct yaz_pqf_parser *li, ODR o,
+ oid_proto,
+ int num_attr, int max_attr,
+ int *attr_list, char **attr_clist,
+ oid_value *attr_set);
+
+static enum oid_value query_oid_getvalbyname (struct yaz_pqf_parser *li)
+{
+ enum oid_value value;
+ char buf[32];
+
+ if (li->lex_len > 31)
+ return VAL_NONE;
+ memcpy (buf, li->lex_buf, li->lex_len);
+ buf[li->lex_len] = '\0';
+ value = oid_getvalbyname (buf);
+ return value;
+}
+
+static int compare_term (struct yaz_pqf_parser *li, const char *src,
+ size_t off)
+{
+ size_t len=strlen(src);
+
+ if (li->lex_len == len+off && !memcmp (li->lex_buf+off, src, len-off))
+ return 1;
+ return 0;
+}
+
+static int query_token (struct yaz_pqf_parser *li)
+{
+ int sep_char = ' ';
+ const char *sep_match;
+ const char **qptr = &li->query_ptr;
+
+ while (**qptr == ' ')
+ (*qptr)++;
+ if (**qptr == '\0')
+ return 0;
+ li->lex_len = 0;
+ if ((sep_match = strchr (li->left_sep, **qptr)))
+ {
+ sep_char = li->right_sep[sep_match - li->left_sep];
+ ++(*qptr);
+ }
+ li->lex_buf = *qptr;
+
+ if (**qptr == li->escape_char && isdigit ((*qptr)[1]))
+ {
+ ++(li->lex_len);
+ ++(*qptr);
+ return 'l';
+ }
+ while (**qptr && **qptr != sep_char)
+ {
+ if (**qptr == '\\')
+ {
+ ++(li->lex_len);
+ ++(*qptr);
+ }
+ ++(li->lex_len);
+ ++(*qptr);
+ }
+ if (**qptr)
+ ++(*qptr);
+ if (sep_char == ' ' &&
+ li->lex_len >= 1 && li->lex_buf[0] == li->escape_char)
+ {
+ if (compare_term (li, "and", 1))
+ return 'a';
+ if (compare_term (li, "or", 1))
+ return 'o';
+ if (compare_term (li, "not", 1))
+ return 'n';
+ if (compare_term (li, "attr", 1))
+ return 'l';
+ if (compare_term (li, "set", 1))
+ return 's';
+ if (compare_term (li, "attrset", 1))
+ return 'r';
+ if (compare_term (li, "prox", 1))
+ return 'p';
+ if (compare_term (li, "term", 1))
+ return 'y';
+ }
+ return 't';
+}
+
+static int lex (struct yaz_pqf_parser *li)
+{
+ return li->query_look = query_token (li);
+}
+
+static int escape_string(char *out_buf, const char *in, int len)
+{
+
+ char *out = out_buf;
+ while (--len >= 0)
+ if (*in == '\\' && len > 0)
+ {
+ --len;
+ switch (*++in)
+ {
+ case 't':
+ *out++ = '\t';
+ break;
+ case 'n':
+ *out++ = '\n';
+ break;
+ case 'r':
+ *out++ = '\r';
+ break;
+ case 'f':
+ *out++ = '\f';
+ break;
+ case 'x':
+ if (len > 1)
+ {
+ char s[4];
+ int n = 0;
+ s[0] = *++in;
+ s[1] = *++in;
+ s[2] = '\0';
+ len = len - 2;
+ sscanf (s, "%x", &n);
+ *out++ = n;
+ }
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ if (len > 1)
+ {
+ char s[4];
+ int n = 0;
+ s[0] = *in;
+ s[1] = *++in;
+ s[2] = *++in;
+ s[3] = '\0';
+ len = len - 2;
+ sscanf (s, "%o", &n);
+ *out++ = n;
+ }
+ break;
+ default:
+ *out++ = *in;
+ break;
+ }
+ in++;
+ }
+ else
+ *out++ = *in++;
+ return out - out_buf;
+}
+
+static int p_query_parse_attr(struct yaz_pqf_parser *li, ODR o,
+ int num_attr, int *attr_list,
+ char **attr_clist, oid_value *attr_set)
+{
+ const char *cp;
+ if (!(cp = strchr (li->lex_buf, '=')) ||
+ (size_t) (cp-li->lex_buf) > li->lex_len)
+ {
+ attr_set[num_attr] = query_oid_getvalbyname (li);
+ if (attr_set[num_attr] == VAL_NONE)
+ {
+ li->error = YAZ_PQF_ERROR_ATTSET;
+ return 0;
+ }
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ if (!(cp = strchr (li->lex_buf, '=')))
+ {
+ li->error = YAZ_PQF_ERROR_BADATTR;
+ return 0;
+ }
+ }
+ else
+ {
+ if (num_attr > 0)
+ attr_set[num_attr] = attr_set[num_attr-1];
+ else
+ attr_set[num_attr] = VAL_NONE;
+ }
+ attr_list[2*num_attr] = atoi(li->lex_buf);
+ cp++;
+ if (*cp >= '0' && *cp <= '9')
+ {
+ attr_list[2*num_attr+1] = atoi (cp);
+ attr_clist[num_attr] = 0;
+ }
+ else
+ {
+ int len = li->lex_len - (cp - li->lex_buf);
+ attr_list[2*num_attr+1] = 0;
+ attr_clist[num_attr] = (char *) odr_malloc (o, len+1);
+ len = escape_string(attr_clist[num_attr], cp, len);
+ attr_clist[num_attr][len] = '\0';
+ }
+ return 1;
+}
+
+static Z_AttributesPlusTerm *rpn_term (struct yaz_pqf_parser *li, ODR o,
+ oid_proto proto,
+ int num_attr, int *attr_list,
+ char **attr_clist, oid_value *attr_set)
+{
+ Z_AttributesPlusTerm *zapt;
+ Odr_oct *term_octet;
+ Z_Term *term;
+ Z_AttributeElement **elements;
+
+ zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
+ term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
+ term = (Z_Term *)odr_malloc (o, sizeof(*term));
+
+ if (!num_attr)
+ elements = (Z_AttributeElement**)odr_nullval();
+ else
+ {
+ int i, k = 0;
+ int *attr_tmp;
+
+ elements = (Z_AttributeElement**)
+ odr_malloc (o, num_attr * sizeof(*elements));
+
+ attr_tmp = (int *)odr_malloc (o, num_attr * 2 * sizeof(int));
+ memcpy (attr_tmp, attr_list, num_attr * 2 * sizeof(int));
+ for (i = num_attr; --i >= 0; )
+ {
+ int j;
+ for (j = i+1; j<num_attr; j++)
+ if (attr_tmp[2*j] == attr_tmp[2*i])
+ break;
+ if (j < num_attr)
+ continue;
+ elements[k] =
+ (Z_AttributeElement*)odr_malloc (o,sizeof(**elements));
+ elements[k]->attributeType = &attr_tmp[2*i];
+ elements[k]->attributeSet =
+ yaz_oidval_to_z3950oid(o, CLASS_ATTSET, attr_set[i]);
+
+ if (attr_clist[i])
+ {
+ elements[k]->which = Z_AttributeValue_complex;
+ elements[k]->value.complex = (Z_ComplexAttribute *)
+ odr_malloc (o, sizeof(Z_ComplexAttribute));
+ elements[k]->value.complex->num_list = 1;
+ elements[k]->value.complex->list =
+ (Z_StringOrNumeric **)
+ odr_malloc (o, 1 * sizeof(Z_StringOrNumeric *));
+ elements[k]->value.complex->list[0] =
+ (Z_StringOrNumeric *)
+ odr_malloc (o, sizeof(Z_StringOrNumeric));
+ elements[k]->value.complex->list[0]->which =
+ Z_StringOrNumeric_string;
+ elements[k]->value.complex->list[0]->u.string =
+ attr_clist[i];
+ elements[k]->value.complex->semanticAction = (int **)
+ odr_nullval();
+ elements[k]->value.complex->num_semanticAction = 0;
+ }
+ else
+ {
+ elements[k]->which = Z_AttributeValue_numeric;
+ elements[k]->value.numeric = &attr_tmp[2*i+1];
+ }
+ k++;
+ }
+ num_attr = k;
+ }
+ zapt->attributes = (Z_AttributeList *)
+ odr_malloc (o, sizeof(*zapt->attributes));
+ zapt->attributes->num_attributes = num_attr;
+ zapt->attributes->attributes = elements;
+
+ zapt->term = term;
+
+ term_octet->buf = (unsigned char *)odr_malloc (o, 1 + li->lex_len);
+ term_octet->size = term_octet->len =
+ escape_string ((char *) (term_octet->buf), li->lex_buf, li->lex_len);
+ term_octet->buf[term_octet->size] = 0; /* null terminate */
+
+ switch (li->term_type)
+ {
+ case Z_Term_general:
+ term->which = Z_Term_general;
+ term->u.general = term_octet;
+ break;
+ case Z_Term_characterString:
+ term->which = Z_Term_characterString;
+ term->u.characterString = (char*) term_octet->buf;
+ /* null terminated above */
+ break;
+ case Z_Term_numeric:
+ term->which = Z_Term_numeric;
+ term->u.numeric = odr_intdup (o, atoi((char*) (term_octet->buf)));
+ break;
+ case Z_Term_null:
+ term->which = Z_Term_null;
+ term->u.null = odr_nullval();
+ break;
+ case Z_Term_external:
+ term->which = Z_Term_external;
+ term->u.external = 0;
+ break;
+ default:
+ term->which = Z_Term_null;
+ term->u.null = odr_nullval();
+ break;
+ }
+ return zapt;
+}
+
+static Z_Operand *rpn_simple (struct yaz_pqf_parser *li, ODR o, oid_proto proto,
+ int num_attr, int *attr_list, char **attr_clist,
+ oid_value *attr_set)
+{
+ Z_Operand *zo;
+
+ zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
+ switch (li->query_look)
+ {
+ case 't':
+ zo->which = Z_Operand_APT;
+ if (!(zo->u.attributesPlusTerm =
+ rpn_term (li, o, proto, num_attr, attr_list, attr_clist,
+ attr_set)))
+ return 0;
+ lex (li);
+ break;
+ case 's':
+ lex (li);
+ if (!li->query_look)
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ zo->which = Z_Operand_resultSetId;
+ zo->u.resultSetId = (char *)odr_malloc (o, li->lex_len+1);
+ memcpy (zo->u.resultSetId, li->lex_buf, li->lex_len);
+ zo->u.resultSetId[li->lex_len] = '\0';
+ lex (li);
+ break;
+ default:
+ /* we're only called if one of the above types are seens so
+ this shouldn't happen */
+ li->error = YAZ_PQF_ERROR_INTERNAL;
+ return 0;
+ }
+ return zo;
+}
+
+static Z_ProximityOperator *rpn_proximity (struct yaz_pqf_parser *li, ODR o)
+{
+ Z_ProximityOperator *p = (Z_ProximityOperator *)odr_malloc (o, sizeof(*p));
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ if (*li->lex_buf == '1')
+ {
+ p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
+ *p->exclusion = 1;
+ }
+ else if (*li->lex_buf == '0')
+ {
+ p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
+ *p->exclusion = 0;
+ }
+ else
+ p->exclusion = NULL;
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ p->distance = (int *)odr_malloc (o, sizeof(*p->distance));
+ *p->distance = atoi (li->lex_buf);
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ p->ordered = (int *)odr_malloc (o, sizeof(*p->ordered));
+ *p->ordered = atoi (li->lex_buf);
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ p->relationType = (int *)odr_malloc (o, sizeof(*p->relationType));
+ *p->relationType = atoi (li->lex_buf);
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ if (*li->lex_buf == 'k')
+ p->which = 0;
+ else if (*li->lex_buf == 'p')
+ p->which = 1;
+ else
+ p->which = atoi (li->lex_buf);
+
+ if (!lex (li))
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return NULL;
+ }
+ p->which = Z_ProximityOperator_known;
+ p->u.known = (int *)odr_malloc (o, sizeof(*p->u.known));
+ *p->u.known = atoi (li->lex_buf);
+ return p;
+}
+
+static Z_Complex *rpn_complex (struct yaz_pqf_parser *li, ODR o, oid_proto proto,
+ int num_attr, int max_attr,
+ int *attr_list, char **attr_clist,
+ oid_value *attr_set)
+{
+ Z_Complex *zc;
+ Z_Operator *zo;
+
+ zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
+ zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
+ zc->roperator = zo;
+ switch (li->query_look)
+ {
+ case 'a':
+ zo->which = Z_Operator_and;
+ zo->u.and_not = odr_nullval();
+ break;
+ case 'o':
+ zo->which = Z_Operator_or;
+ zo->u.and_not = odr_nullval();
+ break;
+ case 'n':
+ zo->which = Z_Operator_and_not;
+ zo->u.and_not = odr_nullval();
+ break;
+ case 'p':
+ zo->which = Z_Operator_prox;
+ zo->u.prox = rpn_proximity (li, o);
+ if (!zo->u.prox)
+ return NULL;
+ break;
+ default:
+ /* we're only called if one of the above types are seens so
+ this shouldn't happen */
+ li->error = YAZ_PQF_ERROR_INTERNAL;
+ return NULL;
+ }
+ lex (li);
+ if (!(zc->s1 =
+ rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+ attr_clist, attr_set)))
+ return NULL;
+ if (!(zc->s2 =
+ rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+ attr_clist, attr_set)))
+ return NULL;
+ return zc;
+}
+
+static void rpn_term_type (struct yaz_pqf_parser *li, ODR o)
+{
+ if (!li->query_look)
+ return ;
+ if (compare_term (li, "general", 0))
+ li->term_type = Z_Term_general;
+ else if (compare_term (li, "numeric", 0))
+ li->term_type = Z_Term_numeric;
+ else if (compare_term (li, "string", 0))
+ li->term_type = Z_Term_characterString;
+ else if (compare_term (li, "oid", 0))
+ li->term_type = Z_Term_oid;
+ else if (compare_term (li, "datetime", 0))
+ li->term_type = Z_Term_dateTime;
+ else if (compare_term (li, "null", 0))
+ li->term_type = Z_Term_null;
+ else if (compare_term(li, "range", 0))
+ {
+ /* prepare for external: range search .. */
+ li->term_type = Z_Term_external;
+ li->external_type = VAL_MULTISRCH2;
+ }
+ lex (li);
+}
+
+static Z_RPNStructure *rpn_structure (struct yaz_pqf_parser *li, ODR o,
+ oid_proto proto,
+ int num_attr, int max_attr,
+ int *attr_list,
+ char **attr_clist,
+ oid_value *attr_set)
+{
+ Z_RPNStructure *sz;
+
+ sz = (Z_RPNStructure *)odr_malloc (o, sizeof(*sz));
+ switch (li->query_look)
+ {
+ case 'a':
+ case 'o':
+ case 'n':
+ case 'p':
+ sz->which = Z_RPNStructure_complex;
+ if (!(sz->u.complex =
+ rpn_complex (li, o, proto, num_attr, max_attr, attr_list,
+ attr_clist, attr_set)))
+ return NULL;
+ break;
+ case 't':
+ case 's':
+ sz->which = Z_RPNStructure_simple;
+ if (!(sz->u.simple =
+ rpn_simple (li, o, proto, num_attr, attr_list,
+ attr_clist, attr_set)))
+ return NULL;
+ break;
+ case 'l':
+ lex (li);
+ if (!li->query_look)
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ if (num_attr >= max_attr)
+ {
+ li->error = YAZ_PQF_ERROR_TOOMANY;
+ return 0;
+ }
+ if (!p_query_parse_attr(li, o, num_attr, attr_list,
+ attr_clist, attr_set))
+ return 0;
+ num_attr++;
+ lex (li);
+ return
+ rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+ attr_clist, attr_set);
+ case 'y':
+ lex (li);
+ rpn_term_type (li, o);
+ return
+ rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+ attr_clist, attr_set);
+ case 0: /* operator/operand expected! */
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ return sz;
+}
+
+Z_RPNQuery *p_query_rpn_mk (ODR o, struct yaz_pqf_parser *li, oid_proto proto,
+ const char *qbuf)
+{
+ Z_RPNQuery *zq;
+ int attr_array[1024];
+ char *attr_clist[512];
+ oid_value attr_set[512];
+ oid_value topSet = VAL_NONE;
+
+ zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
+ lex (li);
+ if (li->query_look == 'r')
+ {
+ lex (li);
+ topSet = query_oid_getvalbyname (li);
+ if (topSet == VAL_NONE)
+ {
+ li->error = YAZ_PQF_ERROR_ATTSET;
+ return NULL;
+ }
+
+ lex (li);
+ }
+ if (topSet == VAL_NONE)
+ topSet = p_query_dfset;
+ if (topSet == VAL_NONE)
+ topSet = VAL_BIB1;
+
+ zq->attributeSetId = yaz_oidval_to_z3950oid(o, CLASS_ATTSET, topSet);
+
+ if (!zq->attributeSetId)
+ {
+ li->error = YAZ_PQF_ERROR_ATTSET;
+ return 0;
+ }
+
+ if (!(zq->RPNStructure = rpn_structure (li, o, proto, 0, 512,
+ attr_array, attr_clist, attr_set)))
+ return 0;
+ if (li->query_look)
+ {
+ li->error = YAZ_PQF_ERROR_EXTRA;
+ return 0;
+ }
+ return zq;
+}
+
+Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto,
+ const char *qbuf)
+{
+ struct yaz_pqf_parser li;
+
+ li.error = 0;
+ li.left_sep = "{\"";
+ li.right_sep = "}\"";
+ li.escape_char = '@';
+ li.term_type = Z_Term_general;
+ li.query_buf = li.query_ptr = qbuf;
+ li.lex_buf = 0;
+ return p_query_rpn_mk (o, &li, proto, qbuf);
+}
+
+
+Z_AttributesPlusTerm *p_query_scan_mk (struct yaz_pqf_parser *li,
+ ODR o, oid_proto proto,
+ Odr_oid **attributeSetP,
+ const char *qbuf)
+{
+ int attr_list[1024];
+ char *attr_clist[512];
+ oid_value attr_set[512];
+ int num_attr = 0;
+ int max_attr = 512;
+ oid_value topSet = VAL_NONE;
+ Z_AttributesPlusTerm *apt;
+
+ lex (li);
+ if (li->query_look == 'r')
+ {
+ lex (li);
+ topSet = query_oid_getvalbyname (li);
+
+ lex (li);
+ }
+ if (topSet == VAL_NONE)
+ topSet = p_query_dfset;
+ if (topSet == VAL_NONE)
+ topSet = VAL_BIB1;
+
+ *attributeSetP = yaz_oidval_to_z3950oid (o, CLASS_ATTSET, topSet);
+
+ while (1)
+ {
+ if (li->query_look == 'l')
+ {
+ lex (li);
+ if (!li->query_look)
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ if (num_attr >= max_attr)
+ {
+ li->error = YAZ_PQF_ERROR_TOOMANY;
+ return 0;
+ }
+ if (!p_query_parse_attr(li, o, num_attr, attr_list,
+ attr_clist, attr_set))
+ return 0;
+ num_attr++;
+ lex (li);
+ }
+ else if (li->query_look == 'y')
+ {
+ lex (li);
+ rpn_term_type (li, o);
+ }
+ else
+ break;
+ }
+ if (!li->query_look)
+ {
+ li->error = YAZ_PQF_ERROR_MISSING;
+ return 0;
+ }
+ apt = rpn_term (li, o, proto, num_attr, attr_list, attr_clist, attr_set);
+
+ lex (li);
+
+ if (li->query_look != 0)
+ {
+ li->error = YAZ_PQF_ERROR_EXTRA;
+ return 0;
+ }
+ return apt;
+}
+
+Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+ Odr_oid **attributeSetP,
+ const char *qbuf)
+{
+ struct yaz_pqf_parser li;
+
+ li.error = 0;
+ li.left_sep = "{\"";
+ li.right_sep = "}\"";
+ li.escape_char = '@';
+ li.term_type = Z_Term_general;
+ li.query_buf = li.query_ptr = qbuf;
+ li.lex_buf = 0;
+
+ return p_query_scan_mk (&li, o, proto, attributeSetP, qbuf);
+}
+
+int p_query_attset (const char *arg)
+{
+ p_query_dfset = oid_getvalbyname (arg);
+ return (p_query_dfset == VAL_NONE) ? -1 : 0;
+}
+
+YAZ_PQF_Parser yaz_pqf_create (void)
+{
+ YAZ_PQF_Parser p = (YAZ_PQF_Parser) xmalloc (sizeof(*p));
+
+ p->error = 0;
+ p->left_sep = "{\"";
+ p->right_sep = "}\"";
+ p->escape_char = '@';
+ p->term_type = Z_Term_general;
+
+ return p;
+}
+
+void yaz_pqf_destroy (YAZ_PQF_Parser p)
+{
+ xfree (p);
+}
+
+Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf)
+{
+ if (!p)
+ return 0;
+ p->query_buf = p->query_ptr = qbuf;
+ p->lex_buf = 0;
+ return p_query_rpn_mk (o, p, PROTO_Z3950, qbuf);
+}
+
+Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o,
+ Odr_oid **attributeSetP,
+ const char *qbuf)
+{
+ if (!p)
+ return 0;
+ p->query_buf = p->query_ptr = qbuf;
+ p->lex_buf = 0;
+ return p_query_scan_mk (p, o, PROTO_Z3950, attributeSetP, qbuf);
+}
+
+int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off)
+{
+ switch (p->error)
+ {
+ case YAZ_PQF_ERROR_NONE:
+ *msg = "no error"; break;
+ case YAZ_PQF_ERROR_EXTRA:
+ *msg = "extra token"; break;
+ case YAZ_PQF_ERROR_MISSING:
+ *msg = "missing token"; break;
+ case YAZ_PQF_ERROR_ATTSET:
+ *msg = "unknown attribute set"; break;
+ case YAZ_PQF_ERROR_TOOMANY:
+ *msg = "too many attributes"; break;
+ case YAZ_PQF_ERROR_BADATTR:
+ *msg = "bad attribute specification"; break;
+ case YAZ_PQF_ERROR_INTERNAL:
+ *msg = "internal error"; break;
+ default:
+ *msg = "unknown error"; break;
+ }
+ *off = p->query_ptr - p->query_buf;
+ return p->error;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: prt-ext.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <yaz/proto.h>
+
+/*
+ * The table below should be moved to the ODR structure itself and
+ * be an image of the association context: To help
+ * map indirect references when they show up.
+ */
+static Z_ext_typeent type_table[] =
+{
+ {VAL_SUTRS, Z_External_sutrs, (Odr_fun) z_SUTRS},
+ {VAL_EXPLAIN, Z_External_explainRecord, (Odr_fun)z_ExplainRecord},
+ {VAL_RESOURCE1, Z_External_resourceReport1, (Odr_fun)z_ResourceReport1},
+ {VAL_RESOURCE2, Z_External_resourceReport2, (Odr_fun)z_ResourceReport2},
+ {VAL_PROMPT1, Z_External_promptObject1, (Odr_fun)z_PromptObject1 },
+ {VAL_GRS1, Z_External_grs1, (Odr_fun)z_GenericRecord},
+ {VAL_EXTENDED, Z_External_extendedService, (Odr_fun)z_TaskPackage},
+ {VAL_ITEMORDER, Z_External_itemOrder, (Odr_fun)z_IOItemOrder},
+ {VAL_DIAG1, Z_External_diag1, (Odr_fun)z_DiagnosticFormat},
+ {VAL_ESPEC1, Z_External_espec1, (Odr_fun)z_Espec1},
+ {VAL_SUMMARY, Z_External_summary, (Odr_fun)z_BriefBib},
+ {VAL_OPAC, Z_External_OPAC, (Odr_fun)z_OPACRecord},
+ {VAL_SEARCHRES1, Z_External_searchResult1, (Odr_fun)z_SearchInfoReport},
+ {VAL_DBUPDATE, Z_External_update, (Odr_fun)z_IUUpdate},
+ {VAL_DBUPDATE0, Z_External_update0, (Odr_fun)z_IU0Update},
+ {VAL_DBUPDATE1, Z_External_update0, (Odr_fun)z_IU0Update},
+ {VAL_DATETIME, Z_External_dateTime, (Odr_fun)z_DateTime},
+ {VAL_UNIVERSE_REPORT, Z_External_universeReport,(Odr_fun)z_UniverseReport},
+ {VAL_ADMINSERVICE, Z_External_ESAdmin, (Odr_fun)z_Admin},
+ {VAL_USERINFO1, Z_External_userInfo1, (Odr_fun) z_OtherInformation},
+ {VAL_CHARNEG3, Z_External_charSetandLanguageNegotiation, (Odr_fun)
+ z_CharSetandLanguageNegotiation},
+ {VAL_PROMPT1, Z_External_acfPrompt1, (Odr_fun) z_PromptObject1},
+ {VAL_DES1, Z_External_acfDes1, (Odr_fun) z_DES_RN_Object},
+ {VAL_KRB1, Z_External_acfKrb1, (Odr_fun) z_KRBObject},
+ {VAL_MULTISRCH2, Z_External_multisrch2, (Odr_fun) z_MultipleSearchTerms_2},
+ {VAL_CQL, Z_External_CQL, (Odr_fun) z_InternationalString},
+ {VAL_OCLCUI, Z_External_OCLCUserInfo, (Odr_fun) z_OCLC_UserInformation},
+ {VAL_NONE, 0, 0}
+};
+
+Z_ext_typeent *z_ext_getentbyref(oid_value val)
+{
+ Z_ext_typeent *i;
+
+ for (i = type_table; i->dref != VAL_NONE; i++)
+ if (i->dref == val)
+ return i;
+ return 0;
+}
+
+int z_External(ODR o, Z_External **p, int opt, const char *name)
+{
+ oident *oid;
+ Z_ext_typeent *type;
+
+ static Odr_arm arm[] =
+ {
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_single,
+ (Odr_fun)odr_any, 0},
+ {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_External_octet,
+ (Odr_fun)odr_octetstring, 0},
+ {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_External_arbitrary,
+ (Odr_fun)odr_bitstring, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_sutrs,
+ (Odr_fun)z_SUTRS, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_explainRecord,
+ (Odr_fun)z_ExplainRecord, 0},
+
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport1,
+ (Odr_fun)z_ResourceReport1, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport2,
+ (Odr_fun)z_ResourceReport2, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_promptObject1,
+ (Odr_fun)z_PromptObject1, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_grs1,
+ (Odr_fun)z_GenericRecord, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_extendedService,
+ (Odr_fun)z_TaskPackage, 0},
+
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_itemOrder,
+ (Odr_fun)z_IOItemOrder, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_diag1,
+ (Odr_fun)z_DiagnosticFormat, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_espec1,
+ (Odr_fun)z_Espec1, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_summary,
+ (Odr_fun)z_BriefBib, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_OPAC,
+ (Odr_fun)z_OPACRecord, 0},
+
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_searchResult1,
+ (Odr_fun)z_SearchInfoReport, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_update,
+ (Odr_fun)z_IUUpdate, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_dateTime,
+ (Odr_fun)z_DateTime, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_universeReport,
+ (Odr_fun)z_UniverseReport, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_ESAdmin,
+ (Odr_fun)z_Admin, 0},
+
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_update0,
+ (Odr_fun)z_IU0Update, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_userInfo1,
+ (Odr_fun)z_OtherInformation, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_charSetandLanguageNegotiation,
+ (Odr_fun)z_CharSetandLanguageNegotiation, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfPrompt1,
+ (Odr_fun)z_PromptObject1, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfDes1,
+ (Odr_fun)z_DES_RN_Object, 0},
+
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfKrb1,
+ (Odr_fun)z_KRBObject, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_multisrch2,
+ (Odr_fun)z_MultipleSearchTerms_2, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_CQL,
+ (Odr_fun)z_InternationalString, 0},
+ {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_OCLCUserInfo,
+ (Odr_fun)z_OCLC_UserInformation, 0},
+ {-1, -1, -1, -1, 0, 0}
+ };
+
+ odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
+ if (!odr_sequence_begin(o, p, sizeof(**p), name))
+ return opt && odr_ok(o);
+ if (!(odr_oid(o, &(*p)->direct_reference, 1, 0) &&
+ odr_integer(o, &(*p)->indirect_reference, 1, 0) &&
+ odr_graphicstring(o, &(*p)->descriptor, 1, 0)))
+ return 0;
+ /*
+ * Do we know this beast?
+ */
+ if (o->direction == ODR_DECODE && (*p)->direct_reference &&
+ (oid = oid_getentbyoid((*p)->direct_reference)) &&
+ (type = z_ext_getentbyref(oid->value)))
+ {
+ int zclass, tag, cons;
+
+ /*
+ * We know it. If it's represented as an ASN.1 type, bias the CHOICE.
+ */
+ if (!odr_peektag(o, &zclass, &tag, &cons))
+ return opt && odr_ok(o);
+ if (zclass == ODR_CONTEXT && tag == 0 && cons == 1)
+ odr_choice_bias(o, type->what);
+ }
+ return
+ odr_choice(o, arm, &(*p)->u, &(*p)->which, name) &&
+ odr_sequence_end(o);
+}
+
+Z_External *z_ext_record(ODR o, int format, const char *buf, int len)
+{
+ Z_External *thisext;
+
+ thisext = (Z_External *) odr_malloc(o, sizeof(*thisext));
+ thisext->descriptor = 0;
+ thisext->indirect_reference = 0;
+
+ thisext->direct_reference =
+ yaz_oidval_to_z3950oid (o, CLASS_RECSYN, format);
+ if (!thisext->direct_reference)
+ return 0;
+
+ if (len < 0) /* Structured data */
+ {
+
+ /*
+ * We cheat on the pointers here. Obviously, the record field
+ * of the backend-fetch structure should have been a union for
+ * correctness, but we're stuck with this for backwards
+ * compatibility.
+ */
+ thisext->u.grs1 = (Z_GenericRecord*) buf;
+
+ switch (format)
+ {
+ case VAL_SUTRS:
+ thisext->which = Z_External_sutrs;
+ break;
+ case VAL_GRS1:
+ thisext->which = Z_External_grs1;
+ break;
+ case VAL_EXPLAIN:
+ thisext->which = Z_External_explainRecord;
+ break;
+ case VAL_SUMMARY:
+ thisext->which = Z_External_summary;
+ break;
+ case VAL_OPAC:
+ thisext->which = Z_External_OPAC;
+ break;
+ case VAL_EXTENDED:
+ thisext->which = Z_External_extendedService;
+ break;
+ default:
+ return 0;
+ }
+ }
+ else if (format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */
+ {
+ Odr_oct *sutrs = (Odr_oct *)odr_malloc(o, sizeof(*sutrs));
+
+ thisext->which = Z_External_sutrs;
+ thisext->u.sutrs = sutrs;
+ sutrs->buf = (unsigned char *)odr_malloc(o, len);
+ sutrs->len = sutrs->size = len;
+ memcpy(sutrs->buf, buf, len);
+ }
+ else
+ {
+ thisext->which = Z_External_octet;
+ if (!(thisext->u.octet_aligned = (Odr_oct *)
+ odr_malloc(o, sizeof(Odr_oct))))
+ return 0;
+ if (!(thisext->u.octet_aligned->buf = (unsigned char *)
+ odr_malloc(o, len)))
+ return 0;
+ memcpy(thisext->u.octet_aligned->buf, buf, len);
+ thisext->u.octet_aligned->len = thisext->u.octet_aligned->size = len;
+ }
+ return thisext;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2001, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: query.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include <yaz/odr.h>
+#include <yaz/proto.h>
+
+static Z_Complex *makecomplex(ODR o, char **buf);
+static Z_Operand *makesimple(ODR o, char **buf);
+Z_RPNStructure *makerpn(ODR o, char **buf);
+
+void skip_spaces(char**p)
+{
+ while (**p && isspace(**p))
+ (*p)++;
+}
+
+static Z_Operand *makesimple(ODR o, char **buf)
+{
+ Z_Operand *r;
+ Z_AttributesPlusTerm *t;
+ char *b;
+
+ r = odr_malloc(o, sizeof(*r));
+ if (**buf == 's' && *((*buf) + 1) == '=')
+ {
+ char *b = odr_malloc(o, 100);
+
+ r->which = Z_Operand_resultSetId;
+ r->u.resultSetId = b;
+ (*buf)++;
+ (*buf)++;
+ while (**buf && !isspace(**buf))
+ *(b++) = *((*buf)++);
+ *b = 0;
+ return r;
+ }
+ else if (**buf != '"')
+ return 0;
+ (*buf)++;
+ r->which = Z_Operand_APT;
+ r->u.attributesPlusTerm = t = odr_malloc(o, sizeof(*t));
+ t->attributes = odr_malloc(o, sizeof(*t));
+ t->attributes->num_attributes = 0;
+ t->attributes->attributes = 0;
+ t->term = odr_malloc(o, sizeof(*t->term));
+ t->term->which = Z_Term_general;
+ t->term->u.general = odr_malloc(o, sizeof(Odr_oct));
+ t->term->u.general->buf = odr_malloc(o, 100);
+ t->term->u.general->size = 100;
+ t->term->u.general->len = 0;
+ b = (char*) t->term->u.general->buf;
+ while (**buf && **buf != '"')
+ {
+ *(b++) = *((*buf)++);
+ t->term->u.general->len++;
+ }
+ if (**buf != '"')
+ return 0;
+ (*buf)++;
+ return r;
+}
+
+static Z_Complex *makecomplex(ODR o, char **buf)
+{
+ Z_Complex *r;
+ char op[100], *b;
+
+ r = odr_malloc(o, sizeof(*r));
+ r->roperator = odr_malloc(o, sizeof(*r->roperator));
+
+ b = op;
+ while (**buf && !isspace(**buf))
+ *(b++) = *((*buf)++);
+ *b = 0;
+ if (!strcmp(op, "and"))
+ r->roperator->which = Z_Operator_and;
+ else if (!strcmp(op, "or"))
+ r->roperator->which = Z_Operator_or;
+ else if (!strcmp(op, "not"))
+ r->roperator->which = Z_Operator_and_not;
+ r->roperator->u.and = "";
+ while (**buf && !isspace(**buf))
+ (*buf)++;
+ if (!(r->s1 = makerpn(o, buf)))
+ return 0;
+ if (!(r->s2 = makerpn(o, buf)))
+ return 0;
+ return r;
+}
+
+Z_RPNStructure *makerpn(ODR o, char **buf)
+{
+ Z_RPNStructure *r;
+
+ r = odr_malloc(o, sizeof(*r));
+ skip_spaces(buf);
+ if (**buf == '"' || **buf == 's')
+ {
+ r->which = Z_RPNStructure_simple;
+ if (!(r->u.simple = makesimple(o, buf)))
+ return 0;
+ return r;
+ }
+ r->which = Z_RPNStructure_complex;
+ if (!(r->u.complex = makecomplex(o, buf)))
+ return 0;
+ return r;
+}
--- /dev/null
+/*
+ * Copyright (C) 1994-2000, Index Data
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: readconf.c,v $
+ * Revision 1.1 2003-10-27 12:21:35 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.10 2000/02/29 13:44:55 adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.9 1999/11/30 13:47:12 adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8 1999/08/27 09:40:32 adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.7 1999/06/30 09:10:32 adam
+ * Fixed reading of MS-DOS files.
+ *
+ * Revision 1.6 1998/10/13 16:09:55 adam
+ * Added support for arbitrary OID's for tagsets, schemas and attribute sets.
+ * Added support for multiple attribute set references and tagset references
+ * from an abstract syntax file.
+ * Fixed many bad logs-calls in routines that read the various
+ * specifications regarding data1 (*.abs,*.att,...) and made the messages
+ * consistent whenever possible.
+ * Added extra 'lineno' argument to function readconf_line.
+ *
+ * Revision 1.5 1997/09/04 07:53:02 adam
+ * Added include readconf.h.
+ *
+ * Revision 1.4 1997/05/14 06:54:07 adam
+ * C++ support.
+ *
+ * Revision 1.3 1996/05/29 15:48:48 quinn
+ * Added \n to the isspace rule.
+ *
+ * Revision 1.2 1996/05/29 10:05:01 quinn
+ * Changed space criteria to support 8-bit characters
+ *
+ * Revision 1.1 1995/11/01 13:55:06 quinn
+ * Minor adjustments
+ *
+ * Revision 1.2 1995/10/30 13:54:27 quinn
+ * iRemoved fclose().
+ *
+ * Revision 1.1 1995/10/10 16:28:18 quinn
+ * Initial revision
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+
+#include <yaz/log.h>
+#include <yaz/readconf.h>
+
+#define l_isspace(c) ((c) == '\t' || (c) == ' ' || (c) == '\n' || (c) == '\r')
+
+int readconf_line(FILE *f, int *lineno, char *line, int len,
+ char *argv[], int num)
+{
+ char *p;
+ int argc;
+
+ while ((p = fgets(line, len, f)))
+ {
+ (*lineno)++;
+ while (*p && l_isspace(*p))
+ p++;
+ if (*p && *p != '#')
+ break;
+ }
+ if (!p)
+ return 0;
+
+ for (argc = 0; *p ; argc++)
+ {
+ if (*p == '#') /* trailing comment */
+ break;
+ argv[argc] = p;
+ while (*p && !l_isspace(*p))
+ p++;
+ if (*p)
+ {
+ *(p++) = '\0';
+ while (*p && l_isspace(*p))
+ p++;
+ }
+ }
+ return argc;
+}
+
+/*
+ * Read lines of a configuration file.
+ */
+int readconf(char *name, void *rprivate,
+ int (*fun)(char *name, void *rprivate, int argc, char *argv[]))
+{
+ FILE *f;
+ char line[512], *m_argv[50];
+ int m_argc;
+ int lineno = 0;
+
+ if (!(f = fopen(name, "r")))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "readconf: %s", name);
+ return -1;
+ }
+ for (;;)
+ {
+ int res;
+
+ if (!(m_argc = readconf_line(f, &lineno, line, 512, m_argv, 50)))
+ {
+ fclose(f);
+ return 0;
+ }
+
+ if ((res = (*fun)(name, rprivate, m_argc, m_argv)))
+ {
+ fclose(f);
+ return res;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (C) 1994-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: requestq.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ *
+ */
+
+/*
+ * Simple queue management.
+ *
+ * We also use the request-freelist to store encoding buffers, rather than
+ * freeing and xmalloc'ing them on each cycle.
+ */
+
+#include <stdlib.h>
+
+#include <yaz/xmalloc.h>
+#include "session.h"
+
+void request_enq(request_q *q, request *r)
+{
+ if (q->tail)
+ q->tail->next = r;
+ else
+ q->head = r;
+ q->tail = r;
+ q->num++;
+}
+
+request *request_head(request_q *q)
+{
+ return q->head;
+}
+
+request *request_deq(request_q *q)
+{
+ request *r = q->head;
+
+ if (!r)
+ return 0;
+ q->head = q->head->next;
+ if (!q->head)
+ q->tail = 0;
+ q->num--;
+ return r;
+}
+
+void request_initq(request_q *q)
+{
+ q->head = q->tail = q->list = 0;
+ q->num = 0;
+}
+
+void request_delq(request_q *q)
+{
+ request *r1, *r = q->list;
+ while (r)
+ {
+ xfree (r->response);
+ r1 = r;
+ r = r->next;
+ xfree (r1);
+ }
+}
+
+request *request_get(request_q *q)
+{
+ request *r = q->list;
+
+ if (r)
+ q->list = r->next;
+ else
+ {
+ if (!(r = (request *)xmalloc(sizeof(*r))))
+ abort();
+ r->response = 0;
+ r->size_response = 0;
+ }
+ r->q = q;
+ r->len_refid = 0;
+ r->refid = 0;
+ r->gdu_request = 0;
+ r->apdu_request = 0;
+ r->request_mem = 0;
+ r->len_response = 0;
+ r->clientData = 0;
+ r->state = REQUEST_IDLE;
+ r->next = 0;
+ return r;
+}
+
+void request_release(request *r)
+{
+ request_q *q = r->q;
+ r->next = q->list;
+ q->list = r;
+}
+
--- /dev/null
+/*
+ * NT Service interface Utility.
+ * Based on code written by
+ * Chas Woodfield, Fretwell Downing Informatics.
+ * $Log: service.c,v $
+ * Revision 1.1 2003-10-27 12:21:35 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.5 2001/11/13 23:00:42 adam
+ * Separate malloc debug library. Removal of ASN_COMPILED-#ifdefs.
+ *
+ * Revision 1.4 2000/12/05 19:05:10 adam
+ * Service automatically starts in the directory from which it was installed.
+ *
+ * Revision 1.3 1999/06/10 11:45:30 adam
+ * Added bend_start, bend_stop handlers and removed pre_init.
+ * Handlers bend_start/bend_stop are called when service/daemon is
+ * started/stopped.
+ *
+ * Revision 1.2 1999/02/02 13:57:36 adam
+ * Uses preprocessor define WIN32 instead of WINDOWS to build code
+ * for Microsoft WIN32.
+ *
+ * Revision 1.1 1997/11/07 13:31:52 adam
+ * Added NT Service name part of statserv_options_block. Moved NT
+ * service utility to server library.
+ *
+ * Revision 1.6 1997/09/18 08:49:14 adam
+ * Option -runnormal no needed to run server in standalone mode.
+ *
+ * Revision 1.5 1997/09/17 12:10:43 adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.4 1997/09/09 10:10:20 adam
+ * Another MSV5.0 port. Changed projects to include proper
+ * library/include paths.
+ * Server starts server in test-mode when no options are given.
+ *
+ * Revision 1.3 1997/09/04 13:50:30 adam
+ * Bug fix in ztest.
+ *
+ */
+
+/************************************************************/
+/* Note this file is shared by all processes */
+/* Should really put it somewhere other than here */
+/* For some strange reason it won't work when part of a lib */
+/************************************************************/
+
+#ifdef WIN32
+
+#include <windows.h>
+#include <stdio.h>
+#include <tchar.h>
+#include <direct.h>
+
+#include "service.h"
+
+static AppService *pService = NULL;
+static BOOL bRunAsService = TRUE;
+static void *pAppHandle = NULL;
+
+/* Private functions to this module */
+void Service_Create(LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies, int argc, char **argv);
+void Service_Delete();
+void Service_Initialize();
+BOOL NotifyServiceController();
+BOOL UpdateServiceStatus(DWORD Status);
+void FailServiceStart(DWORD Win32Code, DWORD PrivateCode);
+void CmdInstallService(int argc, char *argv[], BOOL bAutoStart);
+void CmdRemoveService();
+LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize);
+BOOL CheckServiceArguments(int argc, char *argv[]);
+
+/* Callback functions for thee service manager */
+void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
+void WINAPI ServiceControlHandler(DWORD fdwControl);
+
+/* Function to handle Ctrl + C etc... */
+BOOL EventHandlerRoutine(DWORD dwCtrlType);
+
+void Service_Create(LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies, int argc, char **argv)
+{
+ pService = malloc(sizeof(AppService));
+ pService->pAppName = pAppName;
+ pService->pServiceName = pServiceName;
+ pService->pServiceDisplayName = pServiceDisplayName;
+ pService->pDependancies = pDependancies;
+ pService->hService = 0;
+ pService->ServiceTable[0].lpServiceName = pServiceName;
+ pService->ServiceTable[0].lpServiceProc = ServiceMain;
+ pService->ServiceTable[1].lpServiceName = NULL;
+ pService->ServiceTable[1].lpServiceProc = NULL;
+ pService->argc = argc;
+ pService->argv = argv;
+}
+
+void Service_Delete()
+{
+ if (pService != NULL)
+ {
+ /* Mark the service as stopping */
+ UpdateServiceStatus(SERVICE_STOP_PENDING);
+
+ /* Stop the service */
+ StopAppService(pAppHandle);
+
+ /* Service has now stopped */
+ UpdateServiceStatus(SERVICE_STOPPED);
+
+ /* Free the memory */
+ free(pService);
+ pService = NULL;
+ }
+}
+
+void Service_Initialize()
+{
+ if (pService != NULL)
+ {
+ /* Register ourselves with the control dispatcher */
+ StartServiceCtrlDispatcher(pService->ServiceTable);
+ }
+}
+
+void WINAPI ServiceMain(DWORD argc, LPTSTR argv[])
+{
+ if (pService != NULL)
+ {
+ if (NotifyServiceController())
+ {
+ /* Set the status to pending */
+ UpdateServiceStatus(SERVICE_START_PENDING);
+
+ /* Lets attempt to start the service */
+ if (StartAppService(pAppHandle, pService->argc, pService->argv))
+ {
+ /* Service is now up and running */
+ UpdateServiceStatus(SERVICE_RUNNING);
+
+ /* Lets wait for our clients */
+ RunAppService(pAppHandle);
+ }
+ else
+ {
+ FailServiceStart(GetLastError(), 0);
+ Service_Delete();
+ }
+ }
+ }
+}
+
+BOOL NotifyServiceController()
+{
+ if (pService == NULL)
+ {
+ return(FALSE);
+ }
+ else
+ {
+ if (bRunAsService)
+ {
+ pService->ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ pService->ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ pService->ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+ pService->ServiceStatus.dwWin32ExitCode = 0;
+ pService->ServiceStatus.dwServiceSpecificExitCode = 0;
+ pService->ServiceStatus.dwCheckPoint = 0;
+ pService->ServiceStatus.dwWaitHint = 0;
+ pService->hService = RegisterServiceCtrlHandler(pService->pServiceName, ServiceControlHandler);
+
+ if (pService->hService)
+ UpdateServiceStatus(SERVICE_START_PENDING);
+ else
+ return(FALSE);
+ }
+ return(TRUE);
+ }
+}
+
+void WINAPI ServiceControlHandler(DWORD fdwControl)
+{
+ if (pService != NULL)
+ {
+ switch (fdwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ /* Update the service status to be pending */
+ Service_Delete();
+ break;
+
+ case SERVICE_CONTROL_INTERROGATE:
+ UpdateServiceStatus(pService->ServiceStatus.dwCurrentState);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+BOOL UpdateServiceStatus(DWORD Status)
+{
+ if (pService != NULL)
+ {
+ if (pService->hService)
+ {
+ pService->ServiceStatus.dwCurrentState = Status;
+ if ((Status == SERVICE_START_PENDING) || (Status == SERVICE_STOP_PENDING))
+ {
+ pService->ServiceStatus.dwCheckPoint ++;
+ pService->ServiceStatus.dwWaitHint = 5000; /* 5 sec.*/
+ }
+ else
+ {
+ pService->ServiceStatus.dwCheckPoint = 0;
+ pService->ServiceStatus.dwWaitHint = 0;
+ }
+
+ return(SetServiceStatus(pService->hService, &pService->ServiceStatus));
+ }
+ }
+
+ return(FALSE);
+}
+
+void FailServiceStart(DWORD Win32Code, DWORD PrivateCode)
+{
+ if (pService != NULL)
+ {
+ pService->ServiceStatus.dwWin32ExitCode = Win32Code;
+ pService->ServiceStatus.dwServiceSpecificExitCode = PrivateCode;
+ UpdateServiceStatus(SERVICE_STOPPED);
+ }
+}
+
+void CmdInstallService(int argc, char *argv[], BOOL bAutoStart)
+{
+ if (pService != NULL)
+ {
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+
+ TCHAR szPath[2048];
+
+ if (GetModuleFileName(NULL, szPath, 512) == 0)
+ {
+ _tprintf(TEXT("Unable to install %s - %s\n"), TEXT(pService->pServiceDisplayName), GetLastErrorText(pService->szErr, 256));
+ }
+ else
+ {
+ int i;
+ char cwdstr[_MAX_PATH];
+
+ if (!_getcwd(cwdstr, sizeof(cwdstr)))
+ strcpy (cwdstr, ".");
+
+ strcat (szPath, TEXT(" -runservice \""));
+ strcat (szPath, cwdstr);
+ strcat (szPath, "\"");
+
+ for (i = 1; i < argc; i++)
+ {
+ /* We will add the given command line arguments to the command */
+ /* We are not interested in the install and remove options */
+ if ((stricmp("-install", argv[i]) != 0) &&
+ (stricmp("-installa", argv[i]) != 0) &&
+ (stricmp("-remove", argv[i]) != 0))
+ {
+ strcat(szPath, TEXT(" "));
+ strcat(szPath, argv[i]);
+ }
+ }
+
+ schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */
+ NULL, /* database (NULL == default) */
+ SC_MANAGER_ALL_ACCESS); /* access required */
+ if (schSCManager)
+ {
+ schService = CreateService(schSCManager, /* SCManager database */
+ TEXT(pService->pServiceName), /* name of service */
+ TEXT(pService->pServiceDisplayName), /* name to display */
+ SERVICE_ALL_ACCESS, /* desired access */
+ SERVICE_WIN32_OWN_PROCESS, /* service type */
+ bAutoStart ? SERVICE_AUTO_START :
+ SERVICE_DEMAND_START, /* start type */
+ SERVICE_ERROR_NORMAL, /* error control type */
+ szPath, /* service's binary */
+ NULL, /* no load ordering group */
+ NULL, /* no tag identifier */
+ TEXT(pService->pDependancies), /* dependencies */
+ NULL, /* LocalSystem account */
+ NULL); /* no password */
+
+ if (schService)
+ {
+ _tprintf(TEXT("%s installed.\n"), TEXT(pService->pServiceDisplayName));
+ CloseServiceHandle(schService);
+ }
+ else
+ {
+ _tprintf(TEXT("CreateService failed - %s\n"), GetLastErrorText(pService->szErr, 256));
+ }
+
+ CloseServiceHandle(schSCManager);
+ }
+ else
+ _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(pService->szErr,256));
+ }
+ }
+}
+
+void CmdRemoveService()
+{
+ if (pService != NULL)
+ {
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+
+ schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */
+ NULL, /* database (NULL == default) */
+ SC_MANAGER_ALL_ACCESS); /* access required */
+ if (schSCManager)
+ {
+ schService = OpenService(schSCManager, TEXT(pService->pServiceName), SERVICE_ALL_ACCESS);
+
+ if (schService)
+ {
+ /* try to stop the service */
+ if (ControlService(schService, SERVICE_CONTROL_STOP, &pService->ServiceStatus))
+ {
+ _tprintf(TEXT("Stopping %s."), TEXT(pService->pServiceDisplayName));
+ Sleep(1000);
+
+ while (QueryServiceStatus(schService, &pService->ServiceStatus))
+ {
+ if (pService->ServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
+ {
+ _tprintf(TEXT("."));
+ Sleep( 1000 );
+ }
+ else
+ break;
+ }
+
+ if (pService->ServiceStatus.dwCurrentState == SERVICE_STOPPED)
+ _tprintf(TEXT("\n%s stopped.\n"), TEXT(pService->pServiceDisplayName));
+ else
+ _tprintf(TEXT("\n%s failed to stop.\n"), TEXT(pService->pServiceDisplayName));
+
+ }
+
+ /* now remove the service */
+ if(DeleteService(schService))
+ _tprintf(TEXT("%s removed.\n"), TEXT(pService->pServiceDisplayName));
+ else
+ _tprintf(TEXT("DeleteService failed - %s\n"), GetLastErrorText(pService->szErr,256));
+
+ CloseServiceHandle(schService);
+ }
+ else
+ _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(pService->szErr,256));
+
+ CloseServiceHandle(schSCManager);
+ }
+ else
+ _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(pService->szErr,256));
+ }
+}
+
+LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
+{
+ DWORD dwRet;
+ LPTSTR lpszTemp = NULL;
+
+ dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ NULL,
+ GetLastError(),
+ LANG_NEUTRAL,
+ (LPTSTR)&lpszTemp,
+ 0,
+ NULL);
+
+ /* supplied buffer is not long enough */
+ if (!dwRet || ((long)dwSize < (long)dwRet + 14))
+ lpszBuf[0] = TEXT('\0');
+ else
+ {
+ lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); /* remove cr and newline character */
+ _stprintf(lpszBuf, TEXT("%s (0x%x)"), lpszTemp, GetLastError());
+ }
+
+ if (lpszTemp)
+ LocalFree((HLOCAL)lpszTemp);
+
+ return(lpszBuf);
+}
+
+BOOL CheckServiceArguments(int argc, char *argv[])
+{
+ int i;
+
+ /* Lets process the arguments */
+ for (i = 1; i < argc; i++)
+ {
+ if (stricmp("-install", argv[i]) == 0)
+ {
+ /* They want to install the service */
+ CmdInstallService(argc, argv, FALSE);
+
+ /* We don't carry on, after we have installed the service */
+ return(FALSE);
+ }
+ else if (stricmp("-installa", argv[i]) == 0)
+ {
+ /* They want to install the service */
+ CmdInstallService(argc, argv, TRUE);
+
+ /* We don't carry on, after we have installed the service */
+ return(FALSE);
+ }
+ else if (stricmp("-remove", argv[i]) == 0)
+ {
+ /* Here they want to remove it */
+ CmdRemoveService();
+
+ /* We don't carry on, after we have removed the service */
+ return(FALSE);
+ }
+ else if (stricmp ("-runservice", argv[i]) == 0)
+ {
+ /* We can carry on, if we reached here */
+ chdir(argv[i+1]);
+ argv[i] = "";
+ argv[i+1] = "";
+ return(TRUE);
+ }
+ }
+ bRunAsService = FALSE;
+ return(TRUE);
+}
+
+BOOL SetupService(int argc, char *argv[], void *pHandle, LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies)
+{
+ BOOL bDeleteService = TRUE;
+ BOOL bResult = FALSE;
+
+ /* Save the handle for later use */
+ pAppHandle = pHandle;
+
+ /* Create our service class */
+ Service_Create(pAppName, pServiceName, pServiceDisplayName, pDependancies, argc, argv);
+
+ if (CheckServiceArguments(argc, argv))
+ {
+ if (bRunAsService)
+ {
+ /* No need to set the console control handler, as the service manager handles all this for us */
+ Service_Initialize();
+ bDeleteService = FALSE;
+ }
+ else
+ {
+ /* Set the console control handler for exiting the program */
+ SetConsoleCtrlHandler((PHANDLER_ROUTINE)EventHandlerRoutine, TRUE);
+
+ /* Now do the main work */
+ ServiceMain(argc, argv);
+ }
+
+ /* We have been successful initializing, so let the caller know */
+ bResult = TRUE;
+ }
+
+ if (bDeleteService)
+ {
+ /* Finished with the service now */
+ Service_Delete();
+ }
+ return(bResult);
+}
+
+BOOL EventHandlerRoutine(DWORD dwCtrlType)
+{
+ /* This routine dosn't seem to get called all the time, Why ??? */
+ switch (dwCtrlType)
+ {
+ case CTRL_C_EVENT: /* A CTRL+C signal was received, either from keyboard input or from a signal generated by the GenerateConsoleCtrlEvent function.*/
+ case CTRL_BREAK_EVENT: /* A CTRL+BREAK signal was received, either from keyboard input or from a signal generated by GenerateConsoleCtrlEvent.*/
+ case CTRL_CLOSE_EVENT: /* A signal that the system sends to all processes attached to a console when the user closes the console (either by choosing the Close command from the console window's System menu, or by choosing the End Task command from the Task List).*/
+ case CTRL_LOGOFF_EVENT: /* A signal that the system sends to all console processes when a user is logging off. This signal does not indicate which user is logging off, so no assumptions can be made.*/
+ case CTRL_SHUTDOWN_EVENT: /* A signal that the system sends to all console processes when the system */
+ /* We are basically shutting down, so call Service_Delete */
+ Service_Delete();
+ return(FALSE);
+ break;
+
+ default:
+ /* we are not handling this one, so return FALSE */
+ return(FALSE);
+ }
+}
+#endif
--- /dev/null
+/*
+ * NT Service interface Utility.
+ * Based on code written by
+ * Chas Woodfield, Fretwell Downing Datasystems.
+ * $Log: service.h,v $
+ * Revision 1.1 2003-10-27 12:21:35 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.1 1997/11/07 13:31:52 adam
+ * Added NT Service name part of statserv_options_block. Moved NT
+ * service utility to server library.
+ *
+ * Revision 1.2 1997/09/04 13:50:30 adam
+ * Bug fix in ztest.
+ *
+ */
+
+#ifndef SERVICE_INCLUDED
+#define SERVICE_INCLUDED
+
+#ifdef WIN32
+
+#include <windows.h>
+
+typedef struct _Service
+{
+ LPTSTR pAppName;
+ LPTSTR pServiceName;
+ LPTSTR pServiceDisplayName;
+ LPTSTR pDependancies;
+ TCHAR szErr[256];
+ SERVICE_STATUS_HANDLE hService;
+ SERVICE_STATUS ServiceStatus;
+ SERVICE_TABLE_ENTRY ServiceTable[2];
+ int argc;
+ char **argv;
+} AppService;
+
+/* Called by the app to initialize the service */
+BOOL SetupService(int argc, char *argv[], void *pHandle, LPTSTR pAppName, LPTSTR pServiceName, LPTSTR pServiceDisplayName, LPTSTR pDependancies);
+
+#endif /* WIN32 */
+
+/* Functions that must be in the main application */
+/* Initializes the app */
+int StartAppService(void *pHandle, int argc, char **argv);
+
+/* Now we wait for any connections */
+void RunAppService(void *pHandle);
+
+/* Time to tidyup and stop the service */
+void StopAppService(void *pHandle);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: seshigh.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+/*
+ * Frontend server logic.
+ *
+ * This code receives incoming APDUs, and handles client requests by means
+ * of the backend API.
+ *
+ * Some of the code is getting quite involved, compared to simpler servers -
+ * primarily because it is asynchronous both in the communication with
+ * the user and the backend. We think the complexity will pay off in
+ * the form of greater flexibility when more asynchronous facilities
+ * are implemented.
+ *
+ * Memory management has become somewhat involved. In the simple case, where
+ * only one PDU is pending at a time, it will simply reuse the same memory,
+ * once it has found its working size. When we enable multiple concurrent
+ * operations, perhaps even with multiple parallel calls to the backend, it
+ * will maintain a pool of buffers for encoding and decoding, trying to
+ * minimize memory allocation/deallocation during normal operation.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef WIN32
+#include <io.h>
+#define S_ISREG(x) (x & _S_IFREG)
+#include <process.h>
+#include <sys/stat.h>
+#else
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+#include <assert.h>
+#include <ctype.h>
+
+#include <yaz/yconfig.h>
+#include <yaz/xmalloc.h>
+#include <yaz/comstack.h>
+#include "eventl.h"
+#include "session.h"
+#include <yaz/proto.h>
+#include <yaz/oid.h>
+#include <yaz/log.h>
+#include <yaz/logrpn.h>
+#include <yaz/statserv.h>
+#include <yaz/diagbib1.h>
+#include <yaz/charneg.h>
+#include <yaz/otherinfo.h>
+#include <yaz/yaz-util.h>
+#include <yaz/pquery.h>
+
+#include <yaz/srw.h>
+#include <yaz/backend.h>
+
+static void process_gdu_request(association *assoc, request *req);
+static int process_z_request(association *assoc, request *req, char **msg);
+void backend_response(IOCHAN i, int event);
+static int process_gdu_response(association *assoc, request *req, Z_GDU *res);
+static int process_z_response(association *assoc, request *req, Z_APDU *res);
+static Z_APDU *process_initRequest(association *assoc, request *reqb);
+static Z_External *init_diagnostics(ODR odr, int errcode, char *errstring);
+static Z_APDU *process_searchRequest(association *assoc, request *reqb,
+ int *fd);
+static Z_APDU *response_searchRequest(association *assoc, request *reqb,
+ bend_search_rr *bsrr, int *fd);
+static Z_APDU *process_presentRequest(association *assoc, request *reqb,
+ int *fd);
+static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd);
+static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd);
+static void process_close(association *assoc, request *reqb);
+void save_referenceId (request *reqb, Z_ReferenceId *refid);
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
+ int *fd);
+static Z_APDU *process_segmentRequest (association *assoc, request *reqb);
+
+static FILE *apduf = 0; /* for use in static mode */
+static statserv_options_block *control_block = 0;
+
+static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd);
+
+/*
+ * Create and initialize a new association-handle.
+ * channel : iochannel for the current line.
+ * link : communications channel.
+ * Returns: 0 or a new association handle.
+ */
+association *create_association(IOCHAN channel, COMSTACK link)
+{
+ association *anew;
+
+ if (!control_block)
+ control_block = statserv_getcontrol();
+ if (!(anew = (association *)xmalloc(sizeof(*anew))))
+ return 0;
+ anew->init = 0;
+ anew->version = 0;
+ anew->client_chan = channel;
+ anew->client_link = link;
+ anew->cs_get_mask = 0;
+ anew->cs_put_mask = 0;
+ anew->cs_accept_mask = 0;
+ if (!(anew->decode = odr_createmem(ODR_DECODE)) ||
+ !(anew->encode = odr_createmem(ODR_ENCODE)))
+ return 0;
+ if (*control_block->apdufile)
+ {
+ char filename[256];
+ FILE *f;
+
+ strcpy(filename, control_block->apdufile);
+ if (!(anew->print = odr_createmem(ODR_PRINT)))
+ return 0;
+ if (*control_block->apdufile == '@')
+ {
+ odr_setprint(anew->print, yaz_log_file());
+ }
+ else if (*control_block->apdufile != '-')
+ {
+ strcpy(filename, control_block->apdufile);
+ if (!control_block->dynamic)
+ {
+ if (!apduf)
+ {
+ if (!(apduf = fopen(filename, "w")))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "%s", filename);
+ return 0;
+ }
+ setvbuf(apduf, 0, _IONBF, 0);
+ }
+ f = apduf;
+ }
+ else
+ {
+ sprintf(filename + strlen(filename), ".%d", getpid());
+ if (!(f = fopen(filename, "w")))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "%s", filename);
+ return 0;
+ }
+ setvbuf(f, 0, _IONBF, 0);
+ }
+ odr_setprint(anew->print, f);
+ }
+ }
+ else
+ anew->print = 0;
+ anew->input_buffer = 0;
+ anew->input_buffer_len = 0;
+ anew->backend = 0;
+ anew->state = ASSOC_NEW;
+ request_initq(&anew->incoming);
+ request_initq(&anew->outgoing);
+ anew->proto = cs_getproto(link);
+ return anew;
+}
+
+/*
+ * Free association and release resources.
+ */
+void destroy_association(association *h)
+{
+ statserv_options_block *cb = statserv_getcontrol();
+ request *req;
+
+ xfree(h->init);
+ odr_destroy(h->decode);
+ odr_destroy(h->encode);
+ if (h->print)
+ odr_destroy(h->print);
+ if (h->input_buffer)
+ xfree(h->input_buffer);
+ if (h->backend)
+ (*cb->bend_close)(h->backend);
+ while ((req = request_deq(&h->incoming)))
+ request_release(req);
+ while ((req = request_deq(&h->outgoing)))
+ request_release(req);
+ request_delq(&h->incoming);
+ request_delq(&h->outgoing);
+ xfree(h);
+ xmalloc_trav("session closed");
+ if (control_block && control_block->one_shot)
+ {
+ exit (0);
+ }
+}
+
+static void do_close_req(association *a, int reason, char *message,
+ request *req)
+{
+ Z_APDU apdu;
+ Z_Close *cls = zget_Close(a->encode);
+
+ /* Purge request queue */
+ while (request_deq(&a->incoming));
+ while (request_deq(&a->outgoing));
+ if (a->version >= 3)
+ {
+ yaz_log(LOG_LOG, "Sending Close PDU, reason=%d, message=%s",
+ reason, message ? message : "none");
+ apdu.which = Z_APDU_close;
+ apdu.u.close = cls;
+ *cls->closeReason = reason;
+ cls->diagnosticInformation = message;
+ process_z_response(a, req, &apdu);
+ iochan_settimeout(a->client_chan, 20);
+ }
+ else
+ {
+ request_release(req);
+ yaz_log(LOG_DEBUG, "v2 client. No Close PDU");
+ iochan_setevent(a->client_chan, EVENT_TIMEOUT); /* force imm close */
+ }
+ a->state = ASSOC_DEAD;
+}
+
+static void do_close(association *a, int reason, char *message)
+{
+ request *req = request_get(&a->outgoing);
+ do_close_req (a, reason, message, req);
+}
+
+/*
+ * This is where PDUs from the client are read and the further
+ * processing is initiated. Flow of control moves down through the
+ * various process_* functions below, until the encoded result comes back up
+ * to the output handler in here.
+ *
+ * h : the I/O channel that has an outstanding event.
+ * event : the current outstanding event.
+ */
+void ir_session(IOCHAN h, int event)
+{
+ int res;
+ association *assoc = (association *)iochan_getdata(h);
+ COMSTACK conn = assoc->client_link;
+ request *req;
+
+ assert(h && conn && assoc);
+ if (event == EVENT_TIMEOUT)
+ {
+ if (assoc->state != ASSOC_UP)
+ {
+ yaz_log(LOG_LOG, "Final timeout - closing connection.");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ }
+ else
+ {
+ yaz_log(LOG_LOG, "Session idle too long. Sending close.");
+ do_close(assoc, Z_Close_lackOfActivity, 0);
+ }
+ return;
+ }
+ if (event & assoc->cs_accept_mask)
+ {
+ yaz_log (LOG_DEBUG, "ir_session (accept)");
+ if (!cs_accept (conn))
+ {
+ yaz_log (LOG_LOG, "accept failed");
+ destroy_association(assoc);
+ iochan_destroy(h);
+ }
+ iochan_clearflag (h, EVENT_OUTPUT|EVENT_OUTPUT);
+ if (conn->io_pending)
+ { /* cs_accept didn't complete */
+ assoc->cs_accept_mask =
+ ((conn->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) |
+ ((conn->io_pending & CS_WANT_READ) ? EVENT_INPUT : 0);
+
+ iochan_setflag (h, assoc->cs_accept_mask);
+ }
+ else
+ { /* cs_accept completed. Prepare for reading (cs_get) */
+ assoc->cs_accept_mask = 0;
+ assoc->cs_get_mask = EVENT_INPUT;
+ iochan_setflag (h, assoc->cs_get_mask);
+ }
+ return;
+ }
+ if ((event & assoc->cs_get_mask) || (event & EVENT_WORK)) /* input */
+ {
+ if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask))
+ {
+ yaz_log(LOG_DEBUG, "ir_session (input)");
+ /* We aren't speaking to this fellow */
+ if (assoc->state == ASSOC_DEAD)
+ {
+ yaz_log(LOG_LOG, "Connection closed - end of session");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ return;
+ }
+ assoc->cs_get_mask = EVENT_INPUT;
+ if ((res = cs_get(conn, &assoc->input_buffer,
+ &assoc->input_buffer_len)) <= 0)
+ {
+ yaz_log(LOG_LOG, "Connection closed by client");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ return;
+ }
+ else if (res == 1) /* incomplete read - wait for more */
+ {
+ if (conn->io_pending & CS_WANT_WRITE)
+ assoc->cs_get_mask |= EVENT_OUTPUT;
+ iochan_setflag(h, assoc->cs_get_mask);
+ return;
+ }
+ if (cs_more(conn)) /* more stuff - call us again later, please */
+ iochan_setevent(h, EVENT_INPUT);
+
+ /* we got a complete PDU. Let's decode it */
+ yaz_log(LOG_DEBUG, "Got PDU, %d bytes: lead=%02X %02X %02X", res,
+ assoc->input_buffer[0] & 0xff,
+ assoc->input_buffer[1] & 0xff,
+ assoc->input_buffer[2] & 0xff);
+ req = request_get(&assoc->incoming); /* get a new request */
+ odr_reset(assoc->decode);
+ odr_setbuf(assoc->decode, assoc->input_buffer, res, 0);
+ if (!z_GDU(assoc->decode, &req->gdu_request, 0, 0))
+ {
+ yaz_log(LOG_LOG, "ODR error on incoming PDU: %s [element %s] "
+ "[near byte %d] ",
+ odr_errmsg(odr_geterror(assoc->decode)),
+ odr_getelement(assoc->decode),
+ odr_offset(assoc->decode));
+ if (assoc->decode->error != OHTTP)
+ {
+ yaz_log(LOG_LOG, "PDU dump:");
+ odr_dumpBER(yaz_log_file(), assoc->input_buffer, res);
+ request_release(req);
+ do_close(assoc, Z_Close_protocolError,"Malformed package");
+ }
+ else
+ {
+ Z_GDU *p = z_get_HTTP_Response(assoc->encode, 400);
+ assoc->state = ASSOC_DEAD;
+ process_gdu_response(assoc, req, p);
+ }
+ return;
+ }
+ req->request_mem = odr_extract_mem(assoc->decode);
+ if (assoc->print && !z_GDU(assoc->print, &req->gdu_request, 0, 0))
+ {
+ yaz_log(LOG_WARN, "ODR print error: %s",
+ odr_errmsg(odr_geterror(assoc->print)));
+ odr_reset(assoc->print);
+ }
+ request_enq(&assoc->incoming, req);
+ }
+
+ /* can we do something yet? */
+ req = request_head(&assoc->incoming);
+ if (req->state == REQUEST_IDLE)
+ {
+ request_deq(&assoc->incoming);
+ process_gdu_request(assoc, req);
+ }
+ }
+ if (event & assoc->cs_put_mask)
+ {
+ request *req = request_head(&assoc->outgoing);
+
+ assoc->cs_put_mask = 0;
+ yaz_log(LOG_DEBUG, "ir_session (output)");
+ req->state = REQUEST_PENDING;
+ switch (res = cs_put(conn, req->response, req->len_response))
+ {
+ case -1:
+ yaz_log(LOG_LOG, "Connection closed by client");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ break;
+ case 0: /* all sent - release the request structure */
+ yaz_log(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response);
+#if 0
+ yaz_log(LOG_DEBUG, "HTTP out:\n%.*s", req->len_response,
+ req->response);
+#endif
+ nmem_destroy(req->request_mem);
+ request_deq(&assoc->outgoing);
+ request_release(req);
+ if (!request_head(&assoc->outgoing))
+ { /* restore mask for cs_get operation ... */
+ iochan_clearflag(h, EVENT_OUTPUT|EVENT_INPUT);
+ iochan_setflag(h, assoc->cs_get_mask);
+ if (assoc->state == ASSOC_DEAD)
+ iochan_setevent(assoc->client_chan, EVENT_TIMEOUT);
+ }
+ else
+ {
+ assoc->cs_put_mask = EVENT_OUTPUT;
+ }
+ break;
+ default:
+ if (conn->io_pending & CS_WANT_WRITE)
+ assoc->cs_put_mask |= EVENT_OUTPUT;
+ if (conn->io_pending & CS_WANT_READ)
+ assoc->cs_put_mask |= EVENT_INPUT;
+ iochan_setflag(h, assoc->cs_put_mask);
+ }
+ }
+ if (event & EVENT_EXCEPT)
+ {
+ yaz_log(LOG_LOG, "ir_session (exception)");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ }
+}
+
+static int process_z_request(association *assoc, request *req, char **msg);
+
+static void assoc_init_reset(association *assoc)
+{
+ xfree (assoc->init);
+ assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init));
+
+ assoc->init->stream = assoc->encode;
+ assoc->init->print = assoc->print;
+ assoc->init->auth = 0;
+ assoc->init->referenceId = 0;
+ assoc->init->implementation_version = 0;
+ assoc->init->implementation_id = 0;
+ assoc->init->implementation_name = 0;
+ assoc->init->bend_sort = NULL;
+ assoc->init->bend_search = NULL;
+ assoc->init->bend_present = NULL;
+ assoc->init->bend_esrequest = NULL;
+ assoc->init->bend_delete = NULL;
+ assoc->init->bend_scan = NULL;
+ assoc->init->bend_segment = NULL;
+ assoc->init->bend_fetch = NULL;
+ assoc->init->bend_explain = NULL;
+
+ assoc->init->charneg_request = NULL;
+ assoc->init->charneg_response = NULL;
+
+ assoc->init->decode = assoc->decode;
+ assoc->init->peer_name =
+ odr_strdup (assoc->encode, cs_addrstr(assoc->client_link));
+}
+
+static int srw_bend_init(association *assoc)
+{
+ const char *encoding = "UTF-8";
+ Z_External *ce;
+ bend_initresult *binitres;
+ statserv_options_block *cb = statserv_getcontrol();
+
+ assoc_init_reset(assoc);
+
+ assoc->maximumRecordSize = 3000000;
+ assoc->preferredMessageSize = 3000000;
+#if 1
+ ce = yaz_set_proposal_charneg(assoc->decode, &encoding, 1, 0, 0, 1);
+ assoc->init->charneg_request = ce->u.charNeg3;
+#endif
+ if (!(binitres = (*cb->bend_init)(assoc->init)))
+ {
+ yaz_log(LOG_WARN, "Bad response from backend.");
+ return 0;
+ }
+ assoc->backend = binitres->handle;
+ return 1;
+}
+
+static int srw_bend_fetch(association *assoc, int pos,
+ Z_SRW_searchRetrieveRequest *srw_req,
+ Z_SRW_record *record)
+{
+ bend_fetch_rr rr;
+ ODR o = assoc->encode;
+
+ rr.setname = "default";
+ rr.number = pos;
+ rr.referenceId = 0;
+ rr.request_format = VAL_TEXT_XML;
+ rr.request_format_raw = yaz_oidval_to_z3950oid(assoc->decode,
+ CLASS_TRANSYN,
+ VAL_TEXT_XML);
+ rr.comp = (Z_RecordComposition *)
+ odr_malloc(assoc->decode, sizeof(*rr.comp));
+ rr.comp->which = Z_RecordComp_complex;
+ rr.comp->u.complex = (Z_CompSpec *)
+ odr_malloc(assoc->decode, sizeof(Z_CompSpec));
+ rr.comp->u.complex->selectAlternativeSyntax = (bool_t *)
+ odr_malloc(assoc->encode, sizeof(bool_t));
+ *rr.comp->u.complex->selectAlternativeSyntax = 0;
+ rr.comp->u.complex->num_dbSpecific = 0;
+ rr.comp->u.complex->dbSpecific = 0;
+ rr.comp->u.complex->num_recordSyntax = 0;
+ rr.comp->u.complex->recordSyntax = 0;
+
+ rr.comp->u.complex->generic = (Z_Specification *)
+ odr_malloc(assoc->decode, sizeof(Z_Specification));
+ rr.comp->u.complex->generic->which = Z_Schema_uri;
+ rr.comp->u.complex->generic->schema.uri = srw_req->recordSchema;
+ rr.comp->u.complex->generic->elementSpec = 0;
+
+ rr.stream = assoc->encode;
+ rr.print = assoc->print;
+
+ rr.basename = 0;
+ rr.len = 0;
+ rr.record = 0;
+ rr.last_in_set = 0;
+ rr.output_format = VAL_TEXT_XML;
+ rr.output_format_raw = 0;
+ rr.errcode = 0;
+ rr.errstring = 0;
+ rr.surrogate_flag = 0;
+ rr.schema = srw_req->recordSchema;
+
+ if (!assoc->init->bend_fetch)
+ return 1;
+
+ (*assoc->init->bend_fetch)(assoc->backend, &rr);
+
+ if (rr.len >= 0)
+ {
+ record->recordData_buf = rr.record;
+ record->recordData_len = rr.len;
+ record->recordPosition = odr_intdup(o, pos);
+ if (rr.schema)
+ record->recordSchema = odr_strdup(o, rr.schema);
+ else
+ record->recordSchema = 0;
+ }
+ return rr.errcode;
+}
+
+static void srw_bend_search(association *assoc, request *req,
+ Z_SRW_searchRetrieveRequest *srw_req,
+ Z_SRW_searchRetrieveResponse *srw_res)
+{
+ int srw_error = 0;
+ bend_search_rr rr;
+ Z_External *ext;
+
+ yaz_log(LOG_LOG, "Got SRW SearchRetrieveRequest");
+ yaz_log(LOG_DEBUG, "srw_bend_search");
+ if (!assoc->init)
+ {
+ yaz_log(LOG_DEBUG, "srw_bend_init");
+ if (!srw_bend_init(assoc))
+ {
+ srw_error = 3; /* assume Authentication error */
+
+ srw_res->num_diagnostics = 1;
+ srw_res->diagnostics = (Z_SRW_diagnostic *)
+ odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
+ srw_res->diagnostics[0].code =
+ odr_intdup(assoc->encode, srw_error);
+ srw_res->diagnostics[0].details = 0;
+ return;
+ }
+ }
+
+ rr.setname = "default";
+ rr.replace_set = 1;
+ rr.num_bases = 1;
+ rr.basenames = &srw_req->database;
+ rr.referenceId = 0;
+
+ rr.query = (Z_Query *) odr_malloc (assoc->decode, sizeof(*rr.query));
+
+ if (srw_req->query_type == Z_SRW_query_type_cql)
+ {
+ ext = (Z_External *) odr_malloc(assoc->decode, sizeof(*ext));
+ ext->direct_reference = odr_getoidbystr(assoc->decode,
+ "1.2.840.10003.16.2");
+ ext->indirect_reference = 0;
+ ext->descriptor = 0;
+ ext->which = Z_External_CQL;
+ ext->u.cql = srw_req->query.cql;
+
+ rr.query->which = Z_Query_type_104;
+ rr.query->u.type_104 = ext;
+ }
+ else if (srw_req->query_type == Z_SRW_query_type_pqf)
+ {
+ Z_RPNQuery *RPNquery;
+ YAZ_PQF_Parser pqf_parser;
+
+ pqf_parser = yaz_pqf_create ();
+
+ RPNquery = yaz_pqf_parse (pqf_parser, assoc->decode,
+ srw_req->query.pqf);
+ if (!RPNquery)
+ {
+ const char *pqf_msg;
+ size_t off;
+ int code = yaz_pqf_error (pqf_parser, &pqf_msg, &off);
+ yaz_log(LOG_LOG, "%*s^\n", off+4, "");
+ yaz_log(LOG_LOG, "Bad PQF: %s (code %d)\n", pqf_msg, code);
+
+ srw_error = 10;
+ }
+
+ rr.query->which = Z_Query_type_1;
+ rr.query->u.type_1 = RPNquery;
+
+ yaz_pqf_destroy (pqf_parser);
+ }
+ else
+ srw_error = 11;
+
+ if (!srw_error && srw_req->sort_type != Z_SRW_sort_type_none)
+ srw_error = 80;
+
+ if (!srw_error && !assoc->init->bend_search)
+ srw_error = 1;
+
+ if (srw_error)
+ {
+ yaz_log(LOG_DEBUG, "srw_bend_search returned SRW error %d", srw_error);
+ srw_res->num_diagnostics = 1;
+ srw_res->diagnostics = (Z_SRW_diagnostic *)
+ odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
+ srw_res->diagnostics[0].code =
+ odr_intdup(assoc->encode, srw_error);
+ srw_res->diagnostics[0].details = 0;
+ return;
+ }
+
+ rr.stream = assoc->encode;
+ rr.decode = assoc->decode;
+ rr.print = assoc->print;
+ rr.request = req;
+ rr.association = assoc;
+ rr.fd = 0;
+ rr.hits = 0;
+ rr.errcode = 0;
+ rr.errstring = 0;
+ rr.search_info = 0;
+ yaz_log_zquery(rr.query);
+ (assoc->init->bend_search)(assoc->backend, &rr);
+ srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
+ if (rr.errcode)
+ {
+ yaz_log(LOG_DEBUG, "bend_search returned Bib-1 code %d", rr.errcode);
+ srw_res->num_diagnostics = 1;
+ srw_res->diagnostics = (Z_SRW_diagnostic *)
+ odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
+ srw_res->diagnostics[0].code =
+ odr_intdup(assoc->encode,
+ yaz_diag_bib1_to_srw (rr.errcode));
+ srw_res->diagnostics[0].details = rr.errstring;
+ yaz_log(LOG_DEBUG, "srw_bend_search returned SRW error %d",
+ *srw_res->diagnostics[0].code);
+
+ }
+ else
+ {
+ int number = srw_req->maximumRecords ? *srw_req->maximumRecords : 0;
+ int start = srw_req->startRecord ? *srw_req->startRecord : 1;
+
+ yaz_log(LOG_LOG, "Request to pack %d+%d out of %d",
+ start, number, rr.hits);
+
+ srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
+ if (number > 0)
+ {
+ int i;
+
+ if (start > rr.hits)
+ {
+ yaz_log(LOG_LOG, "Request out or range");
+ }
+ else
+ {
+ int j = 0;
+ int packing = Z_SRW_recordPacking_string;
+ if (start + number > rr.hits)
+ number = rr.hits - start + 1;
+ if (srw_req->recordPacking &&
+ !strcmp(srw_req->recordPacking, "xml"))
+ packing = Z_SRW_recordPacking_XML;
+ srw_res->records = (Z_SRW_record *)
+ odr_malloc(assoc->encode,
+ number * sizeof(*srw_res->records));
+ for (i = 0; i<number; i++)
+ {
+ int errcode;
+
+ srw_res->records[j].recordPacking = packing;
+ srw_res->records[j].recordData_buf = 0;
+ yaz_log(LOG_DEBUG, "srw_bend_fetch %d", i+start);
+ errcode = srw_bend_fetch(assoc, i+start, srw_req,
+ srw_res->records + j);
+ if (errcode)
+ {
+ srw_res->num_diagnostics = 1;
+ srw_res->diagnostics = (Z_SRW_diagnostic *)
+ odr_malloc(assoc->encode,
+ sizeof(*srw_res->diagnostics));
+ srw_res->diagnostics[0].code =
+ odr_intdup(assoc->encode,
+ yaz_diag_bib1_to_srw (errcode));
+ srw_res->diagnostics[0].details = rr.errstring;
+ break;
+ }
+ if (srw_res->records[j].recordData_buf)
+ j++;
+ }
+ srw_res->num_records = j;
+ if (!j)
+ srw_res->records = 0;
+ }
+ }
+ }
+}
+
+
+static void srw_bend_explain(association *assoc, request *req,
+ Z_SRW_explainRequest *srw_req,
+ Z_SRW_explainResponse *srw_res)
+{
+ yaz_log(LOG_LOG, "Got SRW ExplainRequest");
+ if (!assoc->init)
+ {
+ yaz_log(LOG_DEBUG, "srw_bend_init");
+ if (!srw_bend_init(assoc))
+ return;
+ }
+ if (assoc->init && assoc->init->bend_explain)
+ {
+ bend_explain_rr rr;
+
+ rr.stream = assoc->encode;
+ rr.decode = assoc->decode;
+ rr.print = assoc->print;
+ rr.explain_buf = 0;
+ (*assoc->init->bend_explain)(assoc->backend, &rr);
+ if (rr.explain_buf)
+ {
+ srw_res->explainData_buf = rr.explain_buf;
+ srw_res->explainData_len = strlen(rr.explain_buf);
+ }
+ }
+}
+
+static int hex_digit (int ch)
+{
+ if (ch >= '0' && ch <= '9')
+ return ch - '0';
+ else if (ch >= 'a' && ch <= 'f')
+ return ch - 'a'+10;
+ else if (ch >= 'A' && ch <= 'F')
+ return ch - 'A'+10;
+ return 0;
+}
+
+static char *uri_val(const char *path, const char *name, ODR o)
+{
+ size_t nlen = strlen(name);
+ if (*path != '?')
+ return 0;
+ path++;
+ while (path && *path)
+ {
+ const char *p1 = strchr(path, '=');
+ if (!p1)
+ break;
+ if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen))
+ {
+ size_t i = 0;
+ char *ret;
+
+ path = p1 + 1;
+ p1 = strchr(path, '&');
+ if (!p1)
+ p1 = strlen(path) + path;
+ ret = odr_malloc(o, p1 - path + 1);
+ while (*path && *path != '&')
+ {
+ if (*path == '+')
+ {
+ ret[i++] = ' ';
+ path++;
+ }
+ else if (*path == '%' && path[1] && path[2])
+ {
+ ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
+ path = path + 3;
+ }
+ else
+ ret[i++] = *path++;
+ }
+ ret[i] = '\0';
+ return ret;
+ }
+ path = strchr(p1, '&');
+ if (path)
+ path++;
+ }
+ return 0;
+}
+
+void uri_val_int(const char *path, const char *name, ODR o, int **intp)
+{
+ const char *v = uri_val(path, name, o);
+ if (v)
+ *intp = odr_intdup(o, atoi(v));
+}
+
+static void process_http_request(association *assoc, request *req)
+{
+ Z_HTTP_Request *hreq = req->gdu_request->u.HTTP_Request;
+ ODR o = assoc->encode;
+ Z_GDU *p = 0;
+ Z_HTTP_Response *hres = 0;
+ int keepalive = 1;
+
+ if (!strcmp(hreq->method, "GET"))
+ {
+ char *db = "Default";
+ const char *p0 = hreq->path, *p1;
+#if HAVE_XML2
+ int ret = -1;
+ char *charset = 0;
+ Z_SOAP *soap_package = 0;
+ static Z_SOAP_Handler soap_handlers[2] = {
+ {"http://www.loc.gov/zing/srw/v1.0/", 0,
+ (Z_SOAP_fun) yaz_srw_codec},
+ {0, 0, 0}
+ };
+#endif
+
+ if (*p0 == '/')
+ p0++;
+ p1 = strchr(p0, '?');
+ if (!p1)
+ p1 = p0 + strlen(p0);
+ if (p1 != p0)
+ {
+ db = odr_malloc(assoc->decode, p1 - p0 + 1);
+ memcpy (db, p0, p1 - p0);
+ db[p1 - p0] = '\0';
+ }
+#if HAVE_XML2
+ if (p1 && *p1 == '?' && p1[1])
+ {
+ Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_searchRetrieve_response);
+ Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_searchRetrieve_request);
+ char *query = uri_val(p1, "query", o);
+ char *pQuery = uri_val(p1, "pQuery", o);
+ char *sortKeys = uri_val(p1, "sortKeys", o);
+
+ if (query)
+ {
+ sr->u.request->query_type = Z_SRW_query_type_cql;
+ sr->u.request->query.cql = query;
+ }
+ if (pQuery)
+ {
+ sr->u.request->query_type = Z_SRW_query_type_pqf;
+ sr->u.request->query.pqf = pQuery;
+ }
+ if (sortKeys)
+ {
+ sr->u.request->sort_type = Z_SRW_sort_type_sort;
+ sr->u.request->sort.sortKeys = sortKeys;
+ }
+ sr->u.request->recordSchema = uri_val(p1, "recordSchema", o);
+ sr->u.request->recordPacking = uri_val(p1, "recordPacking", o);
+ if (!sr->u.request->recordPacking)
+ sr->u.request->recordPacking = "xml";
+ uri_val_int(p1, "maximumRecords", o,
+ &sr->u.request->maximumRecords);
+ uri_val_int(p1, "startRecord", o,
+ &sr->u.request->startRecord);
+ if (sr->u.request->startRecord)
+ yaz_log(LOG_LOG, "startRecord=%d", *sr->u.request->startRecord);
+ sr->u.request->database = db;
+ srw_bend_search(assoc, req, sr->u.request, res->u.response);
+
+ soap_package = odr_malloc(o, sizeof(*soap_package));
+ soap_package->which = Z_SOAP_generic;
+
+ soap_package->u.generic =
+ odr_malloc(o, sizeof(*soap_package->u.generic));
+
+ soap_package->u.generic->p = res;
+ soap_package->u.generic->ns = soap_handlers[0].ns;
+ soap_package->u.generic->no = 0;
+
+ soap_package->ns = "SRU";
+
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+
+ ret = z_soap_codec_enc(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset);
+ if (!charset)
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
+ else
+ {
+ char ctype[60];
+ strcpy(ctype, "text/xml; charset=");
+ strcat(ctype, charset);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
+ }
+
+ }
+ else
+ {
+ Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_explain_response);
+ Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_explain_request);
+
+ srw_bend_explain(assoc, req, sr->u.explain_request,
+ res->u.explain_response);
+
+ if (res->u.explain_response->explainData_buf)
+ {
+ soap_package = odr_malloc(o, sizeof(*soap_package));
+ soap_package->which = Z_SOAP_generic;
+
+ soap_package->u.generic =
+ odr_malloc(o, sizeof(*soap_package->u.generic));
+
+ soap_package->u.generic->p = res;
+ soap_package->u.generic->ns = soap_handlers[0].ns;
+ soap_package->u.generic->no = 0;
+
+ soap_package->ns = "SRU";
+
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+
+ ret = z_soap_codec_enc(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset);
+ if (!charset)
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
+ else
+ {
+ char ctype[60];
+ strcpy(ctype, "text/xml; charset=");
+ strcat(ctype, charset);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type",
+ ctype);
+ }
+ }
+ }
+#endif
+#ifdef DOCDIR
+ if (strlen(hreq->path) >= 5 && strlen(hreq->path) < 80 &&
+ !memcmp(hreq->path, "/doc/", 5))
+ {
+ FILE *f;
+ char fpath[120];
+
+ strcpy(fpath, DOCDIR);
+ strcat(fpath, hreq->path+4);
+ f = fopen(fpath, "rb");
+ if (f) {
+ struct stat sbuf;
+ if (fstat(fileno(f), &sbuf) || !S_ISREG(sbuf.st_mode))
+ {
+ fclose(f);
+ f = 0;
+ }
+ }
+ if (f)
+ {
+ long sz;
+ fseek(f, 0L, SEEK_END);
+ sz = ftell(f);
+ if (sz >= 0 && sz < 500000)
+ {
+ const char *ctype = "application/octet-stream";
+ const char *cp;
+
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+ hres->content_buf = (char *) odr_malloc(o, sz + 1);
+ hres->content_len = sz;
+ fseek(f, 0L, SEEK_SET);
+ fread(hres->content_buf, 1, sz, f);
+ if ((cp = strrchr(fpath, '.'))) {
+ cp++;
+ if (!strcmp(cp, "png"))
+ ctype = "image/png";
+ else if (!strcmp(cp, "gif"))
+ ctype = "image/gif";
+ else if (!strcmp(cp, "xml"))
+ ctype = "text/xml";
+ else if (!strcmp(cp, "html"))
+ ctype = "text/html";
+ }
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
+ }
+ fclose(f);
+ }
+ }
+#endif
+
+#if 0
+ if (!strcmp(hreq->path, "/"))
+ {
+#ifdef DOCDIR
+ struct stat sbuf;
+#endif
+ const char *doclink = "";
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+ hres->content_buf = (char *) odr_malloc(o, 400);
+#ifdef DOCDIR
+ if (stat(DOCDIR "/yaz.html", &sbuf) == 0 && S_ISREG(sbuf.st_mode))
+ doclink = "<P><A HREF=\"/doc/yaz.html\">Documentation</A></P>";
+#endif
+ sprintf (hres->content_buf,
+ "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
+ "<HTML>\n"
+ " <HEAD>\n"
+ " <TITLE>YAZ " YAZ_VERSION "</TITLE>\n"
+ " </HEAD>\n"
+ " <BODY>\n"
+ " <P><A HREF=\"http://www.indexdata.dk/yaz/\">YAZ</A> "
+ YAZ_VERSION "</P>\n"
+ "%s"
+ " </BODY>\n"
+ "</HTML>\n", doclink);
+ hres->content_len = strlen(hres->content_buf);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
+ }
+#endif
+
+ if (!p)
+ {
+ p = z_get_HTTP_Response(o, 404);
+ }
+ }
+ else if (!strcmp(hreq->method, "POST"))
+ {
+ const char *content_type = z_HTTP_header_lookup(hreq->headers,
+ "Content-Type");
+ if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+ {
+ Z_SOAP *soap_package = 0;
+ int ret = -1;
+ int http_code = 500;
+ const char *charset_p = 0;
+ char *charset = 0;
+
+ static Z_SOAP_Handler soap_handlers[2] = {
+#if HAVE_XML2
+ {"http://www.loc.gov/zing/srw/v1.0/", 0,
+ (Z_SOAP_fun) yaz_srw_codec},
+#endif
+ {0, 0, 0}
+ };
+ if ((charset_p = strstr(content_type, "; charset=")))
+ {
+ int i = 0;
+ charset_p += 10;
+ while (i < 20 && charset_p[i] &&
+ !strchr("; \n\r", charset_p[i]))
+ i++;
+ charset = odr_malloc(assoc->encode, i+1);
+ memcpy(charset, charset_p, i);
+ charset[i] = '\0';
+ yaz_log(LOG_LOG, "SOAP encoding %s", charset);
+ }
+ ret = z_soap_codec(assoc->decode, &soap_package,
+ &hreq->content_buf, &hreq->content_len,
+ soap_handlers);
+#if HAVE_XML2
+ if (!ret && soap_package->which == Z_SOAP_generic &&
+ soap_package->u.generic->no == 0)
+ {
+ /* SRW package */
+ Z_SRW_PDU *sr = soap_package->u.generic->p;
+
+ if (sr->which == Z_SRW_searchRetrieve_request)
+ {
+ Z_SRW_PDU *res =
+ yaz_srw_get(assoc->encode,
+ Z_SRW_searchRetrieve_response);
+
+ if (!sr->u.request->database)
+ {
+ const char *p0 = hreq->path, *p1;
+ if (*p0 == '/')
+ p0++;
+ p1 = strchr(p0, '?');
+ if (!p1)
+ p1 = p0 + strlen(p0);
+ if (p1 != p0)
+ {
+ sr->u.request->database =
+ odr_malloc(assoc->decode, p1 - p0 + 1);
+ memcpy (sr->u.request->database, p0, p1 - p0);
+ sr->u.request->database[p1 - p0] = '\0';
+ }
+ else
+ sr->u.request->database = "Default";
+ }
+ srw_bend_search(assoc, req, sr->u.request,
+ res->u.response);
+
+ soap_package->u.generic->p = res;
+ http_code = 200;
+ }
+ else if (sr->which == Z_SRW_explain_request)
+ {
+ Z_SRW_PDU *res =
+ yaz_srw_get(assoc->encode, Z_SRW_explain_response);
+
+ srw_bend_explain(assoc, req, sr->u.explain_request,
+ res->u.explain_response);
+ if (!res->u.explain_response->explainData_buf)
+ {
+ z_soap_error(assoc->encode, soap_package,
+ "SOAP-ENV:Client", "Explain Not Supported", 0);
+ }
+ else
+ {
+ soap_package->u.generic->p = res;
+ http_code = 200;
+ }
+ }
+ else
+ {
+ z_soap_error(assoc->encode, soap_package,
+ "SOAP-ENV:Client", "Bad method", 0);
+ }
+ }
+#endif
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+ ret = z_soap_codec_enc(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset);
+ hres->code = http_code;
+ if (!charset)
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
+ else
+ {
+ char ctype[60];
+ strcpy(ctype, "text/xml; charset=");
+ strcat(ctype, charset);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
+ }
+ }
+ if (!p) /* still no response ? */
+ p = z_get_HTTP_Response(o, 500);
+ }
+ else
+ {
+ p = z_get_HTTP_Response(o, 405);
+ hres = p->u.HTTP_Response;
+
+ z_HTTP_header_add(o, &hres->headers, "Allow", "GET, POST");
+ }
+ hres = p->u.HTTP_Response;
+ if (!strcmp(hreq->version, "1.0"))
+ {
+ const char *v = z_HTTP_header_lookup(hreq->headers, "Connection");
+ if (v && !strcmp(v, "Keep-Alive"))
+ keepalive = 1;
+ else
+ keepalive = 0;
+ hres->version = "1.0";
+ }
+ else
+ {
+ const char *v = z_HTTP_header_lookup(hreq->headers, "Connection");
+ if (v && !strcmp(v, "close"))
+ keepalive = 0;
+ else
+ keepalive = 1;
+ hres->version = "1.1";
+ }
+ if (!keepalive)
+ {
+ z_HTTP_header_add(o, &hres->headers, "Connection", "close");
+ assoc->state = ASSOC_DEAD;
+ }
+ else
+ {
+ int t;
+ const char *alive = z_HTTP_header_lookup(hreq->headers, "Keep-Alive");
+
+ if (alive && isdigit(*alive))
+ t = atoi(alive);
+ else
+ t = 15;
+ if (t < 0 || t > 3600)
+ t = 3600;
+ iochan_settimeout(assoc->client_chan,t);
+ z_HTTP_header_add(o, &hres->headers, "Connection", "Keep-Alive");
+ }
+ process_gdu_response(assoc, req, p);
+}
+
+static void process_gdu_request(association *assoc, request *req)
+{
+ if (req->gdu_request->which == Z_GDU_Z3950)
+ {
+ char *msg = 0;
+ req->apdu_request = req->gdu_request->u.z3950;
+ if (process_z_request(assoc, req, &msg) < 0)
+ do_close_req(assoc, Z_Close_systemProblem, msg, req);
+ }
+ else if (req->gdu_request->which == Z_GDU_HTTP_Request)
+ process_http_request(assoc, req);
+ else
+ {
+ do_close_req(assoc, Z_Close_systemProblem, "bad protocol packet", req);
+ }
+}
+
+/*
+ * Initiate request processing.
+ */
+static int process_z_request(association *assoc, request *req, char **msg)
+{
+ int fd = -1;
+ Z_APDU *res;
+ int retval;
+
+ *msg = "Unknown Error";
+ assert(req && req->state == REQUEST_IDLE);
+ if (req->apdu_request->which != Z_APDU_initRequest && !assoc->init)
+ {
+ *msg = "Missing InitRequest";
+ return -1;
+ }
+ switch (req->apdu_request->which)
+ {
+ case Z_APDU_initRequest:
+ iochan_settimeout(assoc->client_chan,
+ statserv_getcontrol()->idle_timeout * 60);
+ res = process_initRequest(assoc, req); break;
+ case Z_APDU_searchRequest:
+ res = process_searchRequest(assoc, req, &fd); break;
+ case Z_APDU_presentRequest:
+ res = process_presentRequest(assoc, req, &fd); break;
+ case Z_APDU_scanRequest:
+ if (assoc->init->bend_scan)
+ res = process_scanRequest(assoc, req, &fd);
+ else
+ {
+ *msg = "Cannot handle Scan APDU";
+ return -1;
+ }
+ break;
+ case Z_APDU_extendedServicesRequest:
+ if (assoc->init->bend_esrequest)
+ res = process_ESRequest(assoc, req, &fd);
+ else
+ {
+ *msg = "Cannot handle Extended Services APDU";
+ return -1;
+ }
+ break;
+ case Z_APDU_sortRequest:
+ if (assoc->init->bend_sort)
+ res = process_sortRequest(assoc, req, &fd);
+ else
+ {
+ *msg = "Cannot handle Sort APDU";
+ return -1;
+ }
+ break;
+ case Z_APDU_close:
+ process_close(assoc, req);
+ return 0;
+ case Z_APDU_deleteResultSetRequest:
+ if (assoc->init->bend_delete)
+ res = process_deleteRequest(assoc, req, &fd);
+ else
+ {
+ *msg = "Cannot handle Delete APDU";
+ return -1;
+ }
+ break;
+ case Z_APDU_segmentRequest:
+ if (assoc->init->bend_segment)
+ {
+ res = process_segmentRequest (assoc, req);
+ }
+ else
+ {
+ *msg = "Cannot handle Segment APDU";
+ return -1;
+ }
+ break;
+ default:
+ *msg = "Bad APDU received";
+ return -1;
+ }
+ if (res)
+ {
+ yaz_log(LOG_DEBUG, " result immediately available");
+ retval = process_z_response(assoc, req, res);
+ }
+ else if (fd < 0)
+ {
+ yaz_log(LOG_DEBUG, " result unavailble");
+ retval = 0;
+ }
+ else /* no result yet - one will be provided later */
+ {
+ IOCHAN chan;
+
+ /* Set up an I/O handler for the fd supplied by the backend */
+
+ yaz_log(LOG_DEBUG, " establishing handler for result");
+ req->state = REQUEST_PENDING;
+ if (!(chan = iochan_create(fd, backend_response, EVENT_INPUT)))
+ abort();
+ iochan_setdata(chan, assoc);
+ retval = 0;
+ }
+ return retval;
+}
+
+/*
+ * Handle message from the backend.
+ */
+void backend_response(IOCHAN i, int event)
+{
+ association *assoc = (association *)iochan_getdata(i);
+ request *req = request_head(&assoc->incoming);
+ Z_APDU *res;
+ int fd;
+
+ yaz_log(LOG_DEBUG, "backend_response");
+ assert(assoc && req && req->state != REQUEST_IDLE);
+ /* determine what it is we're waiting for */
+ switch (req->apdu_request->which)
+ {
+ case Z_APDU_searchRequest:
+ res = response_searchRequest(assoc, req, 0, &fd); break;
+#if 0
+ case Z_APDU_presentRequest:
+ res = response_presentRequest(assoc, req, 0, &fd); break;
+ case Z_APDU_scanRequest:
+ res = response_scanRequest(assoc, req, 0, &fd); break;
+#endif
+ default:
+ yaz_log(LOG_WARN, "Serious programmer's lapse or bug");
+ abort();
+ }
+ if ((res && process_z_response(assoc, req, res) < 0) || fd < 0)
+ {
+ yaz_log(LOG_LOG, "Fatal error when talking to backend");
+ do_close(assoc, Z_Close_systemProblem, 0);
+ iochan_destroy(i);
+ return;
+ }
+ else if (!res) /* no result yet - try again later */
+ {
+ yaz_log(LOG_DEBUG, " no result yet");
+ iochan_setfd(i, fd); /* in case fd has changed */
+ }
+}
+
+/*
+ * Encode response, and transfer the request structure to the outgoing queue.
+ */
+static int process_gdu_response(association *assoc, request *req, Z_GDU *res)
+{
+ odr_setbuf(assoc->encode, req->response, req->size_response, 1);
+
+ if (assoc->print && !z_GDU(assoc->print, &res, 0, 0))
+ {
+ yaz_log(LOG_WARN, "ODR print error: %s",
+ odr_errmsg(odr_geterror(assoc->print)));
+ odr_reset(assoc->print);
+ }
+ if (!z_GDU(assoc->encode, &res, 0, 0))
+ {
+ yaz_log(LOG_WARN, "ODR error when encoding PDU: %s [element %s]",
+ odr_errmsg(odr_geterror(assoc->decode)),
+ odr_getelement(assoc->decode));
+ request_release(req);
+ return -1;
+ }
+ req->response = odr_getbuf(assoc->encode, &req->len_response,
+ &req->size_response);
+ odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */
+ odr_reset(assoc->encode);
+ req->state = REQUEST_IDLE;
+ request_enq(&assoc->outgoing, req);
+ /* turn the work over to the ir_session handler */
+ iochan_setflag(assoc->client_chan, EVENT_OUTPUT);
+ assoc->cs_put_mask = EVENT_OUTPUT;
+ /* Is there more work to be done? give that to the input handler too */
+#if 1
+ if (request_head(&assoc->incoming))
+ {
+ yaz_log (LOG_DEBUG, "more work to be done");
+ iochan_setevent(assoc->client_chan, EVENT_WORK);
+ }
+#endif
+ return 0;
+}
+
+/*
+ * Encode response, and transfer the request structure to the outgoing queue.
+ */
+static int process_z_response(association *assoc, request *req, Z_APDU *res)
+{
+ Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*res));
+ gres->which = Z_GDU_Z3950;
+ gres->u.z3950 = res;
+
+ return process_gdu_response(assoc, req, gres);
+}
+
+
+/*
+ * Handle init request.
+ * At the moment, we don't check the options
+ * anywhere else in the code - we just try not to do anything that would
+ * break a naive client. We'll toss 'em into the association block when
+ * we need them there.
+ */
+static Z_APDU *process_initRequest(association *assoc, request *reqb)
+{
+ statserv_options_block *cb = statserv_getcontrol();
+ Z_InitRequest *req = reqb->apdu_request->u.initRequest;
+ Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_initResponse);
+ Z_InitResponse *resp = apdu->u.initResponse;
+ bend_initresult *binitres;
+
+ char options[140];
+
+ yaz_log(LOG_LOG, "Got initRequest");
+ if (req->implementationId)
+ yaz_log(LOG_LOG, "Id: %s", req->implementationId);
+ if (req->implementationName)
+ yaz_log(LOG_LOG, "Name: %s", req->implementationName);
+ if (req->implementationVersion)
+ yaz_log(LOG_LOG, "Version: %s", req->implementationVersion);
+
+ assoc_init_reset(assoc);
+
+ assoc->init->auth = req->idAuthentication;
+ assoc->init->referenceId = req->referenceId;
+
+ if (ODR_MASK_GET(req->options, Z_Options_negotiationModel))
+ {
+ Z_CharSetandLanguageNegotiation *negotiation =
+ yaz_get_charneg_record (req->otherInfo);
+ if (negotiation->which == Z_CharSetandLanguageNegotiation_proposal)
+ assoc->init->charneg_request = negotiation;
+ }
+
+ if (!(binitres = (*cb->bend_init)(assoc->init)))
+ {
+ yaz_log(LOG_WARN, "Bad response from backend.");
+ return 0;
+ }
+
+ assoc->backend = binitres->handle;
+ if ((assoc->init->bend_sort))
+ yaz_log (LOG_DEBUG, "Sort handler installed");
+ if ((assoc->init->bend_search))
+ yaz_log (LOG_DEBUG, "Search handler installed");
+ if ((assoc->init->bend_present))
+ yaz_log (LOG_DEBUG, "Present handler installed");
+ if ((assoc->init->bend_esrequest))
+ yaz_log (LOG_DEBUG, "ESRequest handler installed");
+ if ((assoc->init->bend_delete))
+ yaz_log (LOG_DEBUG, "Delete handler installed");
+ if ((assoc->init->bend_scan))
+ yaz_log (LOG_DEBUG, "Scan handler installed");
+ if ((assoc->init->bend_segment))
+ yaz_log (LOG_DEBUG, "Segment handler installed");
+
+ resp->referenceId = req->referenceId;
+ *options = '\0';
+ /* let's tell the client what we can do */
+ if (ODR_MASK_GET(req->options, Z_Options_search))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_search);
+ strcat(options, "srch");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_present))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_present);
+ strcat(options, " prst");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_delSet) &&
+ assoc->init->bend_delete)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_delSet);
+ strcat(options, " del");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_extendedServices) &&
+ assoc->init->bend_esrequest)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_extendedServices);
+ strcat (options, " extendedServices");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_namedResultSets))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_namedResultSets);
+ strcat(options, " namedresults");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_scan) && assoc->init->bend_scan)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_scan);
+ strcat(options, " scan");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_concurrentOperations))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_concurrentOperations);
+ strcat(options, " concurrop");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_sort) && assoc->init->bend_sort)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_sort);
+ strcat(options, " sort");
+ }
+
+ if (ODR_MASK_GET(req->options, Z_Options_negotiationModel)
+ && assoc->init->charneg_response)
+ {
+ Z_OtherInformation **p;
+ Z_OtherInformationUnit *p0;
+
+ yaz_oi_APDU(apdu, &p);
+
+ if ((p0=yaz_oi_update(p, assoc->encode, NULL, 0, 0))) {
+ ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
+
+ p0->which = Z_OtherInfo_externallyDefinedInfo;
+ p0->information.externallyDefinedInfo =
+ assoc->init->charneg_response;
+ }
+ ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
+ strcat(options, " negotiation");
+ }
+
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_1);
+ assoc->version = 2; /* 1 & 2 are equivalent */
+ }
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_2))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_2);
+ assoc->version = 2;
+ }
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_3))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_3);
+ assoc->version = 3;
+ }
+
+ yaz_log(LOG_LOG, "Negotiated to v%d: %s", assoc->version, options);
+ assoc->maximumRecordSize = *req->maximumRecordSize;
+ if (assoc->maximumRecordSize > control_block->maxrecordsize)
+ assoc->maximumRecordSize = control_block->maxrecordsize;
+ assoc->preferredMessageSize = *req->preferredMessageSize;
+ if (assoc->preferredMessageSize > assoc->maximumRecordSize)
+ assoc->preferredMessageSize = assoc->maximumRecordSize;
+
+ resp->preferredMessageSize = &assoc->preferredMessageSize;
+ resp->maximumRecordSize = &assoc->maximumRecordSize;
+
+ resp->implementationName = "GFS/YAZ";
+
+ if (assoc->init->implementation_id)
+ {
+ char *nv = (char *)
+ odr_malloc (assoc->encode,
+ strlen(assoc->init->implementation_id) + 10 +
+ strlen(resp->implementationId));
+ sprintf (nv, "%s / %s",
+ resp->implementationId, assoc->init->implementation_id);
+ resp->implementationId = nv;
+ }
+ if (assoc->init->implementation_name)
+ {
+ char *nv = (char *)
+ odr_malloc (assoc->encode,
+ strlen(assoc->init->implementation_name) + 10 +
+ strlen(resp->implementationName));
+ sprintf (nv, "%s / %s",
+ resp->implementationName, assoc->init->implementation_name);
+ resp->implementationName = nv;
+ }
+ if (assoc->init->implementation_version)
+ {
+ char *nv = (char *)
+ odr_malloc (assoc->encode,
+ strlen(assoc->init->implementation_version) + 10 +
+ strlen(resp->implementationVersion));
+ sprintf (nv, "YAZ %s / %s",
+ resp->implementationVersion,
+ assoc->init->implementation_version);
+ resp->implementationVersion = nv;
+ }
+
+ if (binitres->errcode)
+ {
+ yaz_log(LOG_LOG, "Connection rejected by backend.");
+ *resp->result = 0;
+ assoc->state = ASSOC_DEAD;
+ resp->userInformationField = init_diagnostics(assoc->encode,
+ binitres->errcode,
+ binitres->errstring);
+ }
+ else
+ assoc->state = ASSOC_UP;
+ return apdu;
+}
+
+/*
+ * Diagnostic in default format, to be returned as either a surrogate
+ * or non-surrogate diagnostic in the context of an open session, or
+ * as User-information when an Init is refused.
+ */
+static Z_DefaultDiagFormat *justdiag(ODR odr, int error, char *addinfo)
+{
+ int *err = odr_intdup(odr, error);
+ Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
+ odr_malloc (odr, sizeof(*dr));
+
+ yaz_log(LOG_LOG, "[%d] %s%s%s", error, diagbib1_str(error),
+ addinfo ? " -- " : "", addinfo ? addinfo : "");
+
+ dr->diagnosticSetId =
+ yaz_oidval_to_z3950oid (odr, CLASS_DIAGSET, VAL_BIB1);
+ dr->condition = err;
+ dr->which = Z_DefaultDiagFormat_v2Addinfo;
+ dr->u.v2Addinfo = odr_strdup (odr, addinfo ? addinfo : "");
+ return dr;
+}
+
+/*
+ * Set the specified `errcode' and `errstring' into a UserInfo-1
+ * external to be returned to the client in accordance with Z35.90
+ * Implementor Agreement 5 (Returning diagnostics in an InitResponse):
+ * http://lcweb.loc.gov/z3950/agency/agree/initdiag.html
+ */
+static Z_External *init_diagnostics(ODR odr, int error, char *addinfo)
+{
+ Z_External *x, *x2;
+ oident oid;
+ Z_OtherInformation *u;
+ Z_OtherInformationUnit *l;
+ Z_DiagnosticFormat *d;
+ Z_DiagnosticFormat_s *e;
+
+ x = (Z_External*) odr_malloc(odr, sizeof *x);
+ x->descriptor = 0;
+ x->indirect_reference = 0;
+ oid.proto = PROTO_Z3950;
+ oid.oclass = CLASS_USERINFO;
+ oid.value = VAL_USERINFO1;
+ x->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
+ x->which = Z_External_userInfo1;
+
+ u = odr_malloc(odr, sizeof *u);
+ x->u.userInfo1 = u;
+ u->num_elements = 1;
+ u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
+ u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
+ l = u->list[0];
+ l->category = 0;
+ l->which = Z_OtherInfo_externallyDefinedInfo;
+
+ x2 = (Z_External*) odr_malloc(odr, sizeof *x);
+ l->information.externallyDefinedInfo = x2;
+ x2->descriptor = 0;
+ x2->indirect_reference = 0;
+ oid.oclass = CLASS_DIAGSET;
+ oid.value = VAL_DIAG1;
+ x2->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
+ x2->which = Z_External_diag1;
+
+ d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
+ x2->u.diag1 = d;
+ d->num = 1;
+ d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
+ d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
+ e = d->elements[0];
+
+ e->which = Z_DiagnosticFormat_s_defaultDiagRec;
+ e->u.defaultDiagRec = justdiag(odr, error, addinfo);
+ return x;
+}
+
+/*
+ * nonsurrogate diagnostic record.
+ */
+static Z_Records *diagrec(association *assoc, int error, char *addinfo)
+{
+ Z_Records *rec = (Z_Records *)
+ odr_malloc (assoc->encode, sizeof(*rec));
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic = justdiag(assoc->encode, error, addinfo);
+ return rec;
+}
+
+/*
+ * surrogate diagnostic.
+ */
+static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname,
+ int error, char *addinfo)
+{
+ Z_NamePlusRecord *rec = (Z_NamePlusRecord *)
+ odr_malloc (assoc->encode, sizeof(*rec));
+ Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec));
+
+ yaz_log(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo);
+ rec->databaseName = dbname;
+ rec->which = Z_NamePlusRecord_surrogateDiagnostic;
+ rec->u.surrogateDiagnostic = drec;
+ drec->which = Z_DiagRec_defaultFormat;
+ drec->u.defaultFormat = justdiag(assoc->encode, error, addinfo);
+
+ return rec;
+}
+
+/*
+ * multiple nonsurrogate diagnostics.
+ */
+static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo)
+{
+ Z_DiagRecs *recs = (Z_DiagRecs *)odr_malloc (assoc->encode, sizeof(*recs));
+ int *err = odr_intdup(assoc->encode, error);
+ Z_DiagRec **recp = (Z_DiagRec **)odr_malloc (assoc->encode, sizeof(*recp));
+ Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec));
+ Z_DefaultDiagFormat *rec = (Z_DefaultDiagFormat *)
+ odr_malloc (assoc->encode, sizeof(*rec));
+
+ yaz_log(LOG_DEBUG, "DiagRecs: %d -- %s", error, addinfo ? addinfo : "");
+
+ recs->num_diagRecs = 1;
+ recs->diagRecs = recp;
+ recp[0] = drec;
+ drec->which = Z_DiagRec_defaultFormat;
+ drec->u.defaultFormat = rec;
+
+ rec->diagnosticSetId =
+ yaz_oidval_to_z3950oid (assoc->encode, CLASS_DIAGSET, VAL_BIB1);
+ rec->condition = err;
+
+ rec->which = Z_DefaultDiagFormat_v2Addinfo;
+ rec->u.v2Addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : "");
+ return recs;
+}
+
+static Z_Records *pack_records(association *a, char *setname, int start,
+ int *num, Z_RecordComposition *comp,
+ int *next, int *pres, oid_value format,
+ Z_ReferenceId *referenceId,
+ int *oid)
+{
+ int recno, total_length = 0, toget = *num, dumped_records = 0;
+ Z_Records *records =
+ (Z_Records *) odr_malloc (a->encode, sizeof(*records));
+ Z_NamePlusRecordList *reclist =
+ (Z_NamePlusRecordList *) odr_malloc (a->encode, sizeof(*reclist));
+ Z_NamePlusRecord **list =
+ (Z_NamePlusRecord **) odr_malloc (a->encode, sizeof(*list) * toget);
+
+ records->which = Z_Records_DBOSD;
+ records->u.databaseOrSurDiagnostics = reclist;
+ reclist->num_records = 0;
+ reclist->records = list;
+ *pres = Z_PRES_SUCCESS;
+ *num = 0;
+ *next = 0;
+
+ yaz_log(LOG_LOG, "Request to pack %d+%d+%s", start, toget, setname);
+ yaz_log(LOG_DEBUG, "pms=%d, mrs=%d", a->preferredMessageSize,
+ a->maximumRecordSize);
+ for (recno = start; reclist->num_records < toget; recno++)
+ {
+ bend_fetch_rr freq;
+ Z_NamePlusRecord *thisrec;
+ int this_length = 0;
+ /*
+ * we get the number of bytes allocated on the stream before any
+ * allocation done by the backend - this should give us a reasonable
+ * idea of the total size of the data so far.
+ */
+ total_length = odr_total(a->encode) - dumped_records;
+ freq.errcode = 0;
+ freq.errstring = 0;
+ freq.basename = 0;
+ freq.len = 0;
+ freq.record = 0;
+ freq.last_in_set = 0;
+ freq.setname = setname;
+ freq.surrogate_flag = 0;
+ freq.number = recno;
+ freq.comp = comp;
+ freq.request_format = format;
+ freq.request_format_raw = oid;
+ freq.output_format = format;
+ freq.output_format_raw = 0;
+ freq.stream = a->encode;
+ freq.print = a->print;
+ freq.referenceId = referenceId;
+ freq.schema = 0;
+ (*a->init->bend_fetch)(a->backend, &freq);
+ /* backend should be able to signal whether error is system-wide
+ or only pertaining to current record */
+ if (freq.errcode)
+ {
+ if (!freq.surrogate_flag)
+ {
+ char s[20];
+ *pres = Z_PRES_FAILURE;
+ /* for 'present request out of range',
+ set addinfo to record position if not set */
+ if (freq.errcode == 13 && freq.errstring == 0)
+ {
+ sprintf (s, "%d", recno);
+ freq.errstring = s;
+ }
+ return diagrec(a, freq.errcode, freq.errstring);
+ }
+ reclist->records[reclist->num_records] =
+ surrogatediagrec(a, freq.basename, freq.errcode,
+ freq.errstring);
+ reclist->num_records++;
+ *next = freq.last_in_set ? 0 : recno + 1;
+ continue;
+ }
+ if (freq.len >= 0)
+ this_length = freq.len;
+ else
+ this_length = odr_total(a->encode) - total_length;
+ yaz_log(LOG_DEBUG, " fetched record, len=%d, total=%d",
+ this_length, total_length);
+ if (this_length + total_length > a->preferredMessageSize)
+ {
+ /* record is small enough, really */
+ if (this_length <= a->preferredMessageSize)
+ {
+ yaz_log(LOG_DEBUG, " Dropped last normal-sized record");
+ *pres = Z_PRES_PARTIAL_2;
+ break;
+ }
+ /* record can only be fetched by itself */
+ if (this_length < a->maximumRecordSize)
+ {
+ yaz_log(LOG_DEBUG, " Record > prefmsgsz");
+ if (toget > 1)
+ {
+ yaz_log(LOG_DEBUG, " Dropped it");
+ reclist->records[reclist->num_records] =
+ surrogatediagrec(a, freq.basename, 16, 0);
+ reclist->num_records++;
+ *next = freq.last_in_set ? 0 : recno + 1;
+ dumped_records += this_length;
+ continue;
+ }
+ }
+ else /* too big entirely */
+ {
+ yaz_log(LOG_LOG, "Record > maxrcdsz this=%d max=%d", this_length, a->maximumRecordSize);
+ reclist->records[reclist->num_records] =
+ surrogatediagrec(a, freq.basename, 17, 0);
+ reclist->num_records++;
+ *next = freq.last_in_set ? 0 : recno + 1;
+ dumped_records += this_length;
+ continue;
+ }
+ }
+
+ if (!(thisrec = (Z_NamePlusRecord *)
+ odr_malloc(a->encode, sizeof(*thisrec))))
+ return 0;
+ if (!(thisrec->databaseName = (char *)odr_malloc(a->encode,
+ strlen(freq.basename) + 1)))
+ return 0;
+ strcpy(thisrec->databaseName, freq.basename);
+ thisrec->which = Z_NamePlusRecord_databaseRecord;
+
+ if (freq.output_format_raw)
+ {
+ struct oident *ident = oid_getentbyoid(freq.output_format_raw);
+ freq.output_format = ident->value;
+ }
+ thisrec->u.databaseRecord = z_ext_record(a->encode, freq.output_format,
+ freq.record, freq.len);
+ if (!thisrec->u.databaseRecord)
+ return 0;
+ reclist->records[reclist->num_records] = thisrec;
+ reclist->num_records++;
+ *next = freq.last_in_set ? 0 : recno + 1;
+ }
+ *num = reclist->num_records;
+ return records;
+}
+
+static Z_APDU *process_searchRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
+ bend_search_rr *bsrr =
+ (bend_search_rr *)nmem_malloc (reqb->request_mem, sizeof(*bsrr));
+
+ yaz_log(LOG_LOG, "Got SearchRequest.");
+ bsrr->fd = fd;
+ bsrr->request = reqb;
+ bsrr->association = assoc;
+ bsrr->referenceId = req->referenceId;
+ save_referenceId (reqb, bsrr->referenceId);
+
+ yaz_log (LOG_LOG, "ResultSet '%s'", req->resultSetName);
+ if (req->databaseNames)
+ {
+ int i;
+ for (i = 0; i < req->num_databaseNames; i++)
+ yaz_log (LOG_LOG, "Database '%s'", req->databaseNames[i]);
+ }
+ yaz_log_zquery(req->query);
+
+ if (assoc->init->bend_search)
+ {
+ bsrr->setname = req->resultSetName;
+ bsrr->replace_set = *req->replaceIndicator;
+ bsrr->num_bases = req->num_databaseNames;
+ bsrr->basenames = req->databaseNames;
+ bsrr->query = req->query;
+ bsrr->stream = assoc->encode;
+ bsrr->decode = assoc->decode;
+ bsrr->print = assoc->print;
+ bsrr->errcode = 0;
+ bsrr->hits = 0;
+ bsrr->errstring = NULL;
+ bsrr->search_info = NULL;
+ (assoc->init->bend_search)(assoc->backend, bsrr);
+ if (!bsrr->request)
+ return 0;
+ }
+ return response_searchRequest(assoc, reqb, bsrr, fd);
+}
+
+int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;}
+
+/*
+ * Prepare a searchresponse based on the backend results. We probably want
+ * to look at making the fetching of records nonblocking as well, but
+ * so far, we'll keep things simple.
+ * If bsrt is null, that means we're called in response to a communications
+ * event, and we'll have to get the response for ourselves.
+ */
+static Z_APDU *response_searchRequest(association *assoc, request *reqb,
+ bend_search_rr *bsrt, int *fd)
+{
+ Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+ Z_SearchResponse *resp = (Z_SearchResponse *)
+ odr_malloc (assoc->encode, sizeof(*resp));
+ int *nulint = odr_intdup (assoc->encode, 0);
+ bool_t *sr = odr_intdup(assoc->encode, 1);
+ int *next = odr_intdup(assoc->encode, 0);
+ int *none = odr_intdup(assoc->encode, Z_RES_NONE);
+
+ apdu->which = Z_APDU_searchResponse;
+ apdu->u.searchResponse = resp;
+ resp->referenceId = req->referenceId;
+ resp->additionalSearchInfo = 0;
+ resp->otherInfo = 0;
+ *fd = -1;
+ if (!bsrt && !bend_searchresponse(assoc->backend, bsrt))
+ {
+ yaz_log(LOG_FATAL, "Bad result from backend");
+ return 0;
+ }
+ else if (bsrt->errcode)
+ {
+ resp->records = diagrec(assoc, bsrt->errcode, bsrt->errstring);
+ resp->resultCount = nulint;
+ resp->numberOfRecordsReturned = nulint;
+ resp->nextResultSetPosition = nulint;
+ resp->searchStatus = nulint;
+ resp->resultSetStatus = none;
+ resp->presentStatus = 0;
+ }
+ else
+ {
+ int *toget = odr_intdup(assoc->encode, 0);
+ int *presst = odr_intdup(assoc->encode, 0);
+ Z_RecordComposition comp, *compp = 0;
+
+ yaz_log (LOG_LOG, "resultCount: %d", bsrt->hits);
+
+ resp->records = 0;
+ resp->resultCount = &bsrt->hits;
+
+ comp.which = Z_RecordComp_simple;
+ /* how many records does the user agent want, then? */
+ if (bsrt->hits <= *req->smallSetUpperBound)
+ {
+ *toget = bsrt->hits;
+ if ((comp.u.simple = req->smallSetElementSetNames))
+ compp = ∁
+ }
+ else if (bsrt->hits < *req->largeSetLowerBound)
+ {
+ *toget = *req->mediumSetPresentNumber;
+ if (*toget > bsrt->hits)
+ *toget = bsrt->hits;
+ if ((comp.u.simple = req->mediumSetElementSetNames))
+ compp = ∁
+ }
+ else
+ *toget = 0;
+
+ if (*toget && !resp->records)
+ {
+ oident *prefformat;
+ oid_value form;
+
+ if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)))
+ form = VAL_NONE;
+ else
+ form = prefformat->value;
+ resp->records = pack_records(assoc, req->resultSetName, 1,
+ toget, compp, next, presst, form, req->referenceId,
+ req->preferredRecordSyntax);
+ if (!resp->records)
+ return 0;
+ resp->numberOfRecordsReturned = toget;
+ resp->nextResultSetPosition = next;
+ resp->searchStatus = sr;
+ resp->resultSetStatus = 0;
+ resp->presentStatus = presst;
+ }
+ else
+ {
+ if (*resp->resultCount)
+ *next = 1;
+ resp->numberOfRecordsReturned = nulint;
+ resp->nextResultSetPosition = next;
+ resp->searchStatus = sr;
+ resp->resultSetStatus = 0;
+ resp->presentStatus = 0;
+ }
+ }
+ resp->additionalSearchInfo = bsrt->search_info;
+ return apdu;
+}
+
+/*
+ * Maybe we got a little over-friendly when we designed bend_fetch to
+ * get only one record at a time. Some backends can optimise multiple-record
+ * fetches, and at any rate, there is some overhead involved in
+ * all that selecting and hopping around. Problem is, of course, that the
+ * frontend can't know ahead of time how many records it'll need to
+ * fill the negotiated PDU size. Annoying. Segmentation or not, Z/SR
+ * is downright lousy as a bulk data transfer protocol.
+ *
+ * To start with, we'll do the fetching of records from the backend
+ * in one operation: To save some trips in and out of the event-handler,
+ * and to simplify the interface to pack_records. At any rate, asynch
+ * operation is more fun in operations that have an unpredictable execution
+ * speed - which is normally more true for search than for present.
+ */
+static Z_APDU *process_presentRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_PresentRequest *req = reqb->apdu_request->u.presentRequest;
+ oident *prefformat;
+ oid_value form;
+ Z_APDU *apdu;
+ Z_PresentResponse *resp;
+ int *next;
+ int *num;
+
+ yaz_log(LOG_LOG, "Got PresentRequest.");
+
+ if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)))
+ form = VAL_NONE;
+ else
+ form = prefformat->value;
+ resp = (Z_PresentResponse *)odr_malloc (assoc->encode, sizeof(*resp));
+ resp->records = 0;
+ resp->presentStatus = odr_intdup(assoc->encode, 0);
+ if (assoc->init->bend_present)
+ {
+ bend_present_rr *bprr = (bend_present_rr *)
+ nmem_malloc (reqb->request_mem, sizeof(*bprr));
+ bprr->setname = req->resultSetId;
+ bprr->start = *req->resultSetStartPoint;
+ bprr->number = *req->numberOfRecordsRequested;
+ bprr->format = form;
+ bprr->comp = req->recordComposition;
+ bprr->referenceId = req->referenceId;
+ bprr->stream = assoc->encode;
+ bprr->print = assoc->print;
+ bprr->request = reqb;
+ bprr->association = assoc;
+ bprr->errcode = 0;
+ bprr->errstring = NULL;
+ (*assoc->init->bend_present)(assoc->backend, bprr);
+
+ if (!bprr->request)
+ return 0;
+ if (bprr->errcode)
+ {
+ resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
+ *resp->presentStatus = Z_PRES_FAILURE;
+ }
+ }
+ apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+ next = odr_intdup(assoc->encode, 0);
+ num = odr_intdup(assoc->encode, 0);
+
+ apdu->which = Z_APDU_presentResponse;
+ apdu->u.presentResponse = resp;
+ resp->referenceId = req->referenceId;
+ resp->otherInfo = 0;
+
+ if (!resp->records)
+ {
+ *num = *req->numberOfRecordsRequested;
+ resp->records =
+ pack_records(assoc, req->resultSetId, *req->resultSetStartPoint,
+ num, req->recordComposition, next, resp->presentStatus,
+ form, req->referenceId, req->preferredRecordSyntax);
+ }
+ if (!resp->records)
+ return 0;
+ resp->numberOfRecordsReturned = num;
+ resp->nextResultSetPosition = next;
+
+ return apdu;
+}
+
+/*
+ * Scan was implemented rather in a hurry, and with support for only the basic
+ * elements of the service in the backend API. Suggestions are welcome.
+ */
+static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
+{
+ Z_ScanRequest *req = reqb->apdu_request->u.scanRequest;
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+ Z_ScanResponse *res = (Z_ScanResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
+ int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
+ Z_ListEntries *ents = (Z_ListEntries *)
+ odr_malloc (assoc->encode, sizeof(*ents));
+ Z_DiagRecs *diagrecs_p = NULL;
+ oident *attset;
+ bend_scan_rr *bsrr = (bend_scan_rr *)
+ odr_malloc (assoc->encode, sizeof(*bsrr));
+ struct scan_entry *save_entries;
+
+ yaz_log(LOG_LOG, "Got ScanRequest");
+
+ apdu->which = Z_APDU_scanResponse;
+ apdu->u.scanResponse = res;
+ res->referenceId = req->referenceId;
+
+ /* if step is absent, set it to 0 */
+ res->stepSize = odr_intdup(assoc->encode, 0);
+ if (req->stepSize)
+ *res->stepSize = *req->stepSize;
+
+ res->scanStatus = scanStatus;
+ res->numberOfEntriesReturned = numberOfEntriesReturned;
+ res->positionOfTerm = 0;
+ res->entries = ents;
+ ents->num_entries = 0;
+ ents->entries = NULL;
+ ents->num_nonsurrogateDiagnostics = 0;
+ ents->nonsurrogateDiagnostics = NULL;
+ res->attributeSet = 0;
+ res->otherInfo = 0;
+
+ if (req->databaseNames)
+ {
+ int i;
+ for (i = 0; i < req->num_databaseNames; i++)
+ yaz_log (LOG_LOG, "Database '%s'", req->databaseNames[i]);
+ }
+ bsrr->num_bases = req->num_databaseNames;
+ bsrr->basenames = req->databaseNames;
+ bsrr->num_entries = *req->numberOfTermsRequested;
+ bsrr->term = req->termListAndStartPoint;
+ bsrr->referenceId = req->referenceId;
+ bsrr->stream = assoc->encode;
+ bsrr->print = assoc->print;
+ bsrr->step_size = res->stepSize;
+ bsrr->entries = 0;
+ /* Note that version 2.0 of YAZ and older did not set entries ..
+ We do now. And when we do it's easier to extend the scan entry
+ We know that if the scan handler did set entries, it will
+ not know of new member display_term.
+ */
+ if (bsrr->num_entries > 0)
+ {
+ int i;
+ bsrr->entries = odr_malloc(assoc->decode, sizeof(*bsrr->entries) *
+ bsrr->num_entries);
+ for (i = 0; i<bsrr->num_entries; i++)
+ {
+ bsrr->entries[i].term = 0;
+ bsrr->entries[i].occurrences = 0;
+ bsrr->entries[i].errcode = 0;
+ bsrr->entries[i].errstring = 0;
+ bsrr->entries[i].display_term = 0;
+ }
+ }
+ save_entries = bsrr->entries; /* save it so we can compare later */
+
+ if (req->attributeSet &&
+ (attset = oid_getentbyoid(req->attributeSet)) &&
+ (attset->oclass == CLASS_ATTSET || attset->oclass == CLASS_GENERAL))
+ bsrr->attributeset = attset->value;
+ else
+ bsrr->attributeset = VAL_NONE;
+ log_scan_term (req->termListAndStartPoint, bsrr->attributeset);
+ bsrr->term_position = req->preferredPositionInResponse ?
+ *req->preferredPositionInResponse : 1;
+ ((int (*)(void *, bend_scan_rr *))
+ (*assoc->init->bend_scan))(assoc->backend, bsrr);
+ if (bsrr->errcode)
+ diagrecs_p = diagrecs(assoc, bsrr->errcode, bsrr->errstring);
+ else
+ {
+ int i;
+ Z_Entry **tab = (Z_Entry **)
+ odr_malloc (assoc->encode, sizeof(*tab) * bsrr->num_entries);
+
+ if (bsrr->status == BEND_SCAN_PARTIAL)
+ *scanStatus = Z_Scan_partial_5;
+ else
+ *scanStatus = Z_Scan_success;
+ ents->entries = tab;
+ ents->num_entries = bsrr->num_entries;
+ res->numberOfEntriesReturned = &ents->num_entries;
+ res->positionOfTerm = &bsrr->term_position;
+ for (i = 0; i < bsrr->num_entries; i++)
+ {
+ Z_Entry *e;
+ Z_TermInfo *t;
+ Odr_oct *o;
+
+ tab[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e));
+ if (bsrr->entries[i].occurrences >= 0)
+ {
+ e->which = Z_Entry_termInfo;
+ e->u.termInfo = t = (Z_TermInfo *)
+ odr_malloc(assoc->encode, sizeof(*t));
+ t->suggestedAttributes = 0;
+ t->displayTerm = 0;
+ if (save_entries == bsrr->entries &&
+ bsrr->entries[i].display_term)
+ {
+ /* the entries was NOT set by the handler. So it's
+ safe to test for new member display_term. It is
+ NULL'ed by us.
+ */
+ t->displayTerm = odr_strdup(assoc->encode,
+ bsrr->entries[i].display_term);
+ }
+ t->alternativeTerm = 0;
+ t->byAttributes = 0;
+ t->otherTermInfo = 0;
+ t->globalOccurrences = &bsrr->entries[i].occurrences;
+ t->term = (Z_Term *)
+ odr_malloc(assoc->encode, sizeof(*t->term));
+ t->term->which = Z_Term_general;
+ t->term->u.general = o =
+ (Odr_oct *)odr_malloc(assoc->encode, sizeof(Odr_oct));
+ o->buf = (unsigned char *)
+ odr_malloc(assoc->encode, o->len = o->size =
+ strlen(bsrr->entries[i].term));
+ memcpy(o->buf, bsrr->entries[i].term, o->len);
+ yaz_log(LOG_DEBUG, " term #%d: '%s' (%d)", i,
+ bsrr->entries[i].term, bsrr->entries[i].occurrences);
+ }
+ else
+ {
+ Z_DiagRecs *drecs = diagrecs (assoc,
+ bsrr->entries[i].errcode,
+ bsrr->entries[i].errstring);
+ assert (drecs->num_diagRecs == 1);
+ e->which = Z_Entry_surrogateDiagnostic;
+ assert (drecs->diagRecs[0]);
+ e->u.surrogateDiagnostic = drecs->diagRecs[0];
+ }
+ }
+ }
+ if (diagrecs_p)
+ {
+ ents->num_nonsurrogateDiagnostics = diagrecs_p->num_diagRecs;
+ ents->nonsurrogateDiagnostics = diagrecs_p->diagRecs;
+ }
+ return apdu;
+}
+
+static Z_APDU *process_sortRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_SortRequest *req = reqb->apdu_request->u.sortRequest;
+ Z_SortResponse *res = (Z_SortResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ bend_sort_rr *bsrr = (bend_sort_rr *)
+ odr_malloc (assoc->encode, sizeof(*bsrr));
+
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ yaz_log(LOG_LOG, "Got SortRequest.");
+
+ bsrr->num_input_setnames = req->num_inputResultSetNames;
+ bsrr->input_setnames = req->inputResultSetNames;
+ bsrr->referenceId = req->referenceId;
+ bsrr->output_setname = req->sortedResultSetName;
+ bsrr->sort_sequence = req->sortSequence;
+ bsrr->stream = assoc->encode;
+ bsrr->print = assoc->print;
+
+ bsrr->sort_status = Z_SortStatus_failure;
+ bsrr->errcode = 0;
+ bsrr->errstring = 0;
+
+ (*assoc->init->bend_sort)(assoc->backend, bsrr);
+
+ res->referenceId = bsrr->referenceId;
+ res->sortStatus = odr_intdup(assoc->encode, bsrr->sort_status);
+ res->resultSetStatus = 0;
+ if (bsrr->errcode)
+ {
+ Z_DiagRecs *dr = diagrecs (assoc, bsrr->errcode, bsrr->errstring);
+ res->diagnostics = dr->diagRecs;
+ res->num_diagnostics = dr->num_diagRecs;
+ }
+ else
+ {
+ res->num_diagnostics = 0;
+ res->diagnostics = 0;
+ }
+ res->resultCount = 0;
+ res->otherInfo = 0;
+
+ apdu->which = Z_APDU_sortResponse;
+ apdu->u.sortResponse = res;
+ return apdu;
+}
+
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_DeleteResultSetRequest *req =
+ reqb->apdu_request->u.deleteResultSetRequest;
+ Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ bend_delete_rr *bdrr = (bend_delete_rr *)
+ odr_malloc (assoc->encode, sizeof(*bdrr));
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ yaz_log(LOG_LOG, "Got DeleteRequest.");
+
+ bdrr->num_setnames = req->num_resultSetList;
+ bdrr->setnames = req->resultSetList;
+ bdrr->stream = assoc->encode;
+ bdrr->print = assoc->print;
+ bdrr->function = *req->deleteFunction;
+ bdrr->referenceId = req->referenceId;
+ bdrr->statuses = 0;
+ if (bdrr->num_setnames > 0)
+ {
+ int i;
+ bdrr->statuses = (int*)
+ odr_malloc(assoc->encode, sizeof(*bdrr->statuses) *
+ bdrr->num_setnames);
+ for (i = 0; i < bdrr->num_setnames; i++)
+ bdrr->statuses[i] = 0;
+ }
+ (*assoc->init->bend_delete)(assoc->backend, bdrr);
+
+ res->referenceId = req->referenceId;
+
+ res->deleteOperationStatus = odr_intdup(assoc->encode,bdrr->delete_status);
+
+ res->deleteListStatuses = 0;
+ if (bdrr->num_setnames > 0)
+ {
+ int i;
+ res->deleteListStatuses = (Z_ListStatuses *)
+ odr_malloc(assoc->encode, sizeof(*res->deleteListStatuses));
+ res->deleteListStatuses->num = bdrr->num_setnames;
+ res->deleteListStatuses->elements =
+ (Z_ListStatus **)
+ odr_malloc (assoc->encode,
+ sizeof(*res->deleteListStatuses->elements) *
+ bdrr->num_setnames);
+ for (i = 0; i<bdrr->num_setnames; i++)
+ {
+ res->deleteListStatuses->elements[i] =
+ (Z_ListStatus *)
+ odr_malloc (assoc->encode,
+ sizeof(**res->deleteListStatuses->elements));
+ res->deleteListStatuses->elements[i]->status = bdrr->statuses+i;
+ res->deleteListStatuses->elements[i]->id =
+ odr_strdup (assoc->encode, bdrr->setnames[i]);
+
+ }
+ }
+ res->numberNotDeleted = 0;
+ res->bulkStatuses = 0;
+ res->deleteMessage = 0;
+ res->otherInfo = 0;
+
+ apdu->which = Z_APDU_deleteResultSetResponse;
+ apdu->u.deleteResultSetResponse = res;
+ return apdu;
+}
+
+static void process_close(association *assoc, request *reqb)
+{
+ Z_Close *req = reqb->apdu_request->u.close;
+ static char *reasons[] =
+ {
+ "finished",
+ "shutdown",
+ "systemProblem",
+ "costLimit",
+ "resources",
+ "securityViolation",
+ "protocolError",
+ "lackOfActivity",
+ "peerAbort",
+ "unspecified"
+ };
+
+ yaz_log(LOG_LOG, "Got Close, reason %s, message %s",
+ reasons[*req->closeReason], req->diagnosticInformation ?
+ req->diagnosticInformation : "NULL");
+ if (assoc->version < 3) /* to make do_force respond with close */
+ assoc->version = 3;
+ do_close_req(assoc, Z_Close_finished,
+ "Association terminated by client", reqb);
+}
+
+void save_referenceId (request *reqb, Z_ReferenceId *refid)
+{
+ if (refid)
+ {
+ reqb->len_refid = refid->len;
+ reqb->refid = (char *)nmem_malloc (reqb->request_mem, refid->len);
+ memcpy (reqb->refid, refid->buf, refid->len);
+ }
+ else
+ {
+ reqb->len_refid = 0;
+ reqb->refid = NULL;
+ }
+}
+
+void bend_request_send (bend_association a, bend_request req, Z_APDU *res)
+{
+ process_z_response (a, req, res);
+}
+
+bend_request bend_request_mk (bend_association a)
+{
+ request *nreq = request_get (&a->outgoing);
+ nreq->request_mem = nmem_create ();
+ return nreq;
+}
+
+Z_ReferenceId *bend_request_getid (ODR odr, bend_request req)
+{
+ Z_ReferenceId *id;
+ if (!req->refid)
+ return 0;
+ id = (Odr_oct *)odr_malloc (odr, sizeof(*odr));
+ id->buf = (unsigned char *)odr_malloc (odr, req->len_refid);
+ id->len = id->size = req->len_refid;
+ memcpy (id->buf, req->refid, req->len_refid);
+ return id;
+}
+
+void bend_request_destroy (bend_request *req)
+{
+ nmem_destroy((*req)->request_mem);
+ request_release(*req);
+ *req = NULL;
+}
+
+int bend_backend_respond (bend_association a, bend_request req)
+{
+ char *msg;
+ int r;
+ r = process_z_request (a, req, &msg);
+ if (r < 0)
+ yaz_log (LOG_WARN, "%s", msg);
+ return r;
+}
+
+void bend_request_setdata(bend_request r, void *p)
+{
+ r->clientData = p;
+}
+
+void *bend_request_getdata(bend_request r)
+{
+ return r->clientData;
+}
+
+static Z_APDU *process_segmentRequest (association *assoc, request *reqb)
+{
+ bend_segment_rr req;
+
+ req.segment = reqb->apdu_request->u.segmentRequest;
+ req.stream = assoc->encode;
+ req.decode = assoc->decode;
+ req.print = assoc->print;
+ req.association = assoc;
+
+ (*assoc->init->bend_segment)(assoc->backend, &req);
+
+ return 0;
+}
+
+static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
+{
+ bend_esrequest_rr esrequest;
+
+ Z_ExtendedServicesRequest *req =
+ reqb->apdu_request->u.extendedServicesRequest;
+ Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_extendedServicesResponse);
+
+ Z_ExtendedServicesResponse *resp = apdu->u.extendedServicesResponse;
+
+ yaz_log(LOG_DEBUG,"inside Process esRequest");
+
+ esrequest.esr = reqb->apdu_request->u.extendedServicesRequest;
+ esrequest.stream = assoc->encode;
+ esrequest.decode = assoc->decode;
+ esrequest.print = assoc->print;
+ esrequest.errcode = 0;
+ esrequest.errstring = NULL;
+ esrequest.request = reqb;
+ esrequest.association = assoc;
+ esrequest.taskPackage = 0;
+ esrequest.referenceId = req->referenceId;
+
+ (*assoc->init->bend_esrequest)(assoc->backend, &esrequest);
+
+ /* If the response is being delayed, return NULL */
+ if (esrequest.request == NULL)
+ return(NULL);
+
+ resp->referenceId = req->referenceId;
+
+ if (esrequest.errcode == -1)
+ {
+ /* Backend service indicates request will be processed */
+ yaz_log(LOG_DEBUG,"Request could be processed...Accepted !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_accepted;
+ }
+ else if (esrequest.errcode == 0)
+ {
+ /* Backend service indicates request will be processed */
+ yaz_log(LOG_DEBUG,"Request could be processed...Done !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_done;
+ }
+ else
+ {
+ Z_DiagRecs *diagRecs = diagrecs (assoc, esrequest.errcode,
+ esrequest.errstring);
+
+ /* Backend indicates error, request will not be processed */
+ yaz_log(LOG_DEBUG,"Request could not be processed...failure !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_failure;
+ resp->num_diagnostics = diagRecs->num_diagRecs;
+ resp->diagnostics = diagRecs->diagRecs;
+ }
+ /* Do something with the members of bend_extendedservice */
+ if (esrequest.taskPackage)
+ resp->taskPackage = z_ext_record (assoc->encode, VAL_EXTENDED,
+ (const char *) esrequest.taskPackage,
+ -1);
+ yaz_log(LOG_DEBUG,"Send the result apdu");
+ return apdu;
+}
+
--- /dev/null
+/*
+ * Copyright (C) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: session.h,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#ifndef SESSION_H
+#define SESSION_H
+
+#include <sys/types.h>
+#include <yaz/comstack.h>
+#include <yaz/odr.h>
+#include <yaz/oid.h>
+#include <yaz/proto.h>
+#include "eventl.h"
+
+typedef enum {
+ REQUEST_IDLE, /* the request is just sitting in the queue */
+ REQUEST_PENDING /* operation pending (b'end processing or network I/O*/
+ /* this list will have more elements when acc/res control is added */
+} request_state;
+
+typedef struct request
+{
+ int len_refid; /* length of referenceid */
+ char *refid; /* referenceid */
+ request_state state;
+
+ Z_GDU *gdu_request; /* Current request */
+ Z_APDU *apdu_request; /* Current Z39.50 request */
+ NMEM request_mem; /* memory handle for request */
+
+ int size_response; /* size of buffer */
+ int len_response; /* length of encoded data */
+ char *response; /* encoded data waiting for transmission */
+
+ void *clientData;
+ struct request *next;
+ struct request_q *q;
+} request;
+
+typedef struct request_q
+{
+ request *head;
+ request *tail;
+ request *list;
+ int num;
+} request_q;
+
+/*
+ * association state.
+ */
+typedef enum
+{
+ ASSOC_NEW, /* not initialized yet */
+ ASSOC_UP, /* normal operation */
+ ASSOC_DEAD /* dead. Close if input arrives */
+} association_state;
+
+typedef struct association
+{
+ IOCHAN client_chan; /* event-loop control */
+ COMSTACK client_link; /* communication handle */
+ ODR decode; /* decoding stream */
+ ODR encode; /* encoding stream */
+ ODR print; /* printing stream (for -a) */
+ char *encode_buffer; /* temporary buffer for encoded data */
+ int encoded_len; /* length of encoded data */
+ char *input_buffer; /* input buffer (allocated by comstack) */
+ int input_buffer_len; /* length (size) of buffer */
+ int input_apdu_len; /* length of current incoming APDU */
+ oid_proto proto; /* protocol (PROTO_Z3950/PROTO_SR) */
+ void *backend; /* backend handle */
+ request_q incoming; /* Q of incoming PDUs */
+ request_q outgoing; /* Q of outgoing data buffers (enc. PDUs) */
+ association_state state;
+
+ /* session parameters */
+ int preferredMessageSize;
+ int maximumRecordSize;
+ int version; /* highest version-bit set (2 or 3) */
+
+ unsigned cs_get_mask;
+ unsigned cs_put_mask;
+ unsigned cs_accept_mask;
+
+ struct bend_initrequest *init;
+} association;
+
+association *create_association(IOCHAN channel, COMSTACK link);
+void destroy_association(association *h);
+void ir_session(IOCHAN h, int event);
+
+void request_enq(request_q *q, request *r);
+request *request_head(request_q *q);
+request *request_deq(request_q *q);
+request *request_deq_x(request_q *q, request *r);
+void request_initq(request_q *q);
+void request_delq(request_q *q);
+request *request_get(request_q *q);
+void request_release(request *r);
+
+int statserv_must_terminate(void);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1997-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: siconv.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+/* mini iconv and wrapper for system iconv library (if present) */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#include <ctype.h>
+#if HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+#if HAVE_ICONV_H
+#include <iconv.h>
+#endif
+
+#include <yaz/yaz-util.h>
+
+unsigned long yaz_marc8_conv (unsigned char *inp, size_t inbytesleft,
+ size_t *no_read);
+
+struct yaz_iconv_struct {
+ int my_errno;
+ int init_flag;
+ size_t (*init_handle)(yaz_iconv_t cd, unsigned char *inbuf,
+ size_t inbytesleft, size_t *no_read);
+ unsigned long (*read_handle)(yaz_iconv_t cd, unsigned char *inbuf,
+ size_t inbytesleft, size_t *no_read);
+ size_t (*write_handle)(yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft);
+#if HAVE_ICONV_H
+ iconv_t iconv_cd;
+#endif
+};
+
+static unsigned long yaz_read_ISO8859_1 (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ unsigned long x = inp[0];
+ *no_read = 1;
+ return x;
+}
+
+static size_t yaz_init_UTF8 (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ if (inp[0] != 0xef)
+ {
+ *no_read = 0;
+ return 0;
+ }
+ if (inbytesleft < 3)
+ {
+ cd->my_errno = YAZ_ICONV_EINVAL;
+ return (size_t) -1;
+ }
+ if (inp[1] != 0xbb || inp[2] != 0xbf)
+ {
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ return (size_t) -1;
+ }
+ *no_read = 3;
+ return 0;
+}
+
+static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ unsigned long x = 0;
+
+ if (inp[0] <= 0x7f)
+ {
+ x = inp[0];
+ *no_read = 1;
+ }
+ else if (inp[0] <= 0xbf || inp[0] >= 0xfe)
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ else if (inp[0] <= 0xdf && inbytesleft >= 2)
+ {
+ x = ((inp[0] & 0x1f) << 6) | (inp[1] & 0x3f);
+ if (x >= 0x80)
+ *no_read = 2;
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ }
+ else if (inp[0] <= 0xef && inbytesleft >= 3)
+ {
+ x = ((inp[0] & 0x0f) << 12) | ((inp[1] & 0x3f) << 6) |
+ (inp[1] & 0x3f);
+ if (x >= 0x800)
+ *no_read = 3;
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ }
+ else if (inp[0] <= 0xf7 && inbytesleft >= 4)
+ {
+ x = ((inp[0] & 0x07) << 18) | ((inp[1] & 0x3f) << 12) |
+ ((inp[2] & 0x3f) << 6) | (inp[3] & 0x3f);
+ if (x >= 0x10000)
+ *no_read = 4;
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ }
+ else if (inp[0] <= 0xfb && inbytesleft >= 5)
+ {
+ x = ((inp[0] & 0x03) << 24) | ((inp[1] & 0x3f) << 18) |
+ ((inp[2] & 0x3f) << 12) | ((inp[3] & 0x3f) << 6) |
+ (inp[4] & 0x3f);
+ if (x >= 0x200000)
+ *no_read = 5;
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ }
+ else if (inp[0] <= 0xfd && inbytesleft >= 6)
+ {
+ x = ((inp[0] & 0x01) << 30) | ((inp[1] & 0x3f) << 24) |
+ ((inp[2] & 0x3f) << 18) | ((inp[3] & 0x3f) << 12) |
+ ((inp[4] & 0x3f) << 6) | (inp[5] & 0x3f);
+ if (x >= 0x4000000)
+ *no_read = 6;
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ }
+ }
+ else
+ {
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EINVAL;
+ }
+ return x;
+}
+
+static unsigned long yaz_read_UCS4 (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ unsigned long x = 0;
+
+ if (inbytesleft < 4)
+ {
+ cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
+ *no_read = 0;
+ }
+ else
+ {
+ x = (inp[0]<<24) | (inp[1]<<16) | (inp[2]<<8) | inp[3];
+ *no_read = 4;
+ }
+ return x;
+}
+
+static unsigned long yaz_read_UCS4LE (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ unsigned long x = 0;
+
+ if (inbytesleft < 4)
+ {
+ cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
+ *no_read = 0;
+ }
+ else
+ {
+ x = (inp[3]<<24) | (inp[2]<<16) | (inp[1]<<8) | inp[0];
+ *no_read = 4;
+ }
+ return x;
+}
+
+#if HAVE_WCHAR_H
+static unsigned long yaz_read_wchar_t (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ unsigned long x = 0;
+
+ if (inbytesleft < sizeof(wchar_t))
+ {
+ cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
+ *no_read = 0;
+ }
+ else
+ {
+ wchar_t wch;
+ memcpy (&wch, inp, sizeof(wch));
+ x = wch;
+ *no_read = sizeof(wch);
+ }
+ return x;
+}
+#endif
+
+static unsigned long yaz_read_marc8 (yaz_iconv_t cd, unsigned char *inp,
+ size_t inbytesleft, size_t *no_read)
+{
+ return yaz_marc8_conv(inp, inbytesleft, no_read);
+}
+
+static size_t yaz_write_UTF8 (yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft)
+{
+ unsigned char *outp = (unsigned char *) *outbuf;
+ if (x <= 0x7f && *outbytesleft >= 1)
+ {
+ *outp++ = (unsigned char) x;
+ (*outbytesleft)--;
+ }
+ else if (x <= 0x7ff && *outbytesleft >= 2)
+ {
+ *outp++ = (unsigned char) ((x >> 6) | 0xc0);
+ *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
+ (*outbytesleft) -= 2;
+ }
+ else if (x <= 0xffff && *outbytesleft >= 3)
+ {
+ *outp++ = (unsigned char) ((x >> 12) | 0xe0);
+ *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
+ (*outbytesleft) -= 3;
+ }
+ else if (x <= 0x1fffff && *outbytesleft >= 4)
+ {
+ *outp++ = (unsigned char) ((x >> 18) | 0xf0);
+ *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
+ (*outbytesleft) -= 4;
+ }
+ else if (x <= 0x3ffffff && *outbytesleft >= 5)
+ {
+ *outp++ = (unsigned char) ((x >> 24) | 0xf8);
+ *outp++ = (unsigned char) (((x >> 18) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
+ (*outbytesleft) -= 5;
+ }
+ else if (*outbytesleft >= 6)
+ {
+ *outp++ = (unsigned char) ((x >> 30) | 0xfc);
+ *outp++ = (unsigned char) (((x >> 24) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 18) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
+ *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
+ (*outbytesleft) -= 6;
+ }
+ else
+ {
+ cd->my_errno = YAZ_ICONV_E2BIG; /* not room for output */
+ return (size_t)(-1);
+ }
+ *outbuf = (char *) outp;
+ return 0;
+}
+
+static size_t yaz_write_ISO8859_1 (yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft)
+{
+ unsigned char *outp = (unsigned char *) *outbuf;
+ if (x > 255 || x < 1)
+ {
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ return (size_t) -1;
+ }
+ else if (*outbytesleft >= 1)
+ {
+ *outp++ = (unsigned char) x;
+ (*outbytesleft)--;
+ }
+ else
+ {
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ return (size_t)(-1);
+ }
+ *outbuf = (char *) outp;
+ return 0;
+}
+
+
+static size_t yaz_write_UCS4 (yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft)
+{
+ unsigned char *outp = (unsigned char *) *outbuf;
+ if (*outbytesleft >= 4)
+ {
+ *outp++ = (unsigned char) (x<<24);
+ *outp++ = (unsigned char) (x<<16);
+ *outp++ = (unsigned char) (x<<8);
+ *outp++ = (unsigned char) x;
+ (*outbytesleft) -= 4;
+ }
+ else
+ {
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ return (size_t)(-1);
+ }
+ *outbuf = (char *) outp;
+ return 0;
+}
+
+static size_t yaz_write_UCS4LE (yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft)
+{
+ unsigned char *outp = (unsigned char *) *outbuf;
+ if (*outbytesleft >= 4)
+ {
+ *outp++ = (unsigned char) x;
+ *outp++ = (unsigned char) (x<<8);
+ *outp++ = (unsigned char) (x<<16);
+ *outp++ = (unsigned char) (x<<24);
+ (*outbytesleft) -= 4;
+ }
+ else
+ {
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ return (size_t)(-1);
+ }
+ *outbuf = (char *) outp;
+ return 0;
+}
+
+#if HAVE_WCHAR_H
+static size_t yaz_write_wchar_t (yaz_iconv_t cd, unsigned long x,
+ char **outbuf, size_t *outbytesleft)
+{
+ unsigned char *outp = (unsigned char *) *outbuf;
+
+ if (*outbytesleft >= sizeof(wchar_t))
+ {
+ wchar_t wch = x;
+ memcpy(outp, &wch, sizeof(wch));
+ outp += sizeof(wch);
+ (*outbytesleft) -= sizeof(wch);
+ }
+ else
+ {
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ return (size_t)(-1);
+ }
+ *outbuf = (char *) outp;
+ return 0;
+}
+#endif
+
+int yaz_iconv_isbuiltin(yaz_iconv_t cd)
+{
+ return cd->read_handle && cd->write_handle;
+}
+
+yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode)
+{
+ yaz_iconv_t cd = (yaz_iconv_t) xmalloc (sizeof(*cd));
+
+ cd->write_handle = 0;
+ cd->read_handle = 0;
+ cd->init_handle = 0;
+ cd->my_errno = YAZ_ICONV_UNKNOWN;
+
+ /* a useful hack: if fromcode has leading @,
+ the library not use YAZ's own conversions .. */
+ if (fromcode[0] == '@')
+ fromcode++;
+ else
+ {
+ if (!yaz_matchstr(fromcode, "UTF8"))
+ {
+ cd->read_handle = yaz_read_UTF8;
+ cd->init_handle = yaz_init_UTF8;
+ }
+ else if (!yaz_matchstr(fromcode, "ISO88591"))
+ cd->read_handle = yaz_read_ISO8859_1;
+ else if (!yaz_matchstr(fromcode, "UCS4"))
+ cd->read_handle = yaz_read_UCS4;
+ else if (!yaz_matchstr(fromcode, "UCS4LE"))
+ cd->read_handle = yaz_read_UCS4LE;
+ else if (!yaz_matchstr(fromcode, "MARC8"))
+ cd->read_handle = yaz_read_marc8;
+#if HAVE_WCHAR_H
+ else if (!yaz_matchstr(fromcode, "WCHAR_T"))
+ cd->read_handle = yaz_read_wchar_t;
+#endif
+
+ if (!yaz_matchstr(tocode, "UTF8"))
+ cd->write_handle = yaz_write_UTF8;
+ else if (!yaz_matchstr(tocode, "ISO88591"))
+ cd->write_handle = yaz_write_ISO8859_1;
+ else if (!yaz_matchstr (tocode, "UCS4"))
+ cd->write_handle = yaz_write_UCS4;
+ else if (!yaz_matchstr(tocode, "UCS4LE"))
+ cd->write_handle = yaz_write_UCS4LE;
+#if HAVE_WCHAR_H
+ else if (!yaz_matchstr(tocode, "WCHAR_T"))
+ cd->write_handle = yaz_write_wchar_t;
+#endif
+ }
+#if HAVE_ICONV_H
+ cd->iconv_cd = 0;
+ if (!cd->read_handle || !cd->write_handle)
+ {
+ cd->iconv_cd = iconv_open (tocode, fromcode);
+ if (cd->iconv_cd == (iconv_t) (-1))
+ {
+ xfree (cd);
+ return 0;
+ }
+ }
+#else
+ if (!cd->read_handle || !cd->write_handle)
+ {
+ xfree (cd);
+ return 0;
+ }
+#endif
+ cd->init_flag = 1;
+ return cd;
+}
+
+size_t yaz_iconv (yaz_iconv_t cd, char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ char *inbuf0;
+ size_t r = 0;
+#if HAVE_ICONV_H
+ if (cd->iconv_cd)
+ {
+ size_t r =
+ iconv(cd->iconv_cd, inbuf, inbytesleft, outbuf, outbytesleft);
+ if (r == (size_t)(-1))
+ {
+ switch (yaz_errno())
+ {
+ case E2BIG:
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ break;
+ case EINVAL:
+ cd->my_errno = YAZ_ICONV_EINVAL;
+ break;
+ case EILSEQ:
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ break;
+ default:
+ cd->my_errno = YAZ_ICONV_UNKNOWN;
+ }
+ }
+ return r;
+ }
+#endif
+ if (inbuf == 0 || *inbuf == 0)
+ {
+ cd->init_flag = 1;
+ cd->my_errno = YAZ_ICONV_UNKNOWN;
+ return 0;
+ }
+ inbuf0 = *inbuf;
+
+ if (cd->init_flag)
+ {
+ if (cd->init_handle)
+ {
+ size_t no_read;
+ size_t r = (cd->init_handle)(cd, (unsigned char *) *inbuf,
+ *inbytesleft, &no_read);
+ if (r)
+ {
+ if (cd->my_errno == YAZ_ICONV_EINVAL)
+ return r;
+ cd->init_flag = 0;
+ return r;
+ }
+ *inbytesleft -= no_read;
+ *inbuf += no_read;
+ }
+ cd->init_flag = 0;
+ }
+ while (1)
+ {
+ unsigned long x;
+ size_t no_read;
+
+ if (*inbytesleft == 0)
+ {
+ r = *inbuf - inbuf0;
+ break;
+ }
+
+ x = (cd->read_handle)(cd, (unsigned char *) *inbuf, *inbytesleft,
+ &no_read);
+ if (no_read == 0)
+ {
+ r = (size_t)(-1);
+ break;
+ }
+ r = (cd->write_handle)(cd, x, outbuf, outbytesleft);
+ if (r)
+ break;
+ *inbytesleft -= no_read;
+ (*inbuf) += no_read;
+ }
+ return r;
+}
+
+int yaz_iconv_error (yaz_iconv_t cd)
+{
+ return cd->my_errno;
+}
+
+int yaz_iconv_close (yaz_iconv_t cd)
+{
+#if HAVE_ICONV_H
+ if (cd->iconv_cd)
+ iconv_close (cd->iconv_cd);
+#endif
+ xfree (cd);
+ return 0;
+}
+
+
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: soap.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <yaz/soap.h>
+
+#if HAVE_XML2
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+static const char *soap_v1_1 = "http://schemas.xmlsoap.org/soap/envelope/";
+static const char *soap_v1_2 = "http://www.w3.org/2001/06/soap-envelope";
+
+int z_soap_error(ODR o, Z_SOAP *p,
+ const char *fault_code, const char *fault_string,
+ const char *details)
+{
+ p->which = Z_SOAP_error;
+ p->u.soap_error = (Z_SOAP_Fault *)
+ odr_malloc(o, sizeof(*p->u.soap_error));
+ p->u.soap_error->fault_code = odr_strdup(o, fault_code);
+ p->u.soap_error->fault_string = odr_strdup(o, fault_string);
+ if (details)
+ p->u.soap_error->details = odr_strdup(o, details);
+ else
+ p->u.soap_error->details = 0;
+ return -1;
+}
+
+int z_soap_codec_enc(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers,
+ const char *encoding)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ Z_SOAP *p;
+ xmlNodePtr ptr, pptr;
+ xmlDocPtr doc;
+ int i, ret;
+
+ if (!content_buf || !*content_buf || !content_len)
+ return -1;
+
+ *pp = p = (Z_SOAP *) odr_malloc(o, sizeof(*p));
+ p->ns = soap_v1_1;
+
+ doc = xmlParseMemory(*content_buf, *content_len);
+ if (!doc)
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "Bad XML Document", 0);
+ /* check that root node is Envelope */
+ ptr = xmlDocGetRootElement(doc);
+ if (!ptr || ptr->type != XML_ELEMENT_NODE ||
+ strcmp(ptr->name, "Envelope") || !ptr->ns)
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "No Envelope element", 0);
+ }
+ else
+ {
+ /* determine SOAP version */
+ const char * ns_envelope = ptr->ns->href;
+ if (!strcmp(ns_envelope, soap_v1_1))
+ p->ns = soap_v1_1;
+ else if (!strcmp(ns_envelope, soap_v1_2))
+ p->ns = soap_v1_2;
+ else
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "Bad SOAP version", 0);
+ }
+ }
+ ptr = ptr->children;
+ while(ptr && ptr->type == XML_TEXT_NODE)
+ ptr = ptr->next;
+ if (ptr && ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->ns->href, p->ns) &&
+ !strcmp(ptr->name, "Header"))
+ {
+ ptr = ptr->next;
+ while(ptr && ptr->type == XML_TEXT_NODE)
+ ptr = ptr->next;
+ }
+ /* check that Body is present */
+ if (!ptr || ptr->type != XML_ELEMENT_NODE ||
+ strcmp(ptr->name, "Body"))
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "SOAP Body element not found", 0);
+ }
+ if (strcmp(ptr->ns->href, p->ns))
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "SOAP bad NS for Body element", 0);
+ }
+ pptr = ptr;
+ ptr = ptr->children;
+ while (ptr && ptr->type == XML_TEXT_NODE)
+ ptr = ptr->next;
+ if (!ptr || ptr->type != XML_ELEMENT_NODE)
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "SOAP No content for Body", 0);
+ }
+ /* check for fault package */
+ if (!strcmp(ptr->ns->href, p->ns)
+ && !strcmp(ptr->name, "Fault") && ptr->children)
+ {
+ ptr = ptr->children;
+
+ p->which = Z_SOAP_fault;
+ p->u.fault = odr_malloc(o, sizeof(*p->u.fault));
+ p->u.fault->fault_code = 0;
+ p->u.fault->fault_string = 0;
+ p->u.fault->details = 0;
+ while (ptr)
+ {
+ if (ptr->children && ptr->children->type == XML_TEXT_NODE)
+ {
+ if (!strcmp(ptr->name, "faultcode"))
+ p->u.fault->fault_code =
+ odr_strdup(o, ptr->children->content);
+ if (!strcmp(ptr->name, "faultstring"))
+ p->u.fault->fault_string =
+ odr_strdup(o, ptr->children->content);
+ if (!strcmp(ptr->name, "details"))
+ p->u.fault->details =
+ odr_strdup(o, ptr->children->content);
+ }
+ ptr = ptr->next;
+ }
+ ret = 0;
+ }
+ else
+ {
+ for (i = 0; handlers[i].ns; i++)
+ if (!strcmp(ptr->ns->href, handlers[i].ns))
+ break;
+ if (handlers[i].ns)
+ {
+ void *handler_data = 0;
+ ret = (*handlers[i].f)(o, pptr, &handler_data,
+ handlers[i].client_data,
+ handlers[i].ns);
+ if (ret || !handler_data)
+ z_soap_error(o, p, "SOAP-ENV:Client",
+ "SOAP Handler returned error", 0);
+ else
+ {
+ p->which = Z_SOAP_generic;
+ p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
+ p->u.generic->no = i;
+ p->u.generic->ns = handlers[i].ns;
+ p->u.generic->p = handler_data;
+ }
+ }
+ else
+ {
+ ret = z_soap_error(o, p, "SOAP-ENV:Client",
+ "No handler for NS", ptr->ns->href);
+ }
+ }
+ xmlFreeDoc(doc);
+ return ret;
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ Z_SOAP *p = *pp;
+ xmlNsPtr ns_env;
+ xmlNodePtr envelope_ptr, body_ptr;
+
+ xmlDocPtr doc = xmlNewDoc("1.0");
+
+ envelope_ptr = xmlNewNode(0, "Envelope");
+ ns_env = xmlNewNs(envelope_ptr, p->ns, "SOAP-ENV");
+ xmlSetNs(envelope_ptr, ns_env);
+
+ body_ptr = xmlNewChild(envelope_ptr, ns_env, "Body", 0);
+ xmlDocSetRootElement(doc, envelope_ptr);
+
+ if (p->which == Z_SOAP_fault || p->which == Z_SOAP_error)
+ {
+ Z_SOAP_Fault *f = p->u.fault;
+ xmlNodePtr fault_ptr = xmlNewChild(body_ptr, ns_env, "Fault", 0);
+ xmlNewChild(fault_ptr, ns_env, "faultcode", f->fault_code);
+ xmlNewChild(fault_ptr, ns_env, "faultstring", f->fault_string);
+ if (f->details)
+ xmlNewChild(fault_ptr, ns_env, "details", f->details);
+ }
+ else if (p->which == Z_SOAP_generic)
+ {
+ int ret, no = p->u.generic->no;
+
+ ret = (*handlers[no].f)(o, body_ptr, &p->u.generic->p,
+ handlers[no].client_data,
+ handlers[no].ns);
+ if (ret)
+ return ret;
+ }
+ if (p->which == Z_SOAP_generic && !strcmp(p->ns, "SRU"))
+ {
+ xmlDocSetRootElement(doc, body_ptr->children);
+ }
+ if (1)
+ {
+ xmlChar *buf_out;
+ int len_out;
+ if (encoding)
+ xmlDocDumpMemoryEnc(doc, &buf_out, &len_out, encoding);
+ else
+ xmlDocDumpMemory(doc, &buf_out, &len_out);
+ *content_buf = (char *) odr_malloc(o, len_out);
+ *content_len = len_out;
+ memcpy(*content_buf, buf_out, len_out);
+ xmlFree(buf_out);
+ }
+ xmlFreeDoc(doc);
+ return 0;
+ }
+ return 0;
+}
+#else
+int z_soap_codec_enc(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers, const char *encoding)
+{
+ static char *err_xml =
+ "<?xml version=\"1.0\"?>\n"
+ "<SOAP-ENV:Envelope"
+ " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+ "\t<SOAP-ENV:Body>\n"
+ "\t\t<SOAP-ENV:Fault>\n"
+ "\t\t\t<faultcode>SOAP-ENV:Server</faultcode>\n"
+ "\t\t\t<faultstring>HTTP error</faultstring>\n"
+ "\t\t\t<detail>SOAP not supported in this YAZ configuration</detail>\n"
+ "\t\t</SOAP-ENV:Fault>\n"
+ "\t</SOAP-ENV:Body>\n"
+ "</SOAP-ENV:Envelope>\n";
+ if (o->direction == ODR_ENCODE)
+ {
+ *content_buf = err_xml;
+ *content_len = strlen(err_xml);
+ }
+ return -1;
+}
+#endif
+int z_soap_codec(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers)
+{
+ return z_soap_codec_enc(o, pp, content_buf, content_len, handlers, 0);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2001, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: sortspec.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <yaz/proto.h>
+#include <yaz/oid.h>
+#include <yaz/sortspec.h>
+
+Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg)
+{
+ char sort_string_buf[32], sort_flags[32];
+ Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
+ odr_malloc (out, sizeof(*sksl));
+ int off;
+
+ sksl->num_specs = 0;
+ sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
+
+ while ((sscanf (arg, "%31s %31s%n", sort_string_buf,
+ sort_flags, &off)) == 2 && off > 1)
+ {
+ int i;
+ char *sort_string_sep;
+ char *sort_string = sort_string_buf;
+ Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
+ Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
+
+ arg += off;
+ sksl->specs[sksl->num_specs++] = sks;
+ sks->sortElement = (Z_SortElement *)
+ odr_malloc (out, sizeof(*sks->sortElement));
+ sks->sortElement->which = Z_SortElement_generic;
+ sks->sortElement->u.generic = sk;
+
+ if ((sort_string_sep = strchr (sort_string, '=')))
+ {
+ int i = 0;
+ sk->which = Z_SortKey_sortAttributes;
+ sk->u.sortAttributes = (Z_SortAttributes *)
+ odr_malloc (out, sizeof(*sk->u.sortAttributes));
+ sk->u.sortAttributes->id =
+ yaz_oidval_to_z3950oid(out, CLASS_ATTSET, VAL_BIB1);
+ sk->u.sortAttributes->list = (Z_AttributeList *)
+ odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+ sk->u.sortAttributes->list->attributes = (Z_AttributeElement **)
+ odr_malloc (out, 10 *
+ sizeof(*sk->u.sortAttributes->list->attributes));
+ while (i < 10 && sort_string && sort_string_sep)
+ {
+ Z_AttributeElement *el = (Z_AttributeElement *)
+ odr_malloc (out, sizeof(*el));
+ sk->u.sortAttributes->list->attributes[i] = el;
+ el->attributeSet = 0;
+ el->attributeType = odr_intdup (out, atoi (sort_string));
+ el->which = Z_AttributeValue_numeric;
+ el->value.numeric =
+ odr_intdup (out, atoi (sort_string_sep + 1));
+ i++;
+ sort_string = strchr(sort_string, ',');
+ if (sort_string)
+ {
+ sort_string++;
+ sort_string_sep = strchr (sort_string, '=');
+ }
+ }
+ sk->u.sortAttributes->list->num_attributes = i;
+ }
+ else
+ {
+ sk->which = Z_SortKey_sortField;
+ sk->u.sortField = odr_strdup (out, sort_string);
+ }
+ sks->sortRelation = odr_intdup (out, Z_SortRelation_ascending);
+ sks->caseSensitivity = odr_intdup (out, Z_SortCase_caseSensitive);
+
+ sks->which = Z_SortKeySpec_null;
+ sks->u.null = odr_nullval ();
+
+ for (i = 0; sort_flags[i]; i++)
+ {
+ switch (sort_flags[i])
+ {
+ case 'd':
+ case 'D':
+ case '>':
+ *sks->sortRelation = Z_SortRelation_descending;
+ break;
+ case 'a':
+ case 'A':
+ case '<':
+ *sks->sortRelation = Z_SortRelation_ascending;
+ break;
+ case 'i':
+ case 'I':
+ *sks->caseSensitivity = Z_SortCase_caseInsensitive;
+ break;
+ case 'S':
+ case 's':
+ *sks->caseSensitivity = Z_SortCase_caseSensitive;
+ break;
+ }
+ }
+ }
+ if (!sksl->num_specs)
+ return 0;
+ return sksl;
+}
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: srw.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <yaz/srw.h>
+
+#if HAVE_XML2
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len)
+{
+ if (val)
+ {
+ xmlDocPtr doc = xmlParseMemory(val,len);
+ if (doc)
+ {
+ xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
+ xmlNodePtr t = xmlDocGetRootElement(doc);
+ xmlAddChild(c, xmlCopyNode(t,1));
+ xmlFreeDoc(doc);
+ }
+ }
+}
+
+static void add_xsd_string_n(xmlNodePtr ptr, const char *elem, char *val,
+ int len)
+{
+ if (val)
+ {
+ xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
+ xmlNodePtr t = xmlNewTextLen(val, len);
+ xmlAddChild(c, t);
+ }
+}
+
+static void add_xsd_string(xmlNodePtr ptr, const char *elem, char *val)
+{
+ if (val)
+ xmlNewChild(ptr, 0, elem, val);
+}
+
+static void add_xsd_integer(xmlNodePtr ptr, const char *elem, int *val)
+{
+ if (val)
+ {
+ char str[30];
+ sprintf(str, "%d", *val);
+ xmlNewChild(ptr, 0, elem, str);
+ }
+}
+
+static int match_element(xmlNodePtr ptr, const char *elem)
+{
+ if (ptr->type == XML_ELEMENT_NODE && !strcmp(ptr->name, elem))
+ return 1;
+ return 0;
+}
+
+#define CHECK_TYPE 0
+
+static int match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o,
+ char **val, int *len)
+{
+#if CHECK_TYPE
+ struct _xmlAttr *attr;
+#endif
+ if (!match_element(ptr, elem))
+ return 0;
+#if CHECK_TYPE
+ for (attr = ptr->properties; attr; attr = attr->next)
+ if (!strcmp(attr->name, "type") &&
+ attr->children && attr->children->type == XML_TEXT_NODE)
+ {
+ const char *t = strchr(attr->children->content, ':');
+ if (t)
+ t = t + 1;
+ else
+ t = attr->children->content;
+ if (!strcmp(t, "string"))
+ break;
+ }
+ if (!attr)
+ return 0;
+#endif
+ ptr = ptr->children;
+ if (!ptr || ptr->type != XML_TEXT_NODE)
+ return 0;
+ *val = odr_strdup(o, ptr->content);
+ if (len)
+ *len = strlen(ptr->content);
+ return 1;
+}
+
+
+static int match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o,
+ char **val)
+{
+ return match_xsd_string_n(ptr, elem, o, val, 0);
+}
+
+static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o,
+ char **val, int *len)
+{
+ xmlBufferPtr buf;
+
+ if (!match_element(ptr, elem))
+ return 0;
+ ptr = ptr->children;
+ if (!ptr)
+ return 0;
+ buf = xmlBufferCreate();
+
+ xmlNodeDump(buf, ptr->doc, ptr, 0, 0);
+
+ *val = odr_malloc(o, buf->use+1);
+ memcpy (*val, buf->content, buf->use);
+ (*val)[buf->use] = '\0';
+
+ if (len)
+ *len = buf->use;
+
+ xmlBufferFree(buf);
+
+ return 1;
+}
+
+
+static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val)
+{
+#if CHECK_TYPE
+ struct _xmlAttr *attr;
+#endif
+ if (!match_element(ptr, elem))
+ return 0;
+#if CHECK_TYPE
+ for (attr = ptr->properties; attr; attr = attr->next)
+ if (!strcmp(attr->name, "type") &&
+ attr->children && attr->children->type == XML_TEXT_NODE)
+ {
+ const char *t = strchr(attr->children->content, ':');
+ if (t)
+ t = t + 1;
+ else
+ t = attr->children->content;
+ if (!strcmp(t, "integer"))
+ break;
+ }
+ if (!attr)
+ return 0;
+#endif
+ ptr = ptr->children;
+ if (!ptr || ptr->type != XML_TEXT_NODE)
+ return 0;
+ *val = odr_intdup(o, atoi(ptr->content));
+ return 1;
+}
+
+static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs,
+ int *num, void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ int i;
+ xmlNodePtr ptr;
+ *num = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "record"))
+ (*num)++;
+ }
+ if (!*num)
+ return 1;
+ *recs = odr_malloc(o, *num * sizeof(**recs));
+ for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "record"))
+ {
+ xmlNodePtr rptr;
+ (*recs)[i].recordSchema = 0;
+ (*recs)[i].recordPacking = Z_SRW_recordPacking_string;
+ (*recs)[i].recordData_buf = 0;
+ (*recs)[i].recordData_len = 0;
+ (*recs)[i].recordPosition = 0;
+ for (rptr = ptr->children; rptr; rptr = rptr->next)
+ {
+ if (match_xsd_string(rptr, "recordSchema", o,
+ &(*recs)[i].recordSchema))
+ ;
+ else if (match_xsd_string_n(rptr, "recordData", o,
+ &(*recs)[i].recordData_buf,
+ &(*recs)[i].recordData_len))
+ ;
+ else if (match_xsd_XML_n(rptr, "recordXML", o,
+ &(*recs)[i].recordData_buf,
+ &(*recs)[i].recordData_len))
+ (*recs)[i].recordPacking = Z_SRW_recordPacking_XML;
+ else if (match_xsd_integer(rptr, "recordPosition", o,
+ &(*recs)[i].recordPosition))
+ ;
+ }
+ }
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ int i;
+ for (i = 0; i < *num; i++)
+ {
+ xmlNodePtr rptr = xmlNewChild(pptr, 0, "record", 0);
+ add_xsd_string(rptr, "recordSchema", (*recs)[i].recordSchema);
+ switch((*recs)[i].recordPacking)
+ {
+ case Z_SRW_recordPacking_string:
+ add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ case Z_SRW_recordPacking_XML:
+ add_XML_n(rptr, "recordXML", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ }
+ add_xsd_integer(rptr, "recordPosition", (*recs)[i].recordPosition);
+ }
+ }
+ return 0;
+}
+
+static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs,
+ int *num, void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ int i;
+ xmlNodePtr ptr;
+ *num = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "diagnostic"))
+ (*num)++;
+ }
+ if (!*num)
+ return 1;
+ *recs = odr_malloc(o, *num * sizeof(**recs));
+ for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "diagnostic"))
+ {
+ xmlNodePtr rptr;
+ (*recs)[i].code = 0;
+ (*recs)[i].details = 0;
+ for (rptr = ptr->children; rptr; rptr = rptr->next)
+ {
+ if (match_xsd_integer(rptr, "code", o,
+ &(*recs)[i].code))
+ ;
+ else if (match_xsd_string(rptr, "details", o,
+ &(*recs)[i].details))
+ ;
+ }
+ i++;
+ }
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ int i;
+ for (i = 0; i < *num; i++)
+ {
+ xmlNodePtr rptr = xmlNewChild(pptr, 0, "diagnostic", 0);
+ add_xsd_integer(rptr, "code", (*recs)[i].code);
+ add_xsd_string(rptr, "details", (*recs)[i].details);
+ }
+ }
+ return 0;
+}
+
+
+int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
+ void *client_data, const char *ns)
+{
+ xmlNodePtr pptr = vptr;
+ if (o->direction == ODR_DECODE)
+ {
+ xmlNodePtr method = pptr->children;
+
+ while (method && method->type == XML_TEXT_NODE)
+ method = method->next;
+
+ if (!method || method->type != XML_ELEMENT_NODE)
+ return -1;
+ if (!strcmp(method->name, "searchRetrieveRequest"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ xmlNodePtr ptr = method->children;
+ Z_SRW_searchRetrieveRequest *req;
+
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_searchRetrieve_request;
+ req = (*p)->u.request = odr_malloc(o, sizeof(*req));
+ req->query_type = Z_SRW_query_type_cql;
+ req->query.cql = 0;
+ req->sort_type = Z_SRW_sort_type_none;
+ req->sort.none = 0;
+ req->startRecord = 0;
+ req->maximumRecords = 0;
+ req->recordSchema = 0;
+ req->recordPacking = 0;
+ req->database = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_xsd_string(ptr, "query", o,
+ &req->query.cql))
+ req->query_type = Z_SRW_query_type_cql;
+ else if (match_xsd_string(ptr, "pQuery", o,
+ &req->query.pqf))
+ req->query_type = Z_SRW_query_type_pqf;
+ else if (match_xsd_string(ptr, "xQuery", o,
+ &req->query.xcql))
+ req->query_type = Z_SRW_query_type_xcql;
+ else if (match_xsd_string(ptr, "sortKeys", o,
+ &req->sort.sortKeys))
+ req->sort_type = Z_SRW_sort_type_sort;
+ else if (match_xsd_string(ptr, "recordSchema", o,
+ &req->recordSchema))
+ ;
+ else if (match_xsd_string(ptr, "recordPacking", o,
+ &req->recordPacking))
+ ;
+ else if (match_xsd_integer(ptr, "startRecord", o,
+ &req->startRecord))
+ ;
+ else if (match_xsd_integer(ptr, "maximumRecords", o,
+ &req->maximumRecords))
+ ;
+ else if (match_xsd_string(ptr, "database", o,
+ &req->database))
+ ;
+ /* missing is xQuery, xSortKeys .. */
+ }
+ }
+ else if (!strcmp(method->name, "searchRetrieveResponse"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ xmlNodePtr ptr = method->children;
+ Z_SRW_searchRetrieveResponse *res;
+
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_searchRetrieve_response;
+ res = (*p)->u.response = odr_malloc(o, sizeof(*res));
+
+ res->numberOfRecords = 0;
+ res->resultSetId = 0;
+ res->resultSetIdleTime = 0;
+ res->records = 0;
+ res->num_records = 0;
+ res->diagnostics = 0;
+ res->num_diagnostics = 0;
+ res->nextRecordPosition = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_xsd_integer(ptr, "numberOfRecords", o,
+ &res->numberOfRecords))
+ ;
+ else if (match_xsd_string(ptr, "resultSetId", o,
+ &res->resultSetId))
+ ;
+ else if (match_xsd_integer(ptr, "resultSetIdleTime", o,
+ &res->resultSetIdleTime))
+ ;
+ else if (match_element(ptr, "records"))
+ yaz_srw_records(o, ptr, &res->records,
+ &res->num_records, client_data,
+ ns);
+ else if (match_element(ptr, "diagnostics"))
+ yaz_srw_diagnostics(o, ptr, &res->diagnostics,
+ &res->num_diagnostics,
+ client_data, ns);
+ else if (match_xsd_integer(ptr, "nextRecordPosition", o,
+ &res->nextRecordPosition))
+ ;
+ }
+ }
+ else if (!strcmp(method->name, "explainRequest"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ Z_SRW_explainRequest *req;
+
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_explain_request;
+ req = (*p)->u.explain_request = odr_malloc(o, sizeof(*req));
+ req->dummy = 0;
+ }
+ else if (!strcmp(method->name, "explainResponse"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ Z_SRW_explainResponse *res;
+ xmlNodePtr ptr = method->children;
+
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_explain_response;
+ res = (*p)->u.explain_response = odr_malloc(o, sizeof(*res));
+ res->explainData_buf = 0;
+ res->explainData_len = 0;
+ res->explainPacking = Z_SRW_recordPacking_string;
+ for (; ptr; ptr = ptr->next)
+ {
+ match_xsd_string_n(ptr, "Explain", o,
+ &res->explainData_buf,
+ &res->explainData_len);
+ }
+ }
+ else
+ return -1;
+
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ Z_SRW_PDU **p = handler_data;
+ if ((*p)->which == Z_SRW_searchRetrieve_request)
+ {
+ Z_SRW_searchRetrieveRequest *req = (*p)->u.request;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
+ "searchRetrieveRequest", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+
+ switch(req->query_type)
+ {
+ case Z_SRW_query_type_cql:
+ add_xsd_string(ptr, "query", req->query.cql);
+ break;
+ case Z_SRW_query_type_xcql:
+ add_xsd_string(ptr, "xQuery", req->query.xcql);
+ break;
+ case Z_SRW_query_type_pqf:
+ add_xsd_string(ptr, "pQuery", req->query.pqf);
+ break;
+ }
+ switch(req->sort_type)
+ {
+ case Z_SRW_sort_type_none:
+ break;
+ case Z_SRW_sort_type_sort:
+ add_xsd_string(ptr, "sortKeys", req->sort.sortKeys);
+ break;
+ case Z_SRW_sort_type_xSort:
+ add_xsd_string(ptr, "xSortKeys", req->sort.xSortKeys);
+ break;
+ }
+ add_xsd_integer(ptr, "startRecord", req->startRecord);
+ add_xsd_integer(ptr, "maximumRecords", req->maximumRecords);
+ add_xsd_string(ptr, "recordSchema", req->recordSchema);
+ add_xsd_string(ptr, "recordPacking", req->recordPacking);
+ add_xsd_string(ptr, "database", req->database);
+ }
+ else if ((*p)->which == Z_SRW_searchRetrieve_response)
+ {
+ Z_SRW_searchRetrieveResponse *res = (*p)->u.response;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
+ "searchRetrieveResponse", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+ add_xsd_integer(ptr, "numberOfRecords", res->numberOfRecords);
+ add_xsd_string(ptr, "resultSetId", res->resultSetId);
+ add_xsd_integer(ptr, "resultSetIdleTime", res->resultSetIdleTime);
+ if (res->num_records)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, "records", 0);
+ yaz_srw_records(o, rptr, &res->records, &res->num_records,
+ client_data, ns);
+ }
+ if (res->num_diagnostics)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0);
+ yaz_srw_diagnostics(o, rptr, &res->diagnostics,
+ &res->num_diagnostics, client_data, ns);
+ }
+ add_xsd_integer(ptr, "nextRecordPosition", res->nextRecordPosition);
+ }
+ else if ((*p)->which == Z_SRW_explain_request)
+ {
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainRequest", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+ }
+ else if ((*p)->which == Z_SRW_explain_response)
+ {
+ Z_SRW_explainResponse *res = (*p)->u.explain_response;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainResponse", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string_n(ptr, "Explain", res->explainData_buf,
+ res->explainData_len);
+ }
+ else
+ return -1;
+
+ }
+ return 0;
+}
+
+Z_SRW_PDU *yaz_srw_get(ODR o, int which)
+{
+ Z_SRW_PDU *sr = odr_malloc(o, sizeof(*o));
+ sr->which = which;
+ switch(which)
+ {
+ case Z_SRW_searchRetrieve_request:
+ sr->u.request = (Z_SRW_searchRetrieveRequest *)
+ odr_malloc(o, sizeof(*sr->u.request));
+ sr->u.request->query_type = Z_SRW_query_type_cql;
+ sr->u.request->query.cql = 0;
+ sr->u.request->sort_type = Z_SRW_sort_type_none;
+ sr->u.request->sort.none = 0;
+ sr->u.request->startRecord = 0;
+ sr->u.request->maximumRecords = 0;
+ sr->u.request->recordSchema = 0;
+ sr->u.request->recordPacking = 0;
+ sr->u.request->database = 0;
+ break;
+ case Z_SRW_searchRetrieve_response:
+ sr->u.response = (Z_SRW_searchRetrieveResponse *)
+ odr_malloc(o, sizeof(*sr->u.response));
+ sr->u.response->numberOfRecords = 0;
+ sr->u.response->resultSetId = 0;
+ sr->u.response->resultSetIdleTime = 0;
+ sr->u.response->records = 0;
+ sr->u.response->num_records = 0;
+ sr->u.response->diagnostics = 0;
+ sr->u.response->num_diagnostics = 0;
+ sr->u.response->nextRecordPosition = 0;
+ break;
+ case Z_SRW_explain_request:
+ sr->u.explain_request = (Z_SRW_explainRequest *)
+ odr_malloc(o, sizeof(*sr->u.explain_request));
+ sr->u.explain_request->dummy = 0;
+ break;
+ case Z_SRW_explain_response:
+ sr->u.explain_response = (Z_SRW_explainResponse *)
+ odr_malloc(o, sizeof(*sr->u.explain_response));
+ sr->u.explain_response->explainPacking = 0;
+ sr->u.explain_response->explainData_buf = 0;
+ sr->u.explain_response->explainData_len = 0;
+ }
+ return sr;
+}
+
+#endif
+
+
+static struct {
+ int code;
+ const char *msg;
+} yaz_srw_codes [] = {
+{1, "Permanent system error"},
+{2, "System temporarily unavailable"},
+{3, "Authentication error"},
+/* Diagnostics Relating to CQL */
+{10, "Illegal query"},
+{11, "Unsupported query type (XCQL vs CQL)"},
+{12, "Too many characters in query"},
+{13, "Unbalanced or illegal use of parentheses"},
+{14, "Unbalanced or illegal use of quotes"},
+{15, "Illegal or unsupported index set"},
+{16, "Illegal or unsupported index"},
+{17, "Illegal or unsupported combination of index and index set"},
+{18, "Illegal or unsupported combination of indexes"},
+{19, "Illegal or unsupported relation"},
+{20, "Illegal or unsupported relation modifier"},
+{21, "Illegal or unsupported combination of relation modifers"},
+{22, "Illegal or unsupported combination of relation and index"},
+{23, "Too many characters in term"},
+{24, "Illegal combination of relation and term"},
+{25, "Special characters not quoted in term"},
+{26, "Non special character escaped in term"},
+{27, "Empty term unsupported"},
+{28, "Masking character not supported"},
+{29, "Masked words too short"},
+{30, "Too many masking characters in term"},
+{31, "Anchoring character not supported"},
+{32, "Anchoring character in illegal or unsupported position"},
+{33, "Combination of proximity/adjacency and masking characters not supported"},
+{34, "Combination of proximity/adjacency and anchoring characters not supported"},
+{35, "Terms only exclusion (stop) words"},
+{36, "Term in invalid format for index or relation"},
+{37, "Illegal or unsupported boolean operator"},
+{38, "Too many boolean operators in query"},
+{39, "Proximity not supported"},
+{40, "Illegal or unsupported proximity relation"},
+{41, "Illegal or unsupported proximity distance"},
+{42, "Illegal or unsupported proximity unit"},
+{43, "Illegal or unsupported proximity ordering"},
+{44, "Illegal or unsupported combination of proximity modifiers"},
+{45, "Index set name (prefix) assigned to multiple identifiers"},
+/* Diagnostics Relating to Result Sets */
+{50, "Result sets not supported"},
+{51, "Result set does not exist"},
+{52, "Result set temporarily unavailable"},
+{53, "Result sets only supported for retrieval"},
+{54, "Retrieval may only occur from an existing result set"},
+{55, "Combination of result sets with search terms not supported"},
+{56, "Only combination of single result set with search terms supported"},
+{57, "Result set created but no records available"},
+{58, "Result set created with unpredictable partial results available"},
+{59, "Result set created with valid partial results available"},
+/* Diagnostics Relating to Records */
+{60, "Too many records retrieved"},
+{61, "First record position out of range"},
+{62, "Negative number of records requested"},
+{63, "System error in retrieving records"},
+{64, "Record temporarily unavailable"},
+{65, "Record does not exist"},
+{66, "Unknown schema for retrieval"},
+{67, "Record not available in this schema"},
+{68, "Not authorised to send record"},
+{69, "Not authorised to send record in this schema"},
+{70, "Record too large to send"},
+/* Diagnostics Relating to Sorting */
+{80, "Sort not supported"},
+{81, "Unsupported sort type (sortKeys vs xSortKeys)"},
+{82, "Illegal or unsupported sort sequence"},
+{83, "Too many records"},
+{84, "Too many sort keys"},
+{85, "Duplicate sort keys"},
+{86, "Incompatible record formats"},
+{87, "Unsupported schema for sort"},
+{88, "Unsupported tag path for sort"},
+{89, "Tag path illegal or unsupported for schema"},
+{90, "Illegal or unsupported direction value"},
+{91, "Illegal or unsupported case value"},
+{92, "Illegal or unsupported missing value action"},
+/* Diagnostics Relating to Explain */
+{100, "Explain not supported"},
+{101, "Explain request type not supported (SOAP vs GET)"},
+{102, "Explain record temporarily unavailable"},
+{0, 0}
+};
+
+const char *yaz_diag_srw_str (int code)
+{
+ int i;
+ for (i = 0; yaz_srw_codes[i].code; i++)
+ if (yaz_srw_codes[i].code == code)
+ return yaz_srw_codes[i].msg;
+ return 0;
+}
+
+
+/* bib1:srw */
+static int srw_bib1_map[] = {
+ 1, 1,
+ 2, 2,
+ 3, 11,
+ 4, 35,
+ 5, 12,
+ 6, 38,
+ 7, 30,
+ 8, 32,
+ 9, 29,
+ 10, 10,
+ 11, 12,
+ 11, 23,
+ 12, 60,
+ 13, 61,
+ 13, 62,
+ 14, 63,
+ 14, 64,
+ 14, 65,
+ 15, 68,
+ 15, 69,
+ 16, 70,
+ 17, 70,
+ 18, 50,
+ 19, 55,
+ 20, 56,
+ 21, 52,
+ 22, 50,
+ 23, 1, /* bad map */
+ 24, 63, /* bad map */
+ 25, 63, /* bad map */
+ 26, 63, /* bad map */
+ 27, 51,
+ 28, 52,
+ 29, 52,
+ 30, 51,
+ 31, 57,
+ 32, 58,
+ 33, 59,
+ 100, 1, /* bad map */
+ 101, 3,
+ 102, 3,
+ 103, 3,
+ 104, 3,
+ 105, 3,
+ 106, 66,
+ 107, 11,
+ 108, 10,
+ 108, 13,
+ 108, 14,
+ 108, 25,
+ 108, 26,
+ 108, 27,
+ 108, 45,
+
+ 109, 1,
+ 110, 37,
+ 111, 1,
+ 112, 58,
+ 113, 10,
+ 114, 16,
+ 115, 16,
+ 116, 16,
+ 117, 19,
+ 118, 22,
+ 119, 32,
+ 119, 31,
+ 120, 28,
+ 121, 15,
+ 122, 32,
+ 123, 22,
+ 123, 17,
+ 123, 18,
+ 124, 24,
+ 125, 36,
+ 126, 36,
+ 127, 36,
+ 128, 51,
+ 129, 39,
+ 130, 43,
+ 131, 40,
+ 132, 42,
+ 201, 44,
+ 201, 33,
+ 201, 34,
+ 202, 41,
+ 203, 43,
+ 205, 1, /* bad map */
+ 206, 1, /* bad map */
+ 207, 89,
+ 208, 1, /* bad map */
+ 209, 80,
+ 210, 80,
+ 210, 81,
+ 211, 84,
+ 212, 85,
+ 213, 92,
+ 214, 90,
+ 215, 91,
+ 216, 92,
+ 217, 63,
+ 218, 1, /* bad map */
+ 219, 1, /* bad map */
+ 220, 1, /* bad map */
+ 221, 1, /* bad map */
+ 222, 1, /* bad map */
+ 223, 1, /* bad map */
+ 224, 1, /* bad map */
+ 225, 1, /* bad map */
+ 226, 1, /* bad map */
+ 227, 66,
+ 228, 1, /* bad map */
+ 229, 36,
+ 230, 83,
+ 231, 89,
+ 232, 1,
+ 233, 1, /* bad map */
+ 234, 1, /* bad map */
+ 235, 2,
+ 236, 3,
+ 237, 82,
+ 238, 67,
+ 239, 66,
+ 240, 1, /* bad map */
+ 241, 1, /* bad map */
+ 242, 70,
+ 243, 1, /* bad map */
+ 244, 66,
+ 245, 10,
+ 246, 10,
+ 247, 10,
+ 1001, 1, /* bad map */
+ 1002, 1, /* bad map */
+ 1003, 1, /* bad map */
+ 1004, 1, /* bad map */
+ 1005, 1, /* bad map */
+ 1006, 1, /* bad map */
+ 1007, 100,
+ 1008, 1,
+ 1009, 1,
+ 1010, 3,
+ 1011, 3,
+ 1012, 3,
+ 1013, 3,
+ 1014, 3,
+ 1015, 3,
+ 1015, 3,
+ 1016, 3,
+ 1017, 3,
+ 1018, 2,
+ 1019, 2,
+ 1020, 2,
+ 1021, 3,
+ 1022, 3,
+ 1023, 3,
+ 1024, 16,
+ 1025, 3,
+ 1026, 64,
+ 1027, 1,
+ 1028, 65,
+ 1029, 1,
+ 1040, 1,
+ /* 1041-1065 */
+ 1066, 66,
+ 1066, 67,
+ 0
+};
+
+int yaz_diag_bib1_to_srw (int code)
+{
+ const int *p = srw_bib1_map;
+ while (*p)
+ {
+ if (code == p[0])
+ return p[1];
+ p += 2;
+ }
+ return 1;
+}
+
+int yaz_diag_srw_to_bib1(int code)
+{
+ const int *p = srw_bib1_map;
+ while (*p)
+ {
+ if (code == p[1])
+ return p[0];
+ p += 2;
+ }
+ return 1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * NT threaded server code by
+ * Chas Woodfield, Fretwell Downing Informatics.
+ *
+ * $Id: statserv.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#ifdef WIN32
+#include <process.h>
+#include <winsock.h>
+#include <direct.h>
+#include "service.h"
+#else
+#include <unistd.h>
+#include <pwd.h>
+#endif
+
+#if YAZ_POSIX_THREADS
+#include <pthread.h>
+#elif YAZ_GNU_THREADS
+#include <pth.h>
+#endif
+
+#include <fcntl.h>
+#include <signal.h>
+#include <errno.h>
+
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+#include <yaz/options.h>
+#ifdef USE_XTIMOSI
+#include <yaz/xmosi.h>
+#endif
+#include <yaz/log.h>
+#include "eventl.h"
+#include "session.h"
+#include <yaz/statserv.h>
+
+static IOCHAN pListener = NULL;
+
+static char *me = "statserver";
+/*
+ * default behavior.
+ */
+int check_options(int argc, char **argv);
+statserv_options_block control_block = {
+ 1, /* dynamic mode */
+ 0, /* threaded mode */
+ 0, /* one shot (single session) */
+ LOG_DEFAULT_LEVEL, /* log level */
+ "", /* no PDUs */
+ "", /* diagnostic output to stderr */
+ "tcp:@:9999", /* default listener port */
+ PROTO_Z3950, /* default application protocol */
+ 15, /* idle timeout (minutes) */
+ 1024*1024, /* maximum PDU size (approx.) to allow */
+ "default-config", /* configuration name to pass to backend */
+ "", /* set user id */
+ 0, /* bend_start handler */
+ 0, /* bend_stop handler */
+ check_options, /* Default routine, for checking the run-time arguments */
+ check_ip_tcpd,
+ "",
+ 0, /* default value for inet deamon */
+ 0, /* handle (for service, etc) */
+ 0, /* bend_init handle */
+ 0, /* bend_close handle */
+#ifdef WIN32
+ "Z39.50 Server", /* NT Service Name */
+ "Server", /* NT application Name */
+ "", /* NT Service Dependencies */
+ "Z39.50 Server", /* NT Service Display Name */
+#endif /* WIN32 */
+ 0 /* SOAP handlers */
+};
+
+static int max_sessions = 0;
+
+/*
+ * handle incoming connect requests.
+ * The dynamic mode is a bit tricky mostly because we want to avoid
+ * doing all of the listening and accepting in the parent - it's
+ * safer that way.
+ */
+#ifdef WIN32
+
+typedef struct _ThreadList ThreadList;
+
+struct _ThreadList
+{
+ HANDLE hThread;
+ IOCHAN pIOChannel;
+ ThreadList *pNext;
+};
+
+static ThreadList *pFirstThread;
+static CRITICAL_SECTION Thread_CritSect;
+static BOOL bInitialized = FALSE;
+
+static void ThreadList_Initialize()
+{
+ /* Initialize the critical Sections */
+ InitializeCriticalSection(&Thread_CritSect);
+
+ /* Set the first thraed */
+ pFirstThread = NULL;
+
+ /* we have been initialized */
+ bInitialized = TRUE;
+}
+
+static void statserv_add(HANDLE hThread, IOCHAN pIOChannel)
+{
+ /* Only one thread can go through this section at a time */
+ EnterCriticalSection(&Thread_CritSect);
+
+ {
+ /* Lets create our new object */
+ ThreadList *pNewThread = (ThreadList *)malloc(sizeof(ThreadList));
+ pNewThread->hThread = hThread;
+ pNewThread->pIOChannel = pIOChannel;
+ pNewThread->pNext = pFirstThread;
+ pFirstThread = pNewThread;
+
+ /* Lets let somebody else create a new object now */
+ LeaveCriticalSection(&Thread_CritSect);
+ }
+}
+
+void statserv_remove(IOCHAN pIOChannel)
+{
+ /* Only one thread can go through this section at a time */
+ EnterCriticalSection(&Thread_CritSect);
+
+ {
+ ThreadList *pCurrentThread = pFirstThread;
+ ThreadList *pNextThread;
+ ThreadList *pPrevThread =NULL;
+
+ /* Step through alll the threads */
+ for (; pCurrentThread != NULL; pCurrentThread = pNextThread)
+ {
+ /* We only need to compare on the IO Channel */
+ if (pCurrentThread->pIOChannel == pIOChannel)
+ {
+ /* We have found the thread we want to delete */
+ /* First of all reset the next pointers */
+ if (pPrevThread == NULL)
+ pFirstThread = pCurrentThread->pNext;
+ else
+ pPrevThread->pNext = pCurrentThread->pNext;
+
+ /* All we need todo now is delete the memory */
+ free(pCurrentThread);
+
+ /* No need to look at any more threads */
+ pNextThread = NULL;
+ }
+ else
+ {
+ /* We need to look at another thread */
+ pNextThread = pCurrentThread->pNext;
+ pPrevThread = pCurrentThread;
+ }
+ }
+
+ /* Lets let somebody else remove an object now */
+ LeaveCriticalSection(&Thread_CritSect);
+ }
+}
+
+/* WIN32 statserv_closedown */
+void statserv_closedown()
+{
+ /* Shouldn't do anything if we are not initialized */
+ if (bInitialized)
+ {
+ int iHandles = 0;
+ HANDLE *pThreadHandles = NULL;
+
+ /* We need to stop threads adding and removing while we */
+ /* start the closedown process */
+ EnterCriticalSection(&Thread_CritSect);
+
+ {
+ /* We have exclusive access to the thread stuff now */
+ /* Y didn't i use a semaphore - Oh well never mind */
+ ThreadList *pCurrentThread = pFirstThread;
+
+ /* Before we do anything else, we need to shutdown the listener */
+ if (pListener != NULL)
+ iochan_destroy(pListener);
+
+ for (; pCurrentThread != NULL; pCurrentThread = pCurrentThread->pNext)
+ {
+ /* Just destroy the IOCHAN, that should do the trick */
+ iochan_destroy(pCurrentThread->pIOChannel);
+ closesocket(pCurrentThread->pIOChannel->fd);
+
+ /* Keep a running count of our handles */
+ iHandles++;
+ }
+
+ if (iHandles > 0)
+ {
+ HANDLE *pCurrentHandle ;
+
+ /* Allocate the thread handle array */
+ pThreadHandles = (HANDLE *)malloc(sizeof(HANDLE) * iHandles);
+ pCurrentHandle = pThreadHandles;
+
+ for (pCurrentThread = pFirstThread;
+ pCurrentThread != NULL;
+ pCurrentThread = pCurrentThread->pNext, pCurrentHandle++)
+ {
+ /* Just the handle */
+ *pCurrentHandle = pCurrentThread->hThread;
+ }
+ }
+
+ /* We can now leave the critical section */
+ LeaveCriticalSection(&Thread_CritSect);
+ }
+
+ /* Now we can really do something */
+ if (iHandles > 0)
+ {
+ logf (LOG_LOG, "waiting for %d to die", iHandles);
+ /* This will now wait, until all the threads close */
+ WaitForMultipleObjects(iHandles, pThreadHandles, TRUE, INFINITE);
+
+ /* Free the memory we allocated for the handle array */
+ free(pThreadHandles);
+ }
+
+ if (control_block.bend_stop)
+ (*control_block.bend_stop)(&control_block);
+ /* No longer require the critical section, since all threads are dead */
+ DeleteCriticalSection(&Thread_CritSect);
+ }
+}
+
+void __cdecl event_loop_thread (IOCHAN iochan)
+{
+ event_loop (&iochan);
+}
+
+/* WIN32 listener */
+static void listener(IOCHAN h, int event)
+{
+ COMSTACK line = (COMSTACK) iochan_getdata(h);
+ association *newas;
+ int res;
+ HANDLE newHandle;
+
+ if (event == EVENT_INPUT)
+ {
+ if ((res = cs_listen(line, 0, 0)) < 0)
+ {
+ yaz_log(LOG_FATAL, "cs_listen failed");
+ return;
+ }
+ else if (res == 1)
+ return;
+ yaz_log(LOG_DEBUG, "listen ok");
+ iochan_setevent(h, EVENT_OUTPUT);
+ iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */
+ }
+ else if (event == EVENT_OUTPUT)
+ {
+ COMSTACK new_line = cs_accept(line);
+ IOCHAN new_chan;
+ char *a = NULL;
+
+ if (!new_line)
+ {
+ yaz_log(LOG_FATAL, "Accept failed.");
+ iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT);
+ return;
+ }
+ yaz_log(LOG_DEBUG, "Accept ok");
+
+ if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session,
+ EVENT_INPUT)))
+ {
+ yaz_log(LOG_FATAL, "Failed to create iochan");
+ iochan_destroy(h);
+ return;
+ }
+
+ yaz_log(LOG_DEBUG, "Creating association");
+ if (!(newas = create_association(new_chan, new_line)))
+ {
+ yaz_log(LOG_FATAL, "Failed to create new assoc.");
+ iochan_destroy(h);
+ return;
+ }
+ newas->cs_get_mask = EVENT_INPUT;
+ newas->cs_put_mask = 0;
+ newas->cs_accept_mask = 0;
+
+ yaz_log(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout);
+ iochan_setdata(new_chan, newas);
+ iochan_settimeout(new_chan, 60);
+
+ /* Now what we need todo is create a new thread with this iochan as
+ the parameter */
+ newHandle = (HANDLE) _beginthread(event_loop_thread, 0, new_chan);
+ if (newHandle == (HANDLE) -1)
+ {
+
+ yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create new thread.");
+ iochan_destroy(h);
+ return;
+ }
+ /* We successfully created the thread, so add it to the list */
+ statserv_add(newHandle, new_chan);
+
+ yaz_log(LOG_DEBUG, "Created new thread, id = %ld iochan %p",(long) newHandle, new_chan);
+ iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
+ }
+ else
+ {
+ yaz_log(LOG_FATAL, "Bad event on listener.");
+ iochan_destroy(h);
+ return;
+ }
+}
+
+int statserv_must_terminate(void)
+{
+ return 0;
+}
+
+#else /* ! WIN32 */
+
+static int term_flag = 0;
+/* To save having an #ifdef in event_loop we need to
+ define this empty function
+*/
+int statserv_must_terminate(void)
+{
+ return term_flag;
+}
+
+void statserv_remove(IOCHAN pIOChannel)
+{
+}
+
+void statserv_closedown()
+{
+ IOCHAN p;
+
+ if (control_block.bend_stop)
+ (*control_block.bend_stop)(&control_block);
+ for (p = pListener; p; p = p->next)
+ {
+ iochan_destroy(p);
+ }
+}
+
+void sigterm(int sig)
+{
+ term_flag = 1;
+}
+
+static void *new_session (void *vp);
+static int no_sessions = 0;
+
+/* UNIX listener */
+static void listener(IOCHAN h, int event)
+{
+ COMSTACK line = (COMSTACK) iochan_getdata(h);
+ static int hand[2];
+ static int child = 0;
+ int res;
+
+ if (event == EVENT_INPUT)
+ {
+ if (control_block.dynamic && !child)
+ {
+ int res;
+
+ ++no_sessions;
+ if (pipe(hand) < 0)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "pipe");
+ iochan_destroy(h);
+ return;
+ }
+ if ((res = fork()) < 0)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "fork");
+ iochan_destroy(h);
+ return;
+ }
+ else if (res == 0) /* child */
+ {
+ char nbuf[100];
+ IOCHAN pp;
+
+ close(hand[0]);
+ child = 1;
+ for (pp = pListener; pp; pp = iochan_getnext(pp))
+ {
+ if (pp != h)
+ {
+ COMSTACK l = (COMSTACK)iochan_getdata(pp);
+ cs_close(l);
+ iochan_destroy(pp);
+ }
+ }
+ sprintf(nbuf, "%s(%d)", me, getpid());
+ yaz_log_init(control_block.loglevel, nbuf, 0);
+ /* ensure that bend_stop is not called when each child exits -
+ only for the main process ..
+ */
+ control_block.bend_stop = 0;
+ }
+ else /* parent */
+ {
+ close(hand[1]);
+ /* wait for child to take the call */
+ for (;;)
+ {
+ char dummy[1];
+ int res;
+
+ if ((res = read(hand[0], dummy, 1)) < 0 &&
+ yaz_errno() != EINTR)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "handshake read");
+ return;
+ }
+ else if (res >= 0)
+ break;
+ }
+ yaz_log(LOG_DEBUG, "P: Child has taken the call");
+ close(hand[0]);
+ return;
+ }
+ }
+ if ((res = cs_listen_check(line, 0, 0, control_block.check_ip,
+ control_block.daemon_name)) < 0)
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "cs_listen failed");
+ return;
+ }
+ else if (res == 1)
+ return;
+ yaz_log(LOG_DEBUG, "listen ok");
+ iochan_setevent(h, EVENT_OUTPUT);
+ iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */
+ }
+ /* in dynamic mode, only the child ever comes down here */
+ else if (event == EVENT_OUTPUT)
+ {
+ COMSTACK new_line = cs_accept(line);
+
+ if (!new_line)
+ {
+ yaz_log(LOG_FATAL, "Accept failed.");
+ iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
+ return;
+ }
+ yaz_log(LOG_DEBUG, "accept ok");
+ if (control_block.dynamic)
+ {
+ IOCHAN pp;
+ /* close our half of the listener socket */
+ for (pp = pListener; pp; pp = iochan_getnext(pp))
+ {
+ COMSTACK l = (COMSTACK)iochan_getdata(pp);
+ cs_close(l);
+ iochan_destroy(pp);
+ }
+ /* release dad */
+ yaz_log(LOG_DEBUG, "Releasing parent");
+ close(hand[1]);
+ }
+ else
+ {
+ iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
+ ++no_sessions;
+ }
+#if YAZ_POSIX_THREADS
+ if (control_block.threads)
+ {
+ pthread_t child_thread;
+ pthread_create (&child_thread, 0, new_session, new_line);
+ pthread_detach (child_thread);
+ }
+ else
+ new_session(new_line);
+#elif YAZ_GNU_THREADS
+ if (control_block.threads)
+ {
+ pth_attr_t attr;
+ pth_t child_thread;
+
+ attr = pth_attr_new ();
+ pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE);
+ pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024);
+ pth_attr_set (attr, PTH_ATTR_NAME, "session");
+ yaz_log (LOG_LOG, "pth_spawn begin");
+ child_thread = pth_spawn (attr, new_session, new_line);
+ yaz_log (LOG_LOG, "pth_spawn finish");
+ pth_attr_destroy (attr);
+ }
+ else
+ new_session(new_line);
+#else
+ new_session(new_line);
+#endif
+ }
+ else if (event == EVENT_TIMEOUT)
+ {
+ yaz_log(LOG_LOG, "Shutting down listener.");
+ iochan_destroy(h);
+ }
+ else
+ {
+ yaz_log(LOG_FATAL, "Bad event on listener.");
+ iochan_destroy(h);
+ }
+}
+
+static void *new_session (void *vp)
+{
+ char *a;
+ association *newas;
+ IOCHAN new_chan;
+ COMSTACK new_line = (COMSTACK) vp;
+
+ unsigned cs_get_mask, cs_accept_mask, mask =
+ ((new_line->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) |
+ ((new_line->io_pending & CS_WANT_READ) ? EVENT_INPUT : 0);
+
+ if (mask)
+ {
+ cs_accept_mask = mask; /* accept didn't complete */
+ cs_get_mask = 0;
+ }
+ else
+ {
+ cs_accept_mask = 0; /* accept completed. */
+ cs_get_mask = mask = EVENT_INPUT;
+ }
+
+ if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, mask)))
+ {
+ yaz_log(LOG_FATAL, "Failed to create iochan");
+ return 0;
+ }
+ if (!(newas = create_association(new_chan, new_line)))
+ {
+ yaz_log(LOG_FATAL, "Failed to create new assoc.");
+ return 0;
+ }
+ newas->cs_accept_mask = cs_accept_mask;
+ newas->cs_get_mask = cs_get_mask;
+
+ iochan_setdata(new_chan, newas);
+ iochan_settimeout(new_chan, 60);
+#if 1
+ a = cs_addrstr(new_line);
+#else
+ a = 0;
+#endif
+ yaz_log(LOG_LOG, "Starting session %d from %s",
+ no_sessions, a ? a : "[Unknown]");
+ if (max_sessions && no_sessions == max_sessions)
+ control_block.one_shot = 1;
+ if (control_block.threads)
+ {
+ event_loop(&new_chan);
+ }
+ else
+ {
+ new_chan->next = pListener;
+ pListener = new_chan;
+ }
+ return 0;
+}
+
+/* UNIX */
+#endif
+
+static void inetd_connection(int what)
+{
+ COMSTACK line;
+ IOCHAN chan;
+ association *assoc;
+ char *addr;
+
+ if ((line = cs_createbysocket(0, tcpip_type, 0, what)))
+ {
+ if ((chan = iochan_create(cs_fileno(line), ir_session, EVENT_INPUT)))
+ {
+ if ((assoc = create_association(chan, line)))
+ {
+ iochan_setdata(chan, assoc);
+ iochan_settimeout(chan, 60);
+ addr = cs_addrstr(line);
+ yaz_log(LOG_LOG, "Inetd association from %s",
+ addr ? addr : "[UNKNOWN]");
+ assoc->cs_get_mask = EVENT_INPUT;
+ }
+ else
+ {
+ yaz_log(LOG_FATAL, "Failed to create association structure");
+ }
+ chan->next = pListener;
+ pListener = chan;
+ }
+ else
+ {
+ yaz_log(LOG_FATAL, "Failed to create iochan");
+ }
+ }
+ else
+ {
+ yaz_log(LOG_ERRNO|LOG_FATAL, "Failed to create comstack on socket 0");
+ }
+}
+
+/*
+ * Set up a listening endpoint, and give it to the event-handler.
+ */
+static int add_listener(char *where, int what)
+{
+ COMSTACK l;
+ void *ap;
+ IOCHAN lst = NULL;
+ const char *mode;
+
+ if (control_block.dynamic)
+ mode = "dynamic";
+ else if (control_block.threads)
+ mode = "threaded";
+ else
+ mode = "static";
+
+ yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode,
+ what == PROTO_SR ? "SR" : "Z3950", where);
+
+ l = cs_create_host(where, 0, &ap);
+ if (!l)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where);
+ return -1;
+ }
+ if (cs_bind(l, ap, CS_SERVER) < 0)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where);
+ cs_close (l);
+ return -1;
+ }
+ if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT |
+ EVENT_EXCEPT)))
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create IOCHAN-type");
+ cs_close (l);
+ return -1;
+ }
+ iochan_setdata(lst, l);
+
+ /* Ensure our listener chain is setup properly */
+ lst->next = pListener;
+ pListener = lst;
+ return 0; /* OK */
+}
+
+#ifndef WIN32
+/* UNIX only (for windows we don't need to catch the signals) */
+static void catchchld(int num)
+{
+ while (waitpid(-1, 0, WNOHANG) > 0)
+ ;
+ signal(SIGCHLD, catchchld);
+}
+#endif
+
+statserv_options_block *statserv_getcontrol(void)
+{
+ static statserv_options_block cb;
+
+ memcpy(&cb, &control_block, sizeof(cb));
+ return &cb;
+}
+
+void statserv_setcontrol(statserv_options_block *block)
+{
+ memcpy(&control_block, block, sizeof(*block));
+}
+
+static void statserv_reset(void)
+{
+}
+
+int statserv_start(int argc, char **argv)
+{
+ int ret;
+
+#ifdef WIN32
+ /* We need to initialize the thread list */
+ ThreadList_Initialize();
+/* WIN32 */
+#endif
+
+#ifdef WIN32
+ if ((me = strrchr (argv[0], '\\')))
+ me++;
+ else
+ me = argv[0];
+#else
+ me = argv[0];
+#endif
+ if (control_block.options_func(argc, argv))
+ return(1);
+
+ if (control_block.bend_start)
+ (*control_block.bend_start)(&control_block);
+#ifdef WIN32
+ yaz_log (LOG_LOG, "Starting server %s", me);
+#else
+/* UNIX */
+ if (control_block.inetd)
+ inetd_connection(control_block.default_proto);
+ else
+ {
+ yaz_log (LOG_LOG, "Starting server %s pid=%d", me, getpid());
+#if 0
+ sigset_t sigs_to_block;
+
+ sigemptyset(&sigs_to_block);
+ sigaddset (&sigs_to_block, SIGTERM);
+ pthread_sigmask (SIG_BLOCK, &sigs_to_block, 0);
+ /* missing... */
+#endif
+ if (control_block.dynamic)
+ signal(SIGCHLD, catchchld);
+ }
+ signal (SIGPIPE, SIG_IGN);
+ signal (SIGTERM, sigterm);
+ if (*control_block.setuid)
+ {
+ struct passwd *pw;
+
+ if (!(pw = getpwnam(control_block.setuid)))
+ {
+ yaz_log(LOG_FATAL, "%s: Unknown user", control_block.setuid);
+ return(1);
+ }
+ if (setuid(pw->pw_uid) < 0)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
+ exit(1);
+ }
+ }
+/* UNIX */
+#endif
+
+
+ if ((pListener == NULL) && *control_block.default_listen)
+ add_listener(control_block.default_listen,
+ control_block.default_proto);
+
+ if (pListener == NULL)
+ ret = 1;
+ else
+ {
+ yaz_log(LOG_LOG, "Entering event loop.");
+ ret = event_loop(&pListener);
+ }
+ return ret;
+}
+
+int check_options(int argc, char **argv)
+{
+ int ret = 0, r;
+ char *arg;
+
+ while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:D:", argv, argc, &arg)) != -2)
+ {
+ switch (ret)
+ {
+ case 0:
+ if (add_listener(arg, control_block.default_proto))
+ return 1; /* failed to create listener */
+ break;
+ case '1':
+ control_block.one_shot = 1;
+ control_block.dynamic = 0;
+ break;
+ case 'z':
+ control_block.default_proto = PROTO_Z3950;
+ break;
+ case 's':
+ fprintf (stderr, "%s: SR protocol no longer supported\n", me);
+ exit (1);
+ break;
+ case 'S':
+ control_block.dynamic = 0;
+ break;
+ case 'T':
+#if YAZ_POSIX_THREADS
+ control_block.dynamic = 0;
+ control_block.threads = 1;
+#elif YAZ_GNU_THREADS
+ control_block.dynamic = 0;
+ control_block.threads = 1;
+#else
+ fprintf(stderr, "%s: Threaded mode not available.\n", me);
+ return 1;
+#endif
+ break;
+ case 'l':
+ strcpy(control_block.logfile, arg ? arg : "");
+ yaz_log_init(control_block.loglevel, me, control_block.logfile);
+ break;
+ case 'v':
+ control_block.loglevel = yaz_log_mask_str(arg);
+ yaz_log_init(control_block.loglevel, me, control_block.logfile);
+ break;
+ case 'a':
+ strcpy(control_block.apdufile, arg ? arg : "");
+ break;
+ case 'u':
+ strcpy(control_block.setuid, arg ? arg : "");
+ break;
+ case 'c':
+ strcpy(control_block.configname, arg ? arg : "");
+ break;
+ case 'd':
+ strcpy(control_block.daemon_name, arg ? arg : "");
+ break;
+ case 't':
+ if (!arg || !(r = atoi(arg)))
+ {
+ fprintf(stderr, "%s: Specify positive timeout for -t.\n", me);
+ return(1);
+ }
+ control_block.idle_timeout = r;
+ break;
+ case 'k':
+ if (!arg || !(r = atoi(arg)))
+ {
+ fprintf(stderr, "%s: Specify positive size for -k.\n", me);
+ return(1);
+ }
+ control_block.maxrecordsize = r * 1024;
+ break;
+ case 'i':
+ control_block.inetd = 1;
+ break;
+ case 'w':
+ if (chdir(arg))
+ {
+ perror(arg);
+ return 1;
+ }
+ break;
+ case 'D':
+ max_sessions = atoi(arg);
+ break;
+ default:
+ fprintf(stderr, "Usage: %s [ -a <pdufile> -v <loglevel>"
+ " -l <logfile> -u <user> -c <config> -t <minutes>"
+ " -k <kilobytes> -d <daemon>"
+ " -ziST1 -w <directory> <listender-addr>... ]\n", me);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#ifdef WIN32
+typedef struct _Args
+{
+ char **argv;
+ int argc;
+} Args;
+
+static Args ArgDetails;
+
+/* name of the executable */
+#define SZAPPNAME "server"
+
+/* list of service dependencies - "dep1\0dep2\0\0" */
+#define SZDEPENDENCIES ""
+
+int statserv_main(int argc, char **argv,
+ bend_initresult *(*bend_init)(bend_initrequest *r),
+ void (*bend_close)(void *handle))
+{
+ statserv_options_block *cb = statserv_getcontrol();
+
+ cb->bend_init = bend_init;
+ cb->bend_close = bend_close;
+
+ statserv_setcontrol(cb);
+
+ /* Lets setup the Arg structure */
+ ArgDetails.argc = argc;
+ ArgDetails.argv = argv;
+
+ /* Now setup the service with the service controller */
+ SetupService(argc, argv, &ArgDetails, SZAPPNAME,
+ cb->service_name, /* internal service name */
+ cb->service_display_name, /* displayed name */
+ SZDEPENDENCIES);
+ return 0;
+}
+
+int StartAppService(void *pHandle, int argc, char **argv)
+{
+ /* Initializes the App */
+ return 1;
+}
+
+void RunAppService(void *pHandle)
+{
+ Args *pArgs = (Args *)pHandle;
+
+ /* Starts the app running */
+ statserv_start(pArgs->argc, pArgs->argv);
+}
+
+void StopAppService(void *pHandle)
+{
+ /* Stops the app */
+ statserv_closedown();
+ statserv_reset();
+}
+/* WIN32 */
+#else
+/* UNIX */
+int statserv_main(int argc, char **argv,
+ bend_initresult *(*bend_init)(bend_initrequest *r),
+ void (*bend_close)(void *handle))
+{
+ int ret;
+ statserv_options_block *cb = statserv_getcontrol();
+
+ cb->bend_init = bend_init;
+ cb->bend_close = bend_close;
+
+ statserv_setcontrol(cb);
+ ret = statserv_start (argc, argv);
+ statserv_closedown ();
+ statserv_reset();
+ return ret;
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: tcpdchk.c,v $
+ * Revision 1.1 2003-10-27 12:21:35 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.5 2000/02/28 11:20:06 adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.4 1999/11/30 13:47:12 adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3 1999/08/27 09:40:32 adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.2 1999/04/20 09:56:48 adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.1 1999/04/16 14:45:55 adam
+ * Added interface for tcpd wrapper for access control.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <yaz/yconfig.h>
+#include <yaz/comstack.h>
+
+#if HAVE_TCPD_H
+#include <syslog.h>
+#include <tcpd.h>
+
+
+int allow_severity = LOG_INFO;
+int deny_severity = LOG_WARNING;
+
+#ifdef LOG_DEBUG
+#undef LOG_DEBUG
+#endif
+#ifdef LOG_WARN
+#undef LOG_WARN
+#endif
+
+#endif
+
+#include <yaz/statserv.h>
+#include <yaz/log.h>
+
+int check_ip_tcpd(void *cd, const char *addr, int len, int type)
+{
+ const char *daemon_name = (const char *) cd;
+
+ if (type == AF_INET)
+ {
+ if (daemon_name && *daemon_name)
+ {
+#if HAVE_TCPD_H
+ struct request_info request_info;
+ int i;
+#endif
+ char *host_name = 0, *host_addr = 0;
+ struct hostent *host;
+
+ struct sockaddr_in *addr_in = (struct sockaddr_in *) addr;
+
+ if ((host = gethostbyaddr((char*)&addr_in->sin_addr,
+ sizeof(addr_in->sin_addr),
+ AF_INET)))
+ host_name = (char*) host->h_name;
+ host_addr = inet_ntoa(addr_in->sin_addr);
+#if HAVE_TCPD_H
+ if (host_addr)
+ request_init(&request_info, RQ_DAEMON, daemon_name,
+ RQ_CLIENT_NAME, host_name,
+ RQ_CLIENT_SIN, addr_in,
+ RQ_CLIENT_ADDR, host_addr, 0);
+ else
+ request_init(&request_info, RQ_DAEMON, daemon_name,
+ RQ_CLIENT_SIN, addr_in,
+ RQ_CLIENT_ADDR, host_addr, 0);
+ i = hosts_access(&request_info);
+ if (!i)
+ {
+ yaz_log (LOG_DEBUG, "access denied from %s",
+ host_name ? host_name : host_addr);
+ return 1;
+ }
+ yaz_log (LOG_DEBUG, "access granted from %s",
+ host_name ? host_name : host_addr);
+#endif
+ }
+ }
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tcpip.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+#else
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#if HAVE_OPENSSL_SSL_H
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#endif
+
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+#include <yaz/log.h>
+#include <yaz/nmem.h>
+
+#ifdef WIN32
+#else
+#include <netinet/tcp.h>
+#endif
+
+static int tcpip_close(COMSTACK h);
+static int tcpip_put(COMSTACK h, char *buf, int size);
+static int tcpip_get(COMSTACK h, char **buf, int *bufsize);
+static int tcpip_connect(COMSTACK h, void *address);
+static int tcpip_more(COMSTACK h);
+static int tcpip_rcvconnect(COMSTACK h);
+static int tcpip_bind(COMSTACK h, void *address, int mode);
+static int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
+ int (*check_ip)(void *cd, const char *a, int len, int type),
+ void *cd);
+static int tcpip_set_blocking(COMSTACK p, int blocking);
+
+#if HAVE_OPENSSL_SSL_H
+static int ssl_get(COMSTACK h, char **buf, int *bufsize);
+static int ssl_put(COMSTACK h, char *buf, int size);
+#endif
+
+static COMSTACK tcpip_accept(COMSTACK h);
+static char *tcpip_addrstr(COMSTACK h);
+static void *tcpip_straddr(COMSTACK h, const char *str);
+
+#if 0
+#define TRC(x) x
+#else
+#define TRC(X)
+#endif
+
+#ifndef YAZ_SOCKLEN_T
+#define YAZ_SOCKLEN_T int
+#endif
+
+/* this state is used for both SSL and straight TCP/IP */
+typedef struct tcpip_state
+{
+ char *altbuf; /* alternate buffer for surplus data */
+ int altsize; /* size as xmalloced */
+ int altlen; /* length of data or 0 if none */
+
+ int written; /* -1 if we aren't writing */
+ int towrite; /* to verify against user input */
+ int (*complete)(const unsigned char *buf, int len); /* length/comple. */
+ struct sockaddr_in addr; /* returned by cs_straddr */
+ char buf[128]; /* returned by cs_addrstr */
+#if HAVE_OPENSSL_SSL_H
+ SSL_CTX *ctx;
+ SSL_CTX *ctx_alloc;
+ SSL *ssl;
+#endif
+} tcpip_state;
+
+#ifdef WIN32
+static int tcpip_init (void)
+{
+ static int initialized = 0;
+ if (!initialized)
+ {
+ WORD requested;
+ WSADATA wd;
+
+ requested = MAKEWORD(1, 1);
+ if (WSAStartup(requested, &wd))
+ return 0;
+ initialized = 1;
+ }
+ return 1;
+}
+#else
+static int tcpip_init (void)
+{
+ return 1;
+}
+#endif
+
+/*
+ * This function is always called through the cs_create() macro.
+ * s >= 0: socket has already been established for us.
+ */
+COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
+{
+ COMSTACK p;
+ tcpip_state *state;
+ int new_socket;
+#ifdef WIN32
+ unsigned long tru = 1;
+#endif
+
+ if (!tcpip_init ())
+ return 0;
+ if (s < 0)
+ {
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ return 0;
+ new_socket = 1;
+ }
+ else
+ new_socket = 0;
+ if (!(p = (struct comstack *)xmalloc(sizeof(struct comstack))))
+ return 0;
+ if (!(state = (struct tcpip_state *)(p->cprivate =
+ xmalloc(sizeof(tcpip_state)))))
+ return 0;
+
+ if (!((p->blocking = blocking)&1))
+ {
+#ifdef WIN32
+ if (ioctlsocket(s, FIONBIO, &tru) < 0)
+ return 0;
+#else
+ if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
+ return 0;
+#ifndef MSG_NOSIGNAL
+ signal (SIGPIPE, SIG_IGN);
+#endif
+#endif
+ }
+
+ p->io_pending = 0;
+ p->iofile = s;
+ p->type = tcpip_type;
+ p->protocol = (enum oid_proto) protocol;
+
+ p->f_connect = tcpip_connect;
+ p->f_rcvconnect = tcpip_rcvconnect;
+ p->f_get = tcpip_get;
+ p->f_put = tcpip_put;
+ p->f_close = tcpip_close;
+ p->f_more = tcpip_more;
+ p->f_bind = tcpip_bind;
+ p->f_listen = tcpip_listen;
+ p->f_accept = tcpip_accept;
+ p->f_addrstr = tcpip_addrstr;
+ p->f_straddr = tcpip_straddr;
+ p->f_set_blocking = tcpip_set_blocking;
+
+ p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
+ p->event = CS_NONE;
+ p->cerrno = 0;
+ p->stackerr = 0;
+
+#if HAVE_OPENSSL_SSL_H
+ state->ctx = state->ctx_alloc = 0;
+ state->ssl = 0;
+#endif
+
+ state->altbuf = 0;
+ state->altsize = state->altlen = 0;
+ state->towrite = state->written = -1;
+ if (protocol == PROTO_WAIS)
+ state->complete = completeWAIS;
+ else
+ state->complete = cs_complete_auto;
+
+ p->timeout = COMSTACK_DEFAULT_TIMEOUT;
+ TRC(fprintf(stderr, "Created new TCPIP comstack\n"));
+
+ return p;
+}
+
+#if HAVE_OPENSSL_SSL_H
+
+COMSTACK ssl_type(int s, int blocking, int protocol, void *vp)
+{
+ tcpip_state *state;
+ COMSTACK p;
+ yaz_log(LOG_LOG, "ssl_type begin");
+
+ p = tcpip_type (s, blocking, protocol, 0);
+ if (!p)
+ return 0;
+ p->f_get = ssl_get;
+ p->f_put = ssl_put;
+ p->type = ssl_type;
+ state = (tcpip_state *) p->cprivate;
+ if (vp)
+ state->ctx = vp;
+ else
+ {
+ SSL_load_error_strings();
+ SSLeay_add_all_algorithms();
+
+ state->ctx = state->ctx_alloc = SSL_CTX_new (SSLv23_method());
+ if (!state->ctx)
+ {
+ tcpip_close(p);
+ return 0;
+ }
+ }
+ /* note: we don't handle already opened socket in SSL mode - yet */
+ yaz_log(LOG_LOG, "ssl_type end");
+ return p;
+}
+#endif
+
+int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add,
+ int default_port)
+{
+ struct hostent *hp;
+ char *p, buf[512];
+ short int port = default_port;
+ unsigned tmpadd;
+
+ if (!tcpip_init ())
+ return 0;
+ TRC(fprintf(stderr, "tcpip_strtoaddress: %s\n", str ? str : "NULL"));
+ add->sin_family = AF_INET;
+ strncpy(buf, str, 511);
+ buf[511] = 0;
+ if ((p = strchr(buf, '/')))
+ *p = 0;
+ if ((p = strchr(buf, ':')))
+ {
+ *p = 0;
+ port = atoi(p + 1);
+ }
+ add->sin_port = htons(port);
+ if (!strcmp("@", buf))
+ add->sin_addr.s_addr = INADDR_ANY;
+ else if ((hp = gethostbyname(buf)))
+ memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
+ sizeof(struct in_addr));
+ else if ((tmpadd = (unsigned) inet_addr(buf)) != 0)
+ memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+ else
+ return 0;
+ return 1;
+}
+
+void *tcpip_straddr(COMSTACK h, const char *str)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ int port = 210;
+
+ if (h->protocol == PROTO_HTTP)
+ port = 80;
+
+ if (!tcpip_strtoaddr_ex (str, &sp->addr, port))
+ return 0;
+ return &sp->addr;
+}
+
+struct sockaddr_in *tcpip_strtoaddr(const char *str)
+{
+ static struct sockaddr_in add;
+
+ if (!tcpip_strtoaddr_ex (str, &add, 210))
+ return 0;
+ return &add;
+}
+
+int tcpip_more(COMSTACK h)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+
+ return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
+ sp->altlen);
+}
+
+/*
+ * connect(2) will block (sometimes) - nothing we can do short of doing
+ * weird things like spawning subprocesses or threading or some weird junk
+ * like that.
+ */
+int tcpip_connect(COMSTACK h, void *address)
+{
+ struct sockaddr_in *add = (struct sockaddr_in *)address;
+#if HAVE_OPENSSL_SSL_H
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+#endif
+ int r;
+#ifdef __sun__
+ int recbuflen;
+ YAZ_SOCKLEN_T rbufsize = sizeof(recbuflen);
+#endif
+ TRC(fprintf(stderr, "tcpip_connect\n"));
+ h->io_pending = 0;
+ if (h->state != CS_ST_UNBND)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+#ifdef __sun__
+ /* On Suns, you must set a bigger Receive Buffer BEFORE a call to connect
+ * This gives the connect a chance to negotiate with the other side
+ * (see 'man tcp')
+ */
+ if ( getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) < 0 )
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ TRC(fprintf( stderr, "Current Size of TCP Receive Buffer= %d\n",
+ recbuflen ));
+ recbuflen *= 10; /* lets be optimistic */
+ if ( setsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, rbufsize ) < 0 )
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ if ( getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) )
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ TRC(fprintf( stderr, "New Size of TCP Receive Buffer = %d\n",
+ recbuflen ));
+#endif
+ r = connect(h->iofile, (struct sockaddr *) add, sizeof(*add));
+ if (r < 0)
+ {
+#ifdef WIN32
+ if (WSAGetLastError() == WSAEWOULDBLOCK)
+ {
+ h->event = CS_CONNECT;
+ h->state = CS_ST_CONNECTING;
+ h->io_pending = CS_WANT_WRITE;
+ return 1;
+ }
+#else
+ if (yaz_errno() == EINPROGRESS)
+ {
+ h->event = CS_CONNECT;
+ h->state = CS_ST_CONNECTING;
+ h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
+ return 1;
+ }
+#endif
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ h->event = CS_CONNECT;
+ h->state = CS_ST_CONNECTING;
+
+ return tcpip_rcvconnect (h);
+}
+
+/*
+ * nop
+ */
+int tcpip_rcvconnect(COMSTACK h)
+{
+#if HAVE_OPENSSL_SSL_H
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+#endif
+ TRC(fprintf(stderr, "tcpip_rcvconnect\n"));
+
+ if (h->state == CS_ST_DATAXFER)
+ return 0;
+ if (h->state != CS_ST_CONNECTING)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+#if HAVE_OPENSSL_SSL_H
+ if (sp->ctx)
+ {
+ int res;
+
+ if (!sp->ssl)
+ {
+ sp->ssl = SSL_new (sp->ctx);
+ SSL_set_fd (sp->ssl, h->iofile);
+ }
+ res = SSL_connect (sp->ssl);
+ if (res <= 0)
+ {
+ int err = SSL_get_error(sp->ssl, res);
+ if (err == SSL_ERROR_WANT_READ)
+ {
+ h->io_pending = CS_WANT_READ;
+ return 1;
+ }
+ if (err == SSL_ERROR_WANT_WRITE)
+ {
+ h->io_pending = CS_WANT_WRITE;
+ return 1;
+ }
+ h->cerrno = CSERRORSSL;
+ return -1;
+ }
+ }
+#endif
+ h->event = CS_DATA;
+ h->state = CS_ST_DATAXFER;
+ return 0;
+}
+
+#define CERTF "ztest.pem"
+#define KEYF "ztest.pem"
+
+static void tcpip_setsockopt (int fd)
+{
+#if 0
+ int len = 4096;
+ int set = 1;
+
+ if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt TCP_NODELAY");
+ }
+ if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt SNDBUF");
+ }
+ if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
+ {
+ yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt RCVBUF");
+ }
+#endif
+}
+
+static int tcpip_bind(COMSTACK h, void *address, int mode)
+{
+ struct sockaddr *addr = (struct sockaddr *)address;
+#ifdef WIN32
+ BOOL one = 1;
+#else
+ unsigned long one = 1;
+#endif
+
+#if HAVE_OPENSSL_SSL_H
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ if (sp->ctx)
+ {
+ if (sp->ctx_alloc)
+ {
+ int res;
+ res = SSL_CTX_use_certificate_file (sp->ctx, CERTF,
+ SSL_FILETYPE_PEM);
+ if (res <= 0)
+ {
+ ERR_print_errors_fp(stderr);
+ exit (2);
+ }
+ res = SSL_CTX_use_PrivateKey_file (sp->ctx, KEYF,
+ SSL_FILETYPE_PEM);
+ if (res <= 0)
+ {
+ ERR_print_errors_fp(stderr);
+ exit (3);
+ }
+ res = SSL_CTX_check_private_key (sp->ctx);
+ if (res <= 0)
+ {
+ ERR_print_errors_fp(stderr);
+ exit(5);
+ }
+ }
+ TRC (fprintf (stderr, "ssl_bind\n"));
+ }
+ else
+ {
+ TRC (fprintf (stderr, "tcpip_bind\n"));
+ }
+#else
+ TRC (fprintf (stderr, "tcpip_bind\n"));
+#endif
+#ifndef WIN32
+ if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, (char*)
+ &one, sizeof(one)) < 0)
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+#endif
+ tcpip_setsockopt(h->iofile);
+ if (bind(h->iofile, addr, sizeof(struct sockaddr_in)))
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ h->state = CS_ST_IDLE;
+ h->event = CS_LISTEN;
+ return 0;
+}
+
+int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
+ int (*check_ip)(void *cd, const char *a, int len, int t),
+ void *cd)
+{
+ struct sockaddr_in addr;
+ YAZ_SOCKLEN_T len = sizeof(addr);
+
+ TRC(fprintf(stderr, "tcpip_listen pid=%d\n", getpid()));
+ if (h->state != CS_ST_IDLE)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+ h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len);
+ if (h->newfd < 0)
+ {
+ if (
+#ifdef WIN32
+ WSAGetLastError() == WSAEWOULDBLOCK
+#else
+ yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+#endif
+ )
+ h->cerrno = CSNODATA;
+ else
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_in))
+ memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_in));
+ else if (addrlen)
+ *addrlen = 0;
+ if (check_ip && (*check_ip)(cd, (const char *) &addr,
+ sizeof(addr), AF_INET))
+ {
+ h->cerrno = CSDENY;
+#ifdef WIN32
+ closesocket(h->newfd);
+#else
+ close(h->newfd);
+#endif
+ h->newfd = -1;
+ return -1;
+ }
+ h->state = CS_ST_INCON;
+ tcpip_setsockopt (h->newfd);
+ return 0;
+}
+
+COMSTACK tcpip_accept(COMSTACK h)
+{
+ COMSTACK cnew;
+ tcpip_state *state, *st = (tcpip_state *)h->cprivate;
+#ifdef WIN32
+ unsigned long tru = 1;
+#endif
+
+ TRC(fprintf(stderr, "tcpip_accept\n"));
+ if (h->state == CS_ST_INCON)
+ {
+ if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew))))
+ {
+ h->cerrno = CSYSERR;
+#ifdef WIN32
+ closesocket(h->newfd);
+#else
+ close(h->newfd);
+#endif
+ h->newfd = -1;
+ return 0;
+ }
+ memcpy(cnew, h, sizeof(*h));
+ cnew->iofile = h->newfd;
+ cnew->io_pending = 0;
+ if (!(state = (tcpip_state *)
+ (cnew->cprivate = xmalloc(sizeof(tcpip_state)))))
+ {
+ h->cerrno = CSYSERR;
+ if (h->newfd != -1)
+ {
+#ifdef WIN32
+ closesocket(h->newfd);
+#else
+ close(h->newfd);
+#endif
+ h->newfd = -1;
+ }
+ return 0;
+ }
+ if (!(cnew->blocking&1) &&
+#ifdef WIN32
+ (ioctlsocket(cnew->iofile, FIONBIO, &tru) < 0)
+#else
+ (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
+#endif
+ )
+ {
+ h->cerrno = CSYSERR;
+ if (h->newfd != -1)
+ {
+#ifdef WIN32
+ closesocket(h->newfd);
+#else
+ close(h->newfd);
+#endif
+ h->newfd = -1;
+ }
+ xfree (cnew);
+ xfree (state);
+ return 0;
+ }
+ h->newfd = -1;
+ state->altbuf = 0;
+ state->altsize = state->altlen = 0;
+ state->towrite = state->written = -1;
+ state->complete = st->complete;
+ cnew->state = CS_ST_ACCEPT;
+ h->state = CS_ST_IDLE;
+
+#if HAVE_OPENSSL_SSL_H
+ state->ctx = st->ctx;
+ state->ctx_alloc = 0;
+ state->ssl = st->ssl;
+ if (state->ctx)
+ {
+ state->ssl = SSL_new (state->ctx);
+ SSL_set_fd (state->ssl, cnew->iofile);
+ }
+#endif
+ h = cnew;
+ }
+ if (h->state == CS_ST_ACCEPT)
+ {
+#if HAVE_OPENSSL_SSL_H
+ tcpip_state *state = (tcpip_state *)h->cprivate;
+ if (state->ctx)
+ {
+ int res = SSL_accept (state->ssl);
+ TRC(fprintf(stderr, "SSL_accept\n"));
+ if (res <= 0)
+ {
+ int err = SSL_get_error(state->ssl, res);
+ if (err == SSL_ERROR_WANT_READ)
+ {
+ h->io_pending = CS_WANT_READ;
+ return h;
+ }
+ if (err == SSL_ERROR_WANT_WRITE)
+ {
+ h->io_pending = CS_WANT_WRITE;
+ return h;
+ }
+ cs_close (h);
+ return 0;
+ }
+ }
+#endif
+ }
+ else
+ {
+ h->cerrno = CSOUTSTATE;
+ return 0;
+ }
+ h->io_pending = 0;
+ h->state = CS_ST_DATAXFER;
+ h->event = CS_DATA;
+ return h;
+}
+
+#define CS_TCPIP_BUFCHUNK 4096
+
+/*
+ * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
+ * 0=connection closed.
+ */
+int tcpip_get(COMSTACK h, char **buf, int *bufsize)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ char *tmpc;
+ int tmpi, berlen, rest, req, tomove;
+ int hasread = 0, res;
+
+ TRC(fprintf(stderr, "tcpip_get: bufsize=%d\n", *bufsize));
+ if (sp->altlen) /* switch buffers */
+ {
+ TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
+ (unsigned) sp->altbuf));
+ tmpc = *buf;
+ tmpi = *bufsize;
+ *buf = sp->altbuf;
+ *bufsize = sp->altsize;
+ hasread = sp->altlen;
+ sp->altlen = 0;
+ sp->altbuf = tmpc;
+ sp->altsize = tmpi;
+ }
+ h->io_pending = 0;
+ while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
+ {
+ if (!*bufsize)
+ {
+ if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
+ return -1;
+ }
+ else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
+ if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+ return -1;
+#ifdef __sun__
+ yaz_set_errno( 0 );
+ /* unfortunatly, sun sometimes forgets to set errno in recv
+ when EWOULDBLOCK etc. would be required (res = -1) */
+#endif
+ res = recv(h->iofile, *buf + hasread, CS_TCPIP_BUFCHUNK, 0);
+ TRC(fprintf(stderr, " recv res=%d, hasread=%d\n", res, hasread));
+ if (res < 0)
+ {
+ TRC(fprintf(stderr, " recv errno=%d, (%s)\n", yaz_errno(),
+ strerror(yaz_errno())));
+#ifdef WIN32
+ if (WSAGetLastError() == WSAEWOULDBLOCK)
+ {
+ h->io_pending = CS_WANT_READ;
+ break;
+ }
+ else
+ return -1;
+#else
+ if (yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+ || yaz_errno() == EINPROGRESS
+#ifdef __sun__
+ || yaz_errno() == ENOENT /* Sun's sometimes set errno to this */
+#endif
+ )
+ {
+ h->io_pending = CS_WANT_READ;
+ break;
+ }
+ else if (yaz_errno() == 0)
+ continue;
+ else
+ return -1;
+#endif
+ }
+ else if (!res)
+ return 0;
+ hasread += res;
+ }
+ TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
+ hasread, berlen));
+ /* move surplus buffer (or everything if we didn't get a BER rec.) */
+ if (hasread > berlen)
+ {
+ tomove = req = hasread - berlen;
+ rest = tomove % CS_TCPIP_BUFCHUNK;
+ if (rest)
+ req += CS_TCPIP_BUFCHUNK - rest;
+ if (!sp->altbuf)
+ {
+ if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
+ return -1;
+ } else if (sp->altsize < req)
+ if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
+ return -1;
+ TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
+ (unsigned) sp->altbuf));
+ memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
+ }
+ if (berlen < CS_TCPIP_BUFCHUNK - 1)
+ *(*buf + berlen) = '\0';
+ return berlen ? berlen : 1;
+}
+
+
+#if HAVE_OPENSSL_SSL_H
+/*
+ * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
+ * 0=connection closed.
+ */
+int ssl_get(COMSTACK h, char **buf, int *bufsize)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ char *tmpc;
+ int tmpi, berlen, rest, req, tomove;
+ int hasread = 0, res;
+
+ TRC(fprintf(stderr, "ssl_get: bufsize=%d\n", *bufsize));
+ if (sp->altlen) /* switch buffers */
+ {
+ TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
+ (unsigned) sp->altbuf));
+ tmpc = *buf;
+ tmpi = *bufsize;
+ *buf = sp->altbuf;
+ *bufsize = sp->altsize;
+ hasread = sp->altlen;
+ sp->altlen = 0;
+ sp->altbuf = tmpc;
+ sp->altsize = tmpi;
+ }
+ h->io_pending = 0;
+ while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
+ {
+ if (!*bufsize)
+ {
+ if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
+ return -1;
+ }
+ else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
+ if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+ return -1;
+ res = SSL_read (sp->ssl, *buf + hasread, CS_TCPIP_BUFCHUNK);
+ TRC(fprintf(stderr, " SSL_read res=%d, hasread=%d\n", res, hasread));
+ if (res <= 0)
+ {
+ int ssl_err = SSL_get_error(sp->ssl, res);
+ if (ssl_err == SSL_ERROR_WANT_READ)
+ {
+ h->io_pending = CS_WANT_READ;
+ break;
+ }
+ if (ssl_err == SSL_ERROR_WANT_WRITE)
+ {
+ h->io_pending = CS_WANT_WRITE;
+ break;
+ }
+ if (res == 0)
+ return 0;
+ h->cerrno = CSERRORSSL;
+ return -1;
+ }
+ hasread += res;
+ }
+ TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
+ hasread, berlen));
+ /* move surplus buffer (or everything if we didn't get a BER rec.) */
+ if (hasread > berlen)
+ {
+ tomove = req = hasread - berlen;
+ rest = tomove % CS_TCPIP_BUFCHUNK;
+ if (rest)
+ req += CS_TCPIP_BUFCHUNK - rest;
+ if (!sp->altbuf)
+ {
+ if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
+ return -1;
+ } else if (sp->altsize < req)
+ if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
+ return -1;
+ TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
+ (unsigned) sp->altbuf));
+ memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
+ }
+ if (berlen < CS_TCPIP_BUFCHUNK - 1)
+ *(*buf + berlen) = '\0';
+ return berlen ? berlen : 1;
+}
+#endif
+
+/*
+ * Returns 1, 0 or -1
+ * In nonblocking mode, you must call again with same buffer while
+ * return value is 1.
+ */
+int tcpip_put(COMSTACK h, char *buf, int size)
+{
+ int res;
+ struct tcpip_state *state = (struct tcpip_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "tcpip_put: size=%d\n", size));
+ h->io_pending = 0;
+ h->event = CS_DATA;
+ if (state->towrite < 0)
+ {
+ state->towrite = size;
+ state->written = 0;
+ }
+ else if (state->towrite != size)
+ {
+ h->cerrno = CSWRONGBUF;
+ return -1;
+ }
+ while (state->towrite > state->written)
+ {
+ if ((res =
+ send(h->iofile, buf + state->written, size -
+ state->written,
+#ifdef MSG_NOSIGNAL
+ MSG_NOSIGNAL
+#else
+ 0
+#endif
+ )) < 0)
+ {
+ if (
+#ifdef WIN32
+ WSAGetLastError() == WSAEWOULDBLOCK
+#else
+ yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+#ifdef __sun__
+ || yaz_errno() == ENOENT /* Sun's sometimes set errno to this value! */
+#endif
+ || yaz_errno() == EINPROGRESS
+#endif
+ )
+ {
+ TRC(fprintf(stderr, " Flow control stop\n"));
+ h->io_pending = CS_WANT_WRITE;
+ return 1;
+ }
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ state->written += res;
+ TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
+ res, state->written, size));
+ }
+ state->towrite = state->written = -1;
+ TRC(fprintf(stderr, " Ok\n"));
+ return 0;
+}
+
+
+#if HAVE_OPENSSL_SSL_H
+/*
+ * Returns 1, 0 or -1
+ * In nonblocking mode, you must call again with same buffer while
+ * return value is 1.
+ */
+int ssl_put(COMSTACK h, char *buf, int size)
+{
+ int res;
+ struct tcpip_state *state = (struct tcpip_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "ssl_put: size=%d\n", size));
+ h->io_pending = 0;
+ h->event = CS_DATA;
+ if (state->towrite < 0)
+ {
+ state->towrite = size;
+ state->written = 0;
+ }
+ else if (state->towrite != size)
+ {
+ h->cerrno = CSWRONGBUF;
+ return -1;
+ }
+ while (state->towrite > state->written)
+ {
+ res = SSL_write (state->ssl, buf + state->written,
+ size - state->written);
+ if (res <= 0)
+ {
+ int ssl_err = SSL_get_error(state->ssl, res);
+ if (ssl_err == SSL_ERROR_WANT_READ)
+ {
+ h->io_pending = CS_WANT_READ;
+ return 1;
+ }
+ if (ssl_err == SSL_ERROR_WANT_WRITE)
+ {
+ h->io_pending = CS_WANT_WRITE;
+ return 1;
+ }
+ h->cerrno = CSERRORSSL;
+ return -1;
+ }
+ state->written += res;
+ TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
+ res, state->written, size));
+ }
+ state->towrite = state->written = -1;
+ TRC(fprintf(stderr, " Ok\n"));
+ return 0;
+}
+#endif
+
+int tcpip_close(COMSTACK h)
+{
+ tcpip_state *sp = (struct tcpip_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "tcpip_close\n"));
+ if (h->iofile != -1)
+ {
+#if HAVE_OPENSSL_SSL_H
+ if (sp->ssl)
+ {
+ SSL_shutdown (sp->ssl);
+ }
+#endif
+#ifdef WIN32
+ closesocket(h->iofile);
+#else
+ close(h->iofile);
+#endif
+ }
+ if (sp->altbuf)
+ xfree(sp->altbuf);
+#if HAVE_OPENSSL_SSL_H
+ if (sp->ssl)
+ {
+ TRC (fprintf(stderr, "SSL_free\n"));
+ SSL_free (sp->ssl);
+ }
+ sp->ssl = 0;
+ if (sp->ctx_alloc)
+ SSL_CTX_free (sp->ctx_alloc);
+#endif
+ xfree(sp);
+ xfree(h);
+ return 0;
+}
+
+char *tcpip_addrstr(COMSTACK h)
+{
+ struct sockaddr_in addr;
+ tcpip_state *sp = (struct tcpip_state *)h->cprivate;
+ char *r = 0, *buf = sp->buf;
+ YAZ_SOCKLEN_T len;
+ struct hostent *host;
+
+ len = sizeof(addr);
+ if (getpeername(h->iofile, (struct sockaddr*) &addr, &len) < 0)
+ {
+ h->cerrno = CSYSERR;
+ return 0;
+ }
+ if (!(h->blocking&2)) {
+ if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
+ AF_INET)))
+ r = (char*) host->h_name;
+ }
+ if (!r)
+ r = inet_ntoa(addr.sin_addr);
+ if (h->protocol == PROTO_HTTP)
+ sprintf(buf, "http:%s", r);
+ else
+ sprintf(buf, "tcp:%s", r);
+#if HAVE_OPENSSL_SSL_H
+ if (sp->ctx)
+ {
+ if (h->protocol == PROTO_HTTP)
+ sprintf(buf, "https:%s", r);
+ else
+ sprintf(buf, "ssl:%s", r);
+ }
+#endif
+ return buf;
+}
+
+int static tcpip_set_blocking(COMSTACK p, int blocking)
+{
+ unsigned long flag;
+
+ if (p->blocking == blocking)
+ return 1;
+#ifdef WIN32
+ flag = 1;
+ if (ioctlsocket(p->iofile, FIONBIO, &flag) < 0)
+ return 0;
+#else
+ flag = fcntl(p->iofile, F_GETFL, 0);
+ if(!(blocking&1))
+ flag = flag & ~O_NONBLOCK;
+ else
+ flag = flag | O_NONBLOCK;
+ if (fcntl(p->iofile, F_SETFL, flag) < 0)
+ return 0;
+#endif
+ p->blocking = blocking;
+ return 1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: tpath.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <yaz/tpath.h>
+#include <yaz/log.h>
+
+FILE *yaz_path_fopen(const char *path, const char *name, const char *mode)
+{
+ return yaz_fopen (path, name, mode, 0);
+}
+
+int yaz_fclose (FILE *f)
+{
+ return fclose (f);
+}
+
+FILE *yaz_fopen(const char *path, const char *name, const char *mode,
+ const char *base)
+{
+ char spath[1024];
+
+ for(;;)
+ {
+ FILE *f;
+
+ const char *path_sep = 0;
+ size_t len = 0;
+ size_t slen = 0;
+
+ *spath = '\0';
+ if (path)
+ {
+ /* somewhat dirty since we have to consider Windows
+ * drive letters..
+ */
+ if (strchr ("/\\.", *path))
+ {
+ path_sep = strchr (path+1, ':');
+ }
+ else if (path[0] && path[1])
+ path_sep = strchr (path+2, ':');
+ if (path_sep)
+ len = path_sep - path;
+ else
+ len = strlen(path);
+ if (!strchr ("/\\", *path) && base)
+ {
+ strcpy (spath, base);
+ slen = strlen(spath);
+ spath[slen++] = '/';
+ }
+ memcpy (spath+slen, path, len);
+ slen += len;
+ if (!strchr("/\\", spath[slen-1]))
+ spath[slen++] = '/';
+ }
+ strcpy (spath+slen, name);
+ if ((f = fopen(spath, mode)))
+ return f;
+
+ if (!path_sep)
+ break;
+ path = path_sep+1;
+ }
+ return 0;
+}
+
+int yaz_is_abspath (const char *p)
+{
+ if (*p == '/')
+ return 1;
+#ifdef WIN32
+ if (*p == '\\')
+ return 1;
+ if (*p && p[1] == ':' && isalpha(*p))
+ return 1;
+#endif
+ return 0;
+}
--- /dev/null
+ResourceReport-Format-Universe-1
+{Z39-50-resourceReport universe-1 (1000)} DEFINITIONS ::=
+BEGIN
+IMPORTS StringOrNumeric FROM Z39-50-APDU-1995;
+--
+
+UniverseReportHits ::= SEQUENCE {
+ database StringOrNumeric,
+ hits StringOrNumeric
+}
+
+UniverseReportDuplicate ::= SEQUENCE {
+ hitno StringOrNumeric
+}
+
+UniverseReport ::= SEQUENCE {
+ totalHits INTEGER,
+ report CHOICE {
+ databaseHits [0] IMPLICIT UniverseReportHits,
+ duplicate [1] IMPLICIT UniverseReportDuplicate
+ }
+}
+END
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: unix.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ * UNIX socket COMSTACK. By Morten Bøgeskov.
+ */
+#ifndef WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+
+#include <yaz/comstack.h>
+#include <yaz/unix.h>
+#include <yaz/log.h>
+#include <yaz/nmem.h>
+
+#ifndef YAZ_SOCKLEN_T
+#define YAZ_SOCKLEN_T int
+#endif
+
+static int unix_close(COMSTACK h);
+static int unix_put(COMSTACK h, char *buf, int size);
+static int unix_get(COMSTACK h, char **buf, int *bufsize);
+static int unix_connect(COMSTACK h, void *address);
+static int unix_more(COMSTACK h);
+static int unix_rcvconnect(COMSTACK h);
+static int unix_bind(COMSTACK h, void *address, int mode);
+static int unix_listen(COMSTACK h, char *raddr, int *addrlen,
+ int (*check_ip)(void *cd, const char *a, int len, int type),
+ void *cd);
+static int unix_set_blocking(COMSTACK p, int blocking);
+
+static COMSTACK unix_accept(COMSTACK h);
+static char *unix_addrstr(COMSTACK h);
+static void *unix_straddr(COMSTACK h, const char *str);
+
+#ifndef SUN_LEN
+#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+ + strlen ((ptr)->sun_path))
+#endif
+#if 0
+#define TRC(x) x
+#else
+#define TRC(X)
+#endif
+
+/* this state is used for both SSL and straight TCP/IP */
+typedef struct unix_state
+{
+ char *altbuf; /* alternate buffer for surplus data */
+ int altsize; /* size as xmalloced */
+ int altlen; /* length of data or 0 if none */
+
+ int written; /* -1 if we aren't writing */
+ int towrite; /* to verify against user input */
+ int (*complete)(const unsigned char *buf, int len); /* length/comple. */
+ struct sockaddr_un addr; /* returned by cs_straddr */
+ char buf[128]; /* returned by cs_addrstr */
+} unix_state;
+
+static int unix_init (void)
+{
+ return 1;
+}
+
+/*
+ * This function is always called through the cs_create() macro.
+ * s >= 0: socket has already been established for us.
+ */
+COMSTACK unix_type(int s, int blocking, int protocol, void *vp)
+{
+ COMSTACK p;
+ unix_state *state;
+ int new_socket;
+
+ if (!unix_init ())
+ return 0;
+ if (s < 0)
+ {
+ if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ return 0;
+ new_socket = 1;
+ }
+ else
+ new_socket = 0;
+ if (!(p = (struct comstack *)xmalloc(sizeof(struct comstack))))
+ return 0;
+ if (!(state = (struct unix_state *)(p->cprivate =
+ xmalloc(sizeof(unix_state)))))
+ return 0;
+
+ if (!((p->blocking = blocking)&1))
+ {
+ if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
+ return 0;
+#ifndef MSG_NOSIGNAL
+ signal (SIGPIPE, SIG_IGN);
+#endif
+ }
+
+ p->io_pending = 0;
+ p->iofile = s;
+ p->type = unix_type;
+ p->protocol = (enum oid_proto) protocol;
+
+ p->f_connect = unix_connect;
+ p->f_rcvconnect = unix_rcvconnect;
+ p->f_get = unix_get;
+ p->f_put = unix_put;
+ p->f_close = unix_close;
+ p->f_more = unix_more;
+ p->f_bind = unix_bind;
+ p->f_listen = unix_listen;
+ p->f_accept = unix_accept;
+ p->f_addrstr = unix_addrstr;
+ p->f_straddr = unix_straddr;
+ p->f_set_blocking = unix_set_blocking;
+
+ p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
+ p->event = CS_NONE;
+ p->cerrno = 0;
+ p->stackerr = 0;
+
+ state->altbuf = 0;
+ state->altsize = state->altlen = 0;
+ state->towrite = state->written = -1;
+ if (protocol == PROTO_WAIS)
+ state->complete = completeWAIS;
+ else
+ state->complete = cs_complete_auto;
+
+ p->timeout = COMSTACK_DEFAULT_TIMEOUT;
+ TRC(fprintf(stderr, "Created new UNIX comstack\n"));
+
+ return p;
+}
+
+
+static int unix_strtoaddr_ex(const char *str, struct sockaddr_un *add)
+{
+ char *cp;
+ if (!unix_init ())
+ return 0;
+ TRC(fprintf(stderr, "unix_strtoaddress: %s\n", str ? str : "NULL"));
+ add->sun_family = AF_UNIX;
+ strncpy(add->sun_path, str, sizeof(add->sun_path));
+ cp = strchr (add->sun_path, ':');
+ if (cp)
+ *cp = '\0';
+ return 1;
+}
+
+static void *unix_straddr(COMSTACK h, const char *str)
+{
+ unix_state *sp = (unix_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "unix_straddr: %s\n", str ? str : "NULL"));
+
+ if (!unix_strtoaddr_ex (str, &sp->addr))
+ return 0;
+ return &sp->addr;
+}
+
+struct sockaddr_un *unix_strtoaddr(const char *str)
+{
+ static struct sockaddr_un add;
+
+ TRC(fprintf(stderr, "unix_strtoaddr: %s\n", str ? str : "NULL"));
+
+ if (!unix_strtoaddr_ex (str, &add))
+ return 0;
+ return &add;
+}
+
+static int unix_more(COMSTACK h)
+{
+ unix_state *sp = (unix_state *)h->cprivate;
+
+ return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
+ sp->altlen);
+}
+
+/*
+ * connect(2) will block (sometimes) - nothing we can do short of doing
+ * weird things like spawning subprocesses or threading or some weird junk
+ * like that.
+ */
+static int unix_connect(COMSTACK h, void *address)
+{
+ struct sockaddr_un *add = (struct sockaddr_un *)address;
+ int r;
+
+ TRC(fprintf(stderr, "unix_connect\n"));
+ h->io_pending = 0;
+ if (h->state != CS_ST_UNBND)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+ r = connect(h->iofile, (struct sockaddr *) add, SUN_LEN(add));
+ if (r < 0)
+ {
+ if (yaz_errno() == EINPROGRESS)
+ {
+ h->event = CS_CONNECT;
+ h->state = CS_ST_CONNECTING;
+ h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
+ return 1;
+ }
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ h->event = CS_CONNECT;
+ h->state = CS_ST_CONNECTING;
+
+ return unix_rcvconnect (h);
+}
+
+/*
+ * nop
+ */
+static int unix_rcvconnect(COMSTACK h)
+{
+ TRC(fprintf(stderr, "unix_rcvconnect\n"));
+
+ if (h->state == CS_ST_DATAXFER)
+ return 0;
+ if (h->state != CS_ST_CONNECTING)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+ h->event = CS_DATA;
+ h->state = CS_ST_DATAXFER;
+ return 0;
+}
+
+#define CERTF "ztest.pem"
+#define KEYF "ztest.pem"
+
+static int unix_bind(COMSTACK h, void *address, int mode)
+{
+ struct sockaddr *addr = (struct sockaddr *)address;
+ const char * path = ((struct sockaddr_un *)addr)->sun_path;
+ struct stat stat_buf;
+
+ TRC (fprintf (stderr, "unix_bind\n"));
+
+ if(stat(path, &stat_buf) != -1) {
+ struct sockaddr_un socket_unix;
+ int socket_out = -1;
+ if(! S_ISSOCK(stat_buf.st_mode)) {
+ h->cerrno = CSYSERR;
+ yaz_set_errno(EEXIST); /* Not a socket (File exists) */
+ return -1;
+ }
+ if((socket_out = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ socket_unix.sun_family = AF_UNIX;
+ strncpy(socket_unix.sun_path, path, sizeof(socket_unix.sun_path));
+ if(connect(socket_out, (struct sockaddr *) &socket_unix, SUN_LEN(&socket_unix)) < 0) {
+ if(yaz_errno() == ECONNREFUSED) {
+ TRC (fprintf (stderr, "Socket exists but nobody is listening\n"));
+ } else {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ } else {
+ close(socket_out);
+ h->cerrno = CSYSERR;
+ yaz_set_errno(EADDRINUSE);
+ return -1;
+ }
+ unlink(path);
+ }
+
+ if (bind(h->iofile, (struct sockaddr *) addr, SUN_LEN((struct sockaddr_un *)addr)))
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ chmod(path, 0777);
+ if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
+ {
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ h->state = CS_ST_IDLE;
+ h->event = CS_LISTEN;
+ return 0;
+}
+
+static int unix_listen(COMSTACK h, char *raddr, int *addrlen,
+ int (*check_ip)(void *cd, const char *a, int len, int t),
+ void *cd)
+{
+ struct sockaddr_un addr;
+ YAZ_SOCKLEN_T len = sizeof(addr);
+
+ TRC(fprintf(stderr, "unix_listen pid=%d\n", getpid()));
+ if (h->state != CS_ST_IDLE)
+ {
+ h->cerrno = CSOUTSTATE;
+ return -1;
+ }
+ h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len);
+ if (h->newfd < 0)
+ {
+ if (
+ yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+ )
+ h->cerrno = CSNODATA;
+ else
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_un))
+ memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_un));
+ else if (addrlen)
+ *addrlen = 0;
+ h->state = CS_ST_INCON;
+ return 0;
+}
+
+static COMSTACK unix_accept(COMSTACK h)
+{
+ COMSTACK cnew;
+ unix_state *state, *st = (unix_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "unix_accept\n"));
+ if (h->state == CS_ST_INCON)
+ {
+ if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew))))
+ {
+ h->cerrno = CSYSERR;
+ close(h->newfd);
+ h->newfd = -1;
+ return 0;
+ }
+ memcpy(cnew, h, sizeof(*h));
+ cnew->iofile = h->newfd;
+ cnew->io_pending = 0;
+ if (!(state = (unix_state *)
+ (cnew->cprivate = xmalloc(sizeof(unix_state)))))
+ {
+ h->cerrno = CSYSERR;
+ if (h->newfd != -1)
+ {
+ close(h->newfd);
+ h->newfd = -1;
+ }
+ return 0;
+ }
+ if (!(cnew->blocking&1) &&
+ (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
+ )
+ {
+ h->cerrno = CSYSERR;
+ if (h->newfd != -1)
+ {
+ close(h->newfd);
+ h->newfd = -1;
+ }
+ xfree (cnew);
+ xfree (state);
+ return 0;
+ }
+ h->newfd = -1;
+ state->altbuf = 0;
+ state->altsize = state->altlen = 0;
+ state->towrite = state->written = -1;
+ state->complete = st->complete;
+ memcpy(&state->addr, &st->addr, sizeof(state->addr));
+ cnew->state = CS_ST_ACCEPT;
+ cnew->event = CS_NONE;
+ h->state = CS_ST_IDLE;
+
+ h = cnew;
+ }
+ if (h->state == CS_ST_ACCEPT)
+ {
+ }
+ else
+ {
+ h->cerrno = CSOUTSTATE;
+ return 0;
+ }
+ h->io_pending = 0;
+ h->state = CS_ST_DATAXFER;
+ h->event = CS_DATA;
+ return h;
+}
+
+#define CS_UNIX_BUFCHUNK 4096
+
+/*
+ * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
+ * 0=connection closed.
+ */
+static int unix_get(COMSTACK h, char **buf, int *bufsize)
+{
+ unix_state *sp = (unix_state *)h->cprivate;
+ char *tmpc;
+ int tmpi, berlen, rest, req, tomove;
+ int hasread = 0, res;
+
+ TRC(fprintf(stderr, "unix_get: bufsize=%d\n", *bufsize));
+ if (sp->altlen) /* switch buffers */
+ {
+ TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen,
+ (unsigned) sp->altbuf));
+ tmpc = *buf;
+ tmpi = *bufsize;
+ *buf = sp->altbuf;
+ *bufsize = sp->altsize;
+ hasread = sp->altlen;
+ sp->altlen = 0;
+ sp->altbuf = tmpc;
+ sp->altsize = tmpi;
+ }
+ h->io_pending = 0;
+ while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
+ {
+ if (!*bufsize)
+ {
+ if (!(*buf = (char *)xmalloc(*bufsize = CS_UNIX_BUFCHUNK)))
+ return -1;
+ }
+ else if (*bufsize - hasread < CS_UNIX_BUFCHUNK)
+ if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+ return -1;
+ res = recv(h->iofile, *buf + hasread, CS_UNIX_BUFCHUNK, 0);
+ TRC(fprintf(stderr, " recv res=%d, hasread=%d\n", res, hasread));
+ if (res < 0)
+ {
+ if (yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+ || yaz_errno() == EINPROGRESS
+ )
+ {
+ h->io_pending = CS_WANT_READ;
+ break;
+ }
+ else if (yaz_errno() == 0)
+ continue;
+ else
+ return -1;
+ }
+ else if (!res)
+ return 0;
+ hasread += res;
+ }
+ TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
+ hasread, berlen));
+ /* move surplus buffer (or everything if we didn't get a BER rec.) */
+ if (hasread > berlen)
+ {
+ tomove = req = hasread - berlen;
+ rest = tomove % CS_UNIX_BUFCHUNK;
+ if (rest)
+ req += CS_UNIX_BUFCHUNK - rest;
+ if (!sp->altbuf)
+ {
+ if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
+ return -1;
+ } else if (sp->altsize < req)
+ if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
+ return -1;
+ TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove,
+ (unsigned) sp->altbuf));
+ memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
+ }
+ if (berlen < CS_UNIX_BUFCHUNK - 1)
+ *(*buf + berlen) = '\0';
+ return berlen ? berlen : 1;
+}
+
+
+
+/*
+ * Returns 1, 0 or -1
+ * In nonblocking mode, you must call again with same buffer while
+ * return value is 1.
+ */
+static int unix_put(COMSTACK h, char *buf, int size)
+{
+ int res;
+ struct unix_state *state = (struct unix_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "unix_put: size=%d\n", size));
+ h->io_pending = 0;
+ h->event = CS_DATA;
+ if (state->towrite < 0)
+ {
+ state->towrite = size;
+ state->written = 0;
+ }
+ else if (state->towrite != size)
+ {
+ h->cerrno = CSWRONGBUF;
+ return -1;
+ }
+ while (state->towrite > state->written)
+ {
+ if ((res =
+ send(h->iofile, buf + state->written, size -
+ state->written,
+#ifdef MSG_NOSIGNAL
+ MSG_NOSIGNAL
+#else
+ 0
+#endif
+ )) < 0)
+ {
+ if (
+ yaz_errno() == EWOULDBLOCK
+#ifdef EAGAIN
+#if EAGAIN != EWOULDBLOCK
+ || yaz_errno() == EAGAIN
+#endif
+#endif
+ )
+ {
+ TRC(fprintf(stderr, " Flow control stop\n"));
+ h->io_pending = CS_WANT_WRITE;
+ return 1;
+ }
+ h->cerrno = CSYSERR;
+ return -1;
+ }
+ state->written += res;
+ TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",
+ res, state->written, size));
+ }
+ state->towrite = state->written = -1;
+ TRC(fprintf(stderr, " Ok\n"));
+ return 0;
+}
+
+static int unix_close(COMSTACK h)
+{
+ unix_state *sp = (struct unix_state *)h->cprivate;
+
+ TRC(fprintf(stderr, "unix_close\n"));
+ if (h->iofile != -1)
+ {
+ close(h->iofile);
+ }
+ if (sp->altbuf)
+ xfree(sp->altbuf);
+ xfree(sp);
+ xfree(h);
+ return 0;
+}
+
+static char *unix_addrstr(COMSTACK h)
+{
+ unix_state *sp = (struct unix_state *)h->cprivate;
+ char *buf = sp->buf;
+ sprintf(buf, "unix:%s", sp->addr.sun_path);
+ return buf;
+}
+
+static int unix_set_blocking(COMSTACK p, int blocking)
+{
+ unsigned long flag;
+
+ if (p->blocking == blocking)
+ return 1;
+ flag = fcntl(p->iofile, F_GETFL, 0);
+ if(!blocking)
+ flag = flag & ~O_NONBLOCK;
+ else
+ flag = flag | O_NONBLOCK;
+ if (fcntl(p->iofile, F_SETFL, flag) < 0)
+ return 0;
+ p->blocking = blocking;
+ return 1;
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: version.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <yaz/yaz-version.h>
+
+unsigned long yaz_version(char *version_str, char *sys_str)
+{
+ if (version_str)
+ strcpy(version_str, YAZ_VERSION);
+ if (sys_str)
+ strcpy(sys_str, "");
+ return YAZ_VERSIONL;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: waislen.c,v $
+ * Revision 1.1 2003-10-27 12:21:36 adam
+ * Source restructure. yaz-marcdump part of installation
+ *
+ * Revision 1.5 1999/11/30 13:47:11 adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.4 1999/01/08 11:23:15 adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.3 1996/02/29 14:23:13 adam
+ * Bug fix.
+ *
+ * Revision 1.2 1996/02/26 18:34:44 adam
+ * Bug fix.
+ *
+ * Revision 1.1 1996/02/20 13:02:58 quinn
+ * Wais length.
+ *
+ *
+ */
+
+#include <stdio.h>
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+/*
+ * Return length of WAIS package or 0
+ */
+int completeWAIS(const unsigned char *buf, int len)
+{
+ int i, lval = 0;
+
+ if (len < 25)
+ return 0;
+ if (*buf != '0')
+ return 0;
+ /* calculate length */
+ for (i = 0; i < 10; i++)
+ lval = lval * 10 + (buf[i] - '0');
+ lval += 25;
+ if (len >= lval)
+ return lval;
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: wrbuf.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+/*
+ * Growing buffer for writing various stuff.
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <yaz/wrbuf.h>
+
+WRBUF wrbuf_alloc(void)
+{
+ WRBUF n;
+
+ if (!(n = (WRBUF)xmalloc(sizeof(*n))))
+ abort();
+ n->buf = 0;
+ n->size = 0;
+ n->pos = 0;
+ return n;
+}
+
+void wrbuf_free(WRBUF b, int free_buf)
+{
+ if (free_buf && b->buf)
+ xfree(b->buf);
+ xfree(b);
+}
+
+void wrbuf_rewind(WRBUF b)
+{
+ b->pos = 0;
+}
+
+int wrbuf_grow(WRBUF b, int minsize)
+{
+ int togrow;
+
+ if (!b->size)
+ togrow = 1024;
+ else
+ togrow = b->size;
+ if (togrow < minsize)
+ togrow = minsize;
+ if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
+ abort();
+ else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
+ abort();
+ return 0;
+}
+
+int wrbuf_write(WRBUF b, const char *buf, int size)
+{
+ if (size <= 0)
+ return 0;
+ if (b->pos + size >= b->size)
+ wrbuf_grow(b, size);
+ memcpy(b->buf + b->pos, buf, size);
+ b->pos += size;
+ return 0;
+}
+
+int wrbuf_puts(WRBUF b, const char *buf)
+{
+ wrbuf_write(b, buf, strlen(buf)+1); /* '\0'-terminate as well */
+ (b->pos)--; /* don't include '\0' in count */
+ return 0;
+}
+
+int wrbuf_xmlputs(WRBUF b, const char *cp)
+{
+ while (*cp)
+ {
+ switch(*cp)
+ {
+ case '<':
+ wrbuf_puts(b, "<");
+ break;
+ case '>':
+ wrbuf_puts(b, ">");
+ break;
+ case '&':
+ wrbuf_puts(b, "&");
+ break;
+ case '"':
+ wrbuf_puts(b, """);
+ break;
+ case '\'':
+ wrbuf_puts(b, "'");
+ break;
+ default:
+ wrbuf_putc(b, *cp);
+ }
+ cp++;
+ }
+ wrbuf_putc(b, 0);
+ (b->pos)--;
+ return 0;
+}
+
+void wrbuf_printf(WRBUF b, const char *fmt, ...)
+{
+ va_list ap;
+ char buf[4096];
+
+ va_start(ap, fmt);
+#ifdef WIN32
+ _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+#else
+/* !WIN32 */
+#if HAVE_VSNPRINTF
+ vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+#else
+ vsprintf(buf, fmt, ap);
+#endif
+#endif
+ wrbuf_puts (b, buf);
+
+ va_end(ap);
+}
+
--- /dev/null
+/* $Id: xcqlutil.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <yaz/cql.h>
+
+static void pr_n(const char *buf,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data, int n)
+{
+ int i;
+ for (i = 0; i<n; i++)
+ (*pr)(" ", client_data);
+ (*pr)(buf, client_data);
+}
+
+static void pr_cdata(const char *buf,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data)
+{
+ const char *src = buf;
+ char bf[2];
+ while (*src)
+ {
+ switch(*src)
+ {
+ case '&':
+ (*pr)("&", client_data);
+ break;
+ case '<':
+ (*pr)("<", client_data);
+ break;
+ case '>':
+ (*pr)(">", client_data);
+ break;
+ default:
+ bf[0] = *src;
+ bf[1] = 0;
+ (*pr)(bf, client_data);
+ }
+ src++;
+ }
+}
+
+static void prefixes(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data, int level)
+{
+ if (cn)
+ {
+ pr_n("<prefixes>\n", pr, client_data, level);
+ for (; cn; cn = cn->u.mod.next)
+ {
+ pr_n("<prefix>\n", pr, client_data, level+2);
+ if (cn->u.mod.name)
+ {
+ pr_n("<name>", pr, client_data, level+4);
+ pr_cdata(cn->u.mod.name, pr, client_data);
+ pr_n("</name>\n", pr, client_data, 0);
+ }
+ if (cn->u.mod.value)
+ {
+ pr_n("<identifier>", pr, client_data, level+4);
+ pr_cdata(cn->u.mod.value, pr, client_data);
+ pr_n("</identifier>\n", pr, client_data, 0);
+ }
+ pr_n("</prefix>\n", pr, client_data, level+2);
+ }
+ pr_n("</prefixes>\n", pr, client_data, level);
+ }
+}
+
+static void cql_to_xml_r(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data, int level)
+{
+ if (!cn)
+ return;
+ switch (cn->which)
+ {
+ case CQL_NODE_ST:
+ pr_n("<searchClause>\n", pr, client_data, level);
+ prefixes(cn->u.st.prefixes, pr, client_data, level+2);
+ if (cn->u.st.index)
+ {
+ pr_n("<index>", pr, client_data, level+2);
+ pr_cdata(cn->u.st.index, pr, client_data);
+ pr_n("</index>\n", pr, client_data, 0);
+ }
+ if (cn->u.st.relation)
+ {
+ struct cql_node *m = cn->u.st.modifiers;
+ pr_n("<relation>\n", pr, client_data, level+2);
+ pr_n("<value>", pr, client_data, level+4);
+ pr_cdata(cn->u.st.relation, pr, client_data);
+ pr_n("</value>\n", pr, client_data, 0);
+ if (m)
+ {
+ pr_n("<modifiers>\n", pr, client_data, level+4);
+ for (; m; m = m->u.mod.next)
+ {
+ pr_n("<modifier><value>", pr, client_data, level+6);
+ pr_cdata(m->u.mod.value, pr, client_data);
+ pr_n("</value></modifier>\n", pr, client_data, 0);
+ }
+ pr_n("</modifiers>\n", pr, client_data, level+4);
+ }
+ pr_n("</relation>\n", pr, client_data, level+2);
+ }
+ if (cn->u.st.term)
+ {
+ pr_n("<term>", pr, client_data, level+2);
+ pr_cdata(cn->u.st.term, pr, client_data);
+ pr_n("</term>\n", pr, client_data, 0);
+ }
+ pr_n("</searchClause>\n", pr, client_data, level);
+ break;
+ case CQL_NODE_BOOL:
+ pr_n("<triple>\n", pr, client_data, level);
+ prefixes(cn->u.st.prefixes, pr, client_data, level+2);
+ if (cn->u.boolean.value)
+ {
+ struct cql_node *m = cn->u.boolean.modifiers;
+ pr_n("<boolean>\n", pr, client_data, level+2);
+
+ pr_n("<value>", pr, client_data, level+4);
+ pr_cdata(cn->u.boolean.value, pr, client_data);
+ pr_n("</value>\n", pr, client_data, 0);
+
+ if (m)
+ {
+ pr_n("<modifiers>\n", pr, client_data, level+4);
+ for (; m; m = m->u.mod.next)
+ {
+ pr_n("<modifier><type>", pr, client_data, level+6);
+ pr_cdata(m->u.mod.name, pr, client_data);
+ pr_n("</type>", pr, client_data, 0);
+ if (m->u.mod.value)
+ {
+ pr_n("<value>", pr, client_data, 0);
+ pr_cdata(m->u.mod.value, pr, client_data);
+ pr_n("</value>", pr, client_data, 0);
+ }
+ pr_n("</modifier>\n", pr, client_data, 0);
+ }
+ pr_n("</modifiers>\n", pr, client_data, level+4);
+ }
+ pr_n("</boolean>\n", pr, client_data, level+2);
+ }
+ if (cn->u.boolean.left)
+ {
+ printf ("%*s<leftOperand>\n", level+2, "");
+ cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4);
+ printf ("%*s</leftOperand>\n", level+2, "");
+ }
+ if (cn->u.boolean.right)
+ {
+ printf ("%*s<rightOperand>\n", level+2, "");
+ cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4);
+ printf ("%*s</rightOperand>\n", level+2, "");
+ }
+ pr_n("</triple>\n", pr, client_data, level);
+ }
+}
+
+void cql_to_xml(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data)
+{
+ cql_to_xml_r(cn, pr, client_data, 0);
+}
+
+void cql_to_xml_stdio(struct cql_node *cn, FILE *f)
+{
+ cql_to_xml(cn, cql_fputs, f);
+}
+
+void cql_buf_write_handler (const char *b, void *client_data)
+{
+ struct cql_buf_write_info *info = (struct cql_buf_write_info *)client_data;
+ int l = strlen(b);
+ if (info->off < 0 || (info->off + l >= info->max))
+ {
+ info->off = -1;
+ return;
+ }
+ memcpy (info->buf + info->off, b, l);
+ info->off += l;
+}
+
+int cql_to_xml_buf(struct cql_node *cn, char *out, int max)
+{
+ struct cql_buf_write_info info;
+ info.off = 0;
+ info.max = max;
+ info.buf = out;
+ cql_to_xml(cn, cql_buf_write_handler, &info);
+ if (info.off >= 0)
+ info.buf[info.off] = '\0';
+ return info.off;
+}
+
--- /dev/null
+/*
+ * Copyright (C) 1994-2003, Index Data
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: xmalloc.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/log.h>
+#include <yaz/xmalloc.h>
+
+#ifndef TRACE_XMALLOC
+#define TRACE_XMALLOC 1
+#endif
+
+#if TRACE_XMALLOC > 1
+
+static const unsigned char head[] = {88, 77, 66, 55, 44, 33, 22, 11};
+static const unsigned char tail[] = {11, 22, 33, 44, 55, 66, 77, 88};
+static const unsigned char freed[] = {11, 22, 33, 44, 55, 66, 77, 88};
+
+struct dmalloc_info {
+ int len;
+ char file[16];
+ int line;
+ struct dmalloc_info *next;
+ struct dmalloc_info *prev;
+};
+
+struct dmalloc_info *dmalloc_list = 0;
+
+void *xmalloc_d(size_t nbytes, const char *file, int line)
+{
+ char *res;
+ struct dmalloc_info *dinfo;
+
+ if (!(res = (char*) malloc(nbytes + sizeof(*dinfo)+16*sizeof(char))))
+ return 0;
+ dinfo = (struct dmalloc_info *) res;
+ strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+ dinfo->file[sizeof(dinfo->file)-1] = '\0';
+ dinfo->line = line;
+ dinfo->len = nbytes;
+
+ dinfo->prev = 0;
+ dinfo->next = dmalloc_list;
+ if (dinfo->next)
+ dinfo->next->prev = dinfo;
+ dmalloc_list = dinfo;
+
+ memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
+ res += sizeof(*dinfo) + 8*sizeof(char);
+ memcpy(res + nbytes, tail, 8*sizeof(char));
+ return res;
+}
+
+void xfree_d(void *ptr, const char *file, int line)
+{
+ struct dmalloc_info *dinfo;
+
+ if (!ptr)
+ return;
+ dinfo = (struct dmalloc_info *)
+ ((char*)ptr - 8*sizeof(char) - sizeof(*dinfo));
+ if (memcmp(head, (char*) ptr - 8*sizeof(char), 8*sizeof(char)))
+ {
+ yaz_log(LOG_FATAL, "xfree_d bad head, %s:%d, %p", file, line, ptr);
+ abort();
+ }
+ if (memcmp((char*) ptr + dinfo->len, tail, 8*sizeof(char)))
+ {
+ yaz_log(LOG_FATAL, "xfree_d bad tail, %s:%d, %p", file, line, ptr);
+ abort();
+ }
+ if (dinfo->prev)
+ dinfo->prev->next = dinfo->next;
+ else
+ dmalloc_list = dinfo->next;
+ if (dinfo->next)
+ dinfo->next->prev = dinfo->prev;
+ memcpy ((char*) ptr - 8*sizeof(char), freed, 8*sizeof(char));
+ free(dinfo);
+ return;
+}
+
+void *xrealloc_d(void *p, size_t nbytes, const char *file, int line)
+{
+ struct dmalloc_info *dinfo;
+ char *ptr = (char*) p;
+ char *res;
+
+ if (!ptr)
+ {
+ if (!nbytes)
+ return 0;
+ res = (char *) malloc(nbytes + sizeof(*dinfo) + 16*sizeof(char));
+ }
+ else
+ {
+ if (memcmp(head, ptr - 8*sizeof(char), 8*sizeof(char)))
+ {
+ yaz_log(LOG_FATAL, "xrealloc_d bad head, %s:%d, %p",
+ file, line, ptr);
+ abort();
+ }
+ dinfo = (struct dmalloc_info *) (ptr-8*sizeof(char) - sizeof(*dinfo));
+ if (memcmp(ptr + dinfo->len, tail, 8*sizeof(char)))
+ {
+ yaz_log(LOG_FATAL, "xrealloc_d bad tail, %s:%d, %p",
+ file, line, ptr);
+ abort();
+ }
+ if (dinfo->prev)
+ dinfo->prev->next = dinfo->next;
+ else
+ dmalloc_list = dinfo->next;
+ if (dinfo->next)
+ dinfo->next->prev = dinfo->prev;
+
+ if (!nbytes)
+ {
+ free (dinfo);
+ return 0;
+ }
+ res = (char *)
+ realloc(dinfo, nbytes + sizeof(*dinfo) + 16*sizeof(char));
+ }
+ if (!res)
+ return 0;
+ dinfo = (struct dmalloc_info *) res;
+ strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+ dinfo->file[sizeof(dinfo->file)-1] = '\0';
+ dinfo->line = line;
+ dinfo->len = nbytes;
+
+ dinfo->prev = 0;
+ dinfo->next = dmalloc_list;
+ if (dmalloc_list)
+ dmalloc_list->prev = dinfo;
+ dmalloc_list = dinfo;
+
+ memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
+ res += sizeof(*dinfo) + 8*sizeof(char);
+ memcpy(res + nbytes, tail, 8*sizeof(char));
+ return res;
+}
+
+void *xcalloc_d(size_t nmemb, size_t size, const char *file, int line)
+{
+ char *res;
+ struct dmalloc_info *dinfo;
+ size_t nbytes = nmemb * size;
+
+ if (!(res = (char*) calloc(1, nbytes+sizeof(*dinfo)+16*sizeof(char))))
+ return 0;
+ dinfo = (struct dmalloc_info *) res;
+ strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+ dinfo->file[sizeof(dinfo->file)-1] = '\0';
+ dinfo->line = line;
+ dinfo->len = nbytes;
+
+ dinfo->prev = 0;
+ dinfo->next = dmalloc_list;
+ if (dinfo->next)
+ dinfo->next->prev = dinfo;
+ dmalloc_list = dinfo;
+
+ memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
+ res += sizeof(*dinfo) + 8*sizeof(char);
+ memcpy(res + nbytes, tail, 8*sizeof(char));
+ return res;
+}
+
+void xmalloc_trav_d(const char *file, int line)
+{
+ size_t size = 0;
+ struct dmalloc_info *dinfo = dmalloc_list;
+
+ yaz_log (LOG_MALLOC, "malloc_trav %s:%d", file, line);
+ while (dinfo)
+ {
+ yaz_log (LOG_MALLOC, " %20s:%d p=%p size=%d", dinfo->file, dinfo->line,
+ ((char*) dinfo)+sizeof(*dinfo)+8*sizeof(char), dinfo->len);
+ size += dinfo->len;
+ dinfo = dinfo->next;
+ }
+ yaz_log (LOG_MALLOC, "total bytes %ld", (long) size);
+}
+
+#else
+/* TRACE_XMALLOC <= 1 */
+#define xrealloc_d(o, x, f, l) realloc(o, x)
+#define xmalloc_d(x, f, l) malloc(x)
+#define xcalloc_d(x,y, f, l) calloc(x,y)
+#define xfree_d(x, f, l) free(x)
+#define xmalloc_trav_d(f, l)
+#endif
+
+void xmalloc_trav_f(const char *s, const char *file, int line)
+{
+ xmalloc_trav_d(file, line);
+}
+
+void *xrealloc_f (void *o, size_t size, const char *file, int line)
+{
+ void *p = xrealloc_d (o, size, file, line);
+
+#if TRACE_XMALLOC
+ yaz_log (LOG_MALLOC,
+ "%s:%d: xrealloc(s=%d) %p -> %p", file, line, size, o, p);
+#endif
+ if (!p)
+ {
+ yaz_log (LOG_FATAL|LOG_ERRNO, "Out of memory, realloc (%d bytes)",
+ size);
+ exit(1);
+ }
+ return p;
+}
+
+void *xmalloc_f (size_t size, const char *file, int line)
+{
+ void *p = xmalloc_d (size, file, line);
+
+#if TRACE_XMALLOC
+ yaz_log (LOG_MALLOC, "%s:%d: xmalloc(s=%d) %p", file, line, size, p);
+#endif
+ if (!p)
+ {
+ yaz_log (LOG_FATAL, "Out of memory - malloc (%d bytes)", size);
+ exit (1);
+ }
+ return p;
+}
+
+void *xcalloc_f (size_t nmemb, size_t size, const char *file, int line)
+{
+ void *p = xcalloc_d (nmemb, size, file, line);
+#if TRACE_XMALLOC
+ yaz_log (LOG_MALLOC, "%s:%d: xcalloc(s=%d) %p", file, line, size, p);
+#endif
+ if (!p)
+ {
+ yaz_log (LOG_FATAL, "Out of memory - calloc (%d, %d)", nmemb, size);
+ exit (1);
+ }
+ return p;
+}
+
+char *xstrdup_f (const char *s, const char *file, int line)
+{
+ char *p = (char *)xmalloc_d (strlen(s)+1, file, line);
+#if TRACE_XMALLOC
+ yaz_log (LOG_MALLOC, "%s:%d: xstrdup(s=%d) %p", file, line, strlen(s)+1, p);
+#endif
+ strcpy (p, s);
+ return p;
+}
+
+void xfree_f(void *p, const char *file, int line)
+{
+ if (!p)
+ return ;
+#if TRACE_XMALLOC
+ if (p)
+ yaz_log (LOG_MALLOC, "%s:%d: xfree %p", file, line, p);
+#endif
+ xfree_d(p, file, line);
+}
--- /dev/null
+/*
+ * Copyright (c) 1996-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: yaz-ccl.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/yaz-ccl.h>
+#include <yaz/pquery.h>
+
+Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
+{
+ YAZ_PQF_Parser parser = yaz_pqf_create();
+ WRBUF wr = wrbuf_alloc();
+ Z_RPNQuery *q;
+
+ ccl_pquery(wr, p);
+
+ q = yaz_pqf_parse(parser, o, wrbuf_buf(wr));
+
+ wrbuf_free(wr, 1);
+ yaz_pqf_destroy(parser);
+ return q;
+}
+
+Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
+{
+ YAZ_PQF_Parser parser = yaz_pqf_create();
+ WRBUF wr = wrbuf_alloc();
+ Z_AttributesPlusTerm *q;
+ Odr_oid *setp;
+
+ ccl_pquery(wr, p);
+
+ q = yaz_pqf_scan(parser, o, &setp, wrbuf_buf(wr));
+
+ wrbuf_free(wr, 1);
+ yaz_pqf_destroy(parser);
+ return q;
+}
+
--- /dev/null
+# YC Sample Config File for Z39.50
+# $Id: z.tcl,v 1.1 2003-10-27 12:21:36 adam Exp $
+# ----------------------------------------------------------
+# Prefix Specifications
+#
+# 1: C function prefix
+# 2: C type prefix
+# 3: C preprocessor prefix
+
+# Default prefix
+set default-prefix {z_ Z_ Z_}
+
+# Name clash in extended services (TargetPart, OriginPartToKeep, etc)
+# You can possibly think of better names :)
+set prefix(ESFormat-PersistentResultSet) {z_PR Z_PR Z_PR}
+set prefix(ESFormat-PersistentQuery) {z_PQuery Z_PQuery Z_PQuery}
+set prefix(ESFormat-PeriodicQuerySchedule) {z_PQS Z_PQS Z_PQS}
+set prefix(ESFormat-ItemOrder) {z_IO Z_IO Z_IO}
+set prefix(ESFormat-Update0) {z_IU0 Z_IU0 Z_IU0}
+set prefix(ESFormat-Update) {z_IU Z_IU Z_IU}
+set prefix(ESFormat-ExportSpecification) {z_ES Z_ES Z_ES}
+set prefix(ESFormat-ExportInvocation) {z_EI Z_EI Z_EI}
+
+# ----------------------------------------------------------
+# Settings for core of the protocol
+set m Z39-50-APDU-1995
+
+# Filename
+set filename($m) z-core
+
+# Public header initialization code
+set init($m,h) {
+typedef struct Z_External Z_External;
+YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
+}
+
+set body($m,h) "
+#ifdef __cplusplus
+extern \"C\" \{
+#endif
+
+int z_ANY_type_0 (ODR o, void **p, int opt);
+
+#ifdef __cplusplus
+\}
+#endif
+"
+set body($m,c) {
+
+/* the type-0 query ... */
+int z_ANY_type_0 (ODR o, void **p, int opt)
+{
+ return 0;
+}
+
+}
+
+# Type Name overrides
+set map($m,PDU) APDU
+set membermap($m,Operator,and) {Operator_and op_and}
+set membermap($m,Operator,or) {Operator_or op_or}
+#set membermap($m,Operator,and-not) {Operator_and_not op_and_not}
+set map($m,AttributeElement_complex) ComplexAttribute
+set map($m,DeleteSetStatus) DeleteStatus
+set membermap($m,ProximityOperator,private) {ProximityOperator_private zprivate}
+set unionmap($m,AttributeElement,attributeValue) {which value AttributeValue}
+set membermap($m,ElementSpec,externalEspec) externalSpec
+set membermap($m,RPNStructure,op) simple
+set membermap($m,RPNStructure,rpnRpnOp) complex
+set map($m,RPNStructure_complex) Complex
+set membermap($m,Operand,attrTerm) {Operand_APT attributesPlusTerm}
+set membermap($m,Operand,resultSet) {Operand_resultSetId resultSetId}
+set membermap($m,Operand,resultAttr) {Operand_resultAttr resultAttr}
+set membermap($m,Complex,rpn1) s1
+set membermap($m,Complex,rpn2) s2
+set membermap($m,Complex,op) roperator
+set membermap($m,RPNQuery,attributeSet) attributeSetId
+set membermap($m,RPNQuery,rpn) RPNStructure
+set map($m,KnownProximityUnit) ProxUnit
+set membermap($m,ProximityOperator,lessThan) {Prox_lessThan 1}
+set membermap($m,ProximityOperator,lessThanOrEqual) {Prox_lessThanOrEqual 1}
+set membermap($m,ProximityOperator,equal) {Prox_equal 1}
+set membermap($m,ProximityOperator,greaterThanOrEqual) {Prox_greaterThanOrEqual 1}
+set membermap($m,ProximityOperator,greaterThan) {Prox_greaterThan 1}
+set membermap($m,ProximityOperator,notEqual) {Prox_notEqual 1}
+#
+set membermap($m,Records,responseRecords) {Records_DBOSD databaseOrSurDiagnostics}
+set membermap($m,Records,nonSurrogateDiagnostic) {Records_NSD nonSurrogateDiagnostic}
+set membermap($m,Records,multipleNonSurDiagnostics) {Records_multipleNSD multipleNonSurDiagnostics}
+set map($m,Records_DBOSD) NamePlusRecordList
+set map($m,Records_NSD) DiagRec
+set map($m,Records_multipleNSD) DiagRecs
+set membermap($m,NamePlusRecord,name) databaseName
+set unionmap($m,DiagRecs) {num_diagRecs diagRecs}
+set unionmap($m,NamePlusRecordList) {num_records records}
+#
+set membermap($m,ElementSetNames,genericElementSetName) generic
+set map($m,ElementSetNames_databaseSpecific) DatabaseSpecific
+#
+set map($m,OccurrenceByAttributes_s) OccurrenceByAttributesElem
+set map($m,OccurrenceByAttributesElem_byDatabase) byDatabaseList
+#
+set membermap($m,SortElement,datbaseSpecific) databaseSpecific
+set map($m,SortElement_databaseSpecific) SortDbSpecificList
+#
+set map($m,SortKey_sortAttributes) SortAttributes
+set unionmap($m,PresentRequest,recordComposition) {}
+set map($m,PresentRequest_0) RecordComposition
+set unionmap($m,PresentRequest,additionalRanges) {num_ranges additionalRanges}
+set unionmap($m,SortRequest,sortSequence) {}
+set map($m,SortRequest_0) SortKeySpecList
+set unionmap($m,SortKeySpecList) {num_specs specs}
+set map($m,InitializeRequest) InitRequest
+set map($m,InitializeResponse) InitResponse
+set unionmap($m,CloseReason) Close
+set membermap($m,ProtocolVersion,version-1) 1
+set membermap($m,ProtocolVersion,version-2) 2
+set membermap($m,ProtocolVersion,version-3) 3
+set membermap($m,InitRequest,exceptionalRecordSize) maximumRecordSize
+set membermap($m,InitResponse,exceptionalRecordSize) maximumRecordSize
+set map($m,RecordsMultipleNonSurDiagnostics) DiagRecs
+set map($m,RecordsDatabaseOrSurDiagnostics) NamePlusRecordList
+set membermap($m,NamePlusRecord,retrievalRecord) databaseRecord
+set unionmap($m,RecordComposition) {which u RecordComp}
+set unionmap($m,ScanResponse,scanStatus) Scan
+set unionmap($m,AttributeList) {num_attributes attributes}
+set membermap($m,SortKey,sortfield) sortField
+set map($m,CompSpec_0) DbSpecific
+set map($m,DatabaseSpecific_s) DatabaseSpecificUnit
+set map($m,ListStatuses_s) ListStatus
+set map($m,IdAuthenticationIdPass) IdPass
+set map($m,OtherInformation_s) OtherInformationUnit
+set unionmap($m,OtherInformationUnit,information) {which information OtherInfo}
+set unionmap($m,OtherInformation) {num_elements list}
+set unionmap($m,Specification,elementSpec) {}
+set map($m,Specification_0) ElementSpec
+set unionmap($m,Specification,schema) {which schema Schema}
+
+# ----
+set m DiagnosticFormatDiag1
+set filename($m) z-diag1
+set map($m,DiagFormat_tooMany) TooMany
+set map($m,DiagFormat_badSpec) BadSpec
+set map($m,DiagFormat_dbUnavail) DbUnavail
+set map($m,DiagFormat_attribute) Attribute
+set map($m,DiagFormat_attCombo) AttCombo
+set map($m,DiagFormat_term) DiagTerm
+set map($m,DiagFormat_proximity) Proximity
+set map($m,DiagFormat_scan) Scan
+set map($m,DiagFormat_sort) Sort
+set unionmap($m,Sort) {which u SortD}
+set map($m,DiagFormat_segmentation) Segmentation
+set map($m,DiagFormat_extServices) ExtServices
+set map($m,DiagFormat_accessCtrl) AccessCtrl
+set map($m,DiagFormat_recordSyntax) RecordSyntax
+#
+set map($m,Scan_termList2) AttrListList
+set map($m,Sort_inputTooLarge) StringList
+#
+set map($m,AccessCtrl_oid) OidList
+set map($m,AccessCtrl_alternative) AltOidList
+# ----
+set m RecordSyntax-explain
+set filename($m) z-exp
+set map($m,Explain-Record) ExplainRecord
+set map($m,ElementDataType_structured) ElementInfoList
+set map($m,HumanString_s) HumanStringUnit
+set unionmap($m,HumanString) {num_strings strings}
+set membermap($m,CommonInfo,humanString-Language) humanStringLanguage
+set unionmap($m,AttributeOccurrence,attributeValues) {which attributeValues AttributeOcc}
+set unionmap($m,AttributeCombination) {num_occurrences occurrences}
+#
+set membermap($m,NetworkAddress,internetAddress) {NetworkAddress_iA internetAddress}
+set map($m,NetworkAddress_iA) NetworkAddressIA
+set membermap($m,NetworkAddress,osiPresentationAddress) {NetworkAddress_oPA osiPresentationAddress}
+set map($m,NetworkAddress_oPA) NetworkAddressOPA
+set map($m,NetworkAddress_other) NetworkAddressOther
+set unionmap($m,DatabaseList) {num_databases databases}
+set membermap($m,TargetInfo,recent-news) recentNews
+set membermap($m,TargetInfo,usage-restrictions) usageRest
+set membermap($m,DatabaseInfo,user-fee) userFee
+#
+set map($m,ProximitySupport_0) ProxSupportUnit
+set map($m,ProxSupportUnitZprivate) ProxSupportPrivate
+set membermap($m,ProxSupportUnit,private) {ProxSupportUnit_private zprivate}
+#
+set map($m,AttributeOccurrence_specific) AttributeValueList
+set unionmap($m,AttributeValueList) {num_attributes attributes}
+
+set unionmap($m,ExplainRecord) {which u Explain}
+set map($m,SchemaInfo_0) TagTypeMapping
+set map($m,TagSetInfo_0) TagSetElements
+set map($m,TermListInfo_0) TermListElement
+set map($m,TermListDetails_0) EScanInfo
+set map($m,PrivateCapabilities_0) PrivateCapOperator
+set map($m,Costs_0) CostsOtherCharge
+set map($m,Path_s) PathUnit
+set map($m,IconObject_s) IconObjectUnit
+set map($m,NetworkAddressInternetAddress) NetworkAddressIA
+set map($m,NetworkAddressOsiPresentationAddress) NetworkAddressOPA
+set membermap($m,QueryTypeDetails,private) {QueryTypeDetails_private zprivate}
+set membermap($m,PrivateCapOperator,operator) roperator
+set map($m,AccessRestrictions_s) AccessRestrictionsUnit
+# ----
+set m RecordSyntax-SUTRS
+set filename($m) z-sutrs
+#set map($m,SutrsRecord) SUTRS
+set body($m,c) {
+int z_SUTRS (ODR o, Odr_oct **p, int opt, const char *name)
+{
+ return odr_implicit_tag(o, odr_octetstring, p, ODR_UNIVERSAL,
+ ODR_GENERALSTRING, opt, name);
+}
+}
+
+set init($m,h) {
+typedef Odr_oct Z_SUTRS;
+YAZ_EXPORT int z_SUTRS (ODR o, Odr_oct **p, int opt, const char *name);
+}
+# ----
+set m RecordSyntax-opac
+set filename($m) z-opac
+# ----
+set m RecordSyntax-summary
+set filename($m) z-sum
+# ----
+set m RecordSyntax-generic
+set filename($m) z-grs
+set map($m,ElementData_subtree) GenericRecord
+set map($m,Variant_0) Triple
+set membermap($m,Triple,class) zclass
+set unionmap($m,Triple,value) {which value Triple}
+set unionmap($m,GenericRecord) {num_elements elements}
+# ----
+set m RecordSyntax-ESTaskPackage
+set filename($m) z-estask
+# ----
+set m ResourceReport-Format-Resource-1
+set filename($m) z-rrf1
+set map($m,ResourceReport) ResourceReport1
+set map($m,Estimate) Estimate1
+# ----
+set m ResourceReport-Format-Resource-2
+set filename($m) z-rrf2
+set map($m,ResourceReport) ResourceReport2
+set map($m,Estimate) Estimate2
+# ----
+set m AccessControlFormat-prompt-1
+set filename($m) z-accform1
+set membermap($m,PromptId,enummeratedPrompt) enumeratedPrompt
+set map($m,PromptObject) PromptObject1
+set map($m,Challenge) Challenge1
+set map($m,Challenge1_s) ChallengeUnit1
+set map($m,Response) Response1
+set map($m,Response1_s) ResponseUnit1
+set map($m,PromptObject) PromptObject1
+# ----
+set m AccessControlFormat-des-1
+set filename($m) z-accdes1
+# ----
+set m AccessControlFormat-krb-1
+set filename($m) z-acckrb1
+# ----
+set m ESFormat-PersistentResultSet
+set filename($m) zes-pset
+# ----
+set m ESFormat-PersistentQuery
+set filename($m) zes-pquery
+# ----
+set m ESFormat-PeriodicQuerySchedule
+set filename($m) zes-psched
+# ----
+set m ESFormat-ItemOrder
+set filename($m) zes-order
+set map($m,ItemOrderEsRequest) Request
+set map($m,ItemOrderTaskPackage) TaskPackage
+set map($m,OriginPartToKeep_0) Contact
+set map($m,OriginPartToKeep_1) Billing
+set map($m,OriginPartNotToKeep_0) ResultSetItem
+#
+# ---- (old version)
+set m ESFormat-Update0
+set filename($m) zes-update0
+set map($m,SuppliedRecords_s) SuppliedRecords_elem
+set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
+#
+# ---- (new, current version)
+set m ESFormat-Update
+set filename($m) zes-update
+set map($m,SuppliedRecords_s) SuppliedRecords_elem
+set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
+# ----
+set m ESFormat-ExportSpecification
+set filename($m) zes-exps
+# ----
+set m ESFormat-ExportInvocation
+set filename($m) zes-expi
+# ----
+set m UserInfoFormat-searchResult-1
+set filename($m) z-uifr1
+# ----
+set m ElementSpecificationFormat-eSpec-1
+set filename($m) z-espec1
+set map($m,Espec-1) Espec1
+set map($m,TagPath) ETagPath
+set map($m,ETagPath_s) ETagUnit
+set map($m,ETagUnitSpecificTag) SpecificTag
+set membermap($m,SpecificTag,occurrence) occurrences
+set unionmap($m,ElementRequest) {which u ERequest}
+set unionmap($m,ETagPath) {num_tags tags}
+set map($m,OccurrencesValues) OccurValues
+# ----
+set m UserInfoFormat-dateTime
+set filename($m) z-date
+set map($m,Z3950Date) Date
+set map($m,Z3950Time) Time
+set unionmap($m,Z3950Date,era) {}
+set map($m,DateFlags_0) Era
+set map($m,Z3950DateMonthAndDay) MonthAndDay
+set map($m,Z3950DateQuarter) DateQuater
+set map($m,Z3950DateSeason) DateSeason
+set map($m,Date_0) DateFlags
+set unionmap($m,DateFlags,era) {}
+# ----
+set m UserInfoFormat-multipleSearchTerms-2
+set filename($m) z-mterm2
+# ----
+set m ResourceReport-Format-Universe-1
+set filename($m) z-univ
+# ----
+set m UserInfoFormat-oclcUserInformation
+set filename($m) z-oclcui
+# ----
+set m ESFormat-Admin
+set filename($m) zes-admin
+set map($m,EsRequest) ESAdminRequest
+set map($m,TaskPackage) ESAdminTaskPackage
+set map($m,OriginPartToKeep) ESAdminOriginPartToKeep
+set map($m,OriginPartNotToKeep) ESAdminOriginPartNotToKeep
+set map($m,TargetPart) ESAdminTargetPart
+# ----
+set m NegotiationRecordDefinition-charSetandLanguageNegotiation-3
+set filename($m) z-charneg
+set membermap($m,OriginProposal_0,private) {OriginProposal_0_private zprivate}
+set membermap($m,TargetResponse,private) {TargetResponse_private zprivate}
+# ----------------------------------------------------------
+# "Constructed" types defined by means of C-types are declared here.
+# Each function returns the C-handler and the C-type.
+proc asnBasicEXTERNAL {} {
+ return {z_External Z_External}
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: z3950oid.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/proto.h>
+
+Odr_oid *yaz_oidval_to_z3950oid (ODR o, int oid_class, int oid_value)
+{
+ oident ident;
+ int oid[OID_SIZE];
+
+ ident.proto = PROTO_Z3950;
+ ident.oclass = (enum oid_class) oid_class;
+ ident.value = (enum oid_value) oid_value;
+
+ if (ident.value == VAL_NONE)
+ return 0;
+
+ return odr_oiddup(o, oid_ent_to_oid(&ident, oid));
+}
+
+Odr_oid *yaz_str_to_z3950oid (ODR o, int oid_class, const char *str)
+{
+ struct oident ident;
+ int oid[OID_SIZE];
+
+ ident.proto = PROTO_Z3950;
+ ident.oclass = (enum oid_class) oid_class;
+ ident.value = oid_getvalbyname(str);
+
+ if (ident.value == VAL_NONE)
+ return 0;
+
+ return odr_oiddup(o, oid_ent_to_oid(&ident, oid));
+}
+
+const char *yaz_z3950oid_to_str (Odr_oid *oid, int *oid_class)
+{
+ struct oident *ident = oid_getentbyoid(oid);
+
+ if (!ident || ident->value == VAL_NONE)
+ return 0;
+ *oid_class = ident->oclass;
+ return ident->desc;
+}
+
+
+const char* yaz_z3950_oid_value_to_str(oid_value ov, oid_class oc)
+{
+ struct oident tmpentry;
+ int tmp_oid[OID_SIZE];
+
+ tmpentry.proto = PROTO_Z3950;
+ tmpentry.oclass = oc;
+ tmpentry.value = ov;
+
+ if( oid_ent_to_oid(&tmpentry,tmp_oid) )
+ {
+ return tmpentry.desc;
+ }
+ else
+ {
+ return "";
+ }
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 8
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=8 fdm=marker
+ * vim<600: sw=4 ts=8
+ */
--- /dev/null
+Z39-50-APDU-1995 -- OID for this definition, assigned in OID.3.1, is {Z39-50 2 1}
+DEFINITIONS ::=
+BEGIN -- Z39.50 Maintenance Agency Official Text for ANSI/NISO Z39.50-1995 - July 1995
+--
+EXPORTS OtherInformation, Term, AttributeSetId, AttributeList, AttributeElement, ElementSetName, SortElement, DatabaseName,
+CompSpec, Specification, Permissions, InternationalString, IntUnit, Unit, StringOrNumeric, Query, Records, ResultSetId,
+DefaultDiagFormat, DiagRec, Segment;
+--
+
+PDU ::= CHOICE{
+ initRequest [20] IMPLICIT InitializeRequest,
+ initResponse [21] IMPLICIT InitializeResponse,
+ searchRequest [22] IMPLICIT SearchRequest,
+ searchResponse [23] IMPLICIT SearchResponse,
+ presentRequest [24] IMPLICIT PresentRequest,
+ presentResponse [25] IMPLICIT PresentResponse,
+ deleteResultSetRequest [26] IMPLICIT DeleteResultSetRequest,
+ deleteResultSetResponse [27] IMPLICIT DeleteResultSetResponse,
+ accessControlRequest [28] IMPLICIT AccessControlRequest,
+ accessControlResponse [29] IMPLICIT AccessControlResponse,
+ resourceControlRequest [30] IMPLICIT ResourceControlRequest,
+ resourceControlResponse [31] IMPLICIT ResourceControlResponse,
+ triggerResourceControlRequest [32] IMPLICIT TriggerResourceControlRequest,
+ resourceReportRequest [33] IMPLICIT ResourceReportRequest,
+ resourceReportResponse [34] IMPLICIT ResourceReportResponse,
+ scanRequest [35] IMPLICIT ScanRequest,
+ scanResponse [36] IMPLICIT ScanResponse,
+ -- [37] through [42] reserved
+ sortRequest [43] IMPLICIT SortRequest,
+ sortResponse [44] IMPLICIT SortResponse,
+ segmentRequest [45] IMPLICIT Segment,
+ extendedServicesRequest [46] IMPLICIT ExtendedServicesRequest,
+ extendedServicesResponse [47] IMPLICIT ExtendedServicesResponse,
+ close [48] IMPLICIT Close,
+ duplicateDetectionRequest [49] IMPLICIT DuplicateDetectionRequest,
+ duplicateDetectionResponse [50] IMPLICIT DuplicateDetectionResponse}
+
+
+-- Initialize APDUs
+--
+ InitializeRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ protocolVersion ProtocolVersion,
+ options Options,
+ preferredMessageSize [5] IMPLICIT INTEGER,
+ exceptionalRecordSize [6] IMPLICIT INTEGER,
+ idAuthentication [7] IdAuthentication OPTIONAL, -- see note below
+ implementationId [110] IMPLICIT InternationalString OPTIONAL,
+ implementationName [111] IMPLICIT InternationalString OPTIONAL,
+ implementationVersion [112] IMPLICIT InternationalString OPTIONAL,
+ userInformationField [11] EXTERNAL OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--Note:
+-- For idAuthentication, the type ANY is retained for compatibility with earlier versions.
+-- For interoperability, the following is recommended:
+IdAuthentication ::=
+ CHOICE{
+ open VisibleString,
+ idPass SEQUENCE {
+ groupId [0] IMPLICIT InternationalString OPTIONAL,
+ userId [1] IMPLICIT InternationalString OPTIONAL,
+ password [2] IMPLICIT InternationalString OPTIONAL },
+ anonymous NULL,
+ other EXTERNAL
+ }
+-- May use access control formats for 'other'. See Appendix 7 ACC.
+--
+ InitializeResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ protocolVersion ProtocolVersion,
+ options Options,
+ preferredMessageSize [5] IMPLICIT INTEGER,
+ exceptionalRecordSize [6] IMPLICIT INTEGER,
+ result [12] IMPLICIT BOOLEAN, -- reject = FALSE; Accept = TRUE
+ implementationId [110] IMPLICIT InternationalString OPTIONAL,
+ implementationName [111] IMPLICIT InternationalString OPTIONAL,
+ implementationVersion [112] IMPLICIT InternationalString OPTIONAL,
+ userInformationField [11] EXTERNAL OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+-- Begin auxiliary definitions for Init PDUs
+ ProtocolVersion ::= [3] IMPLICIT BIT STRING{
+ version-1 (0), -- This bit should always be set, but does not
+ -- correspond to any Z39.50 version.
+ version-2 (1), -- "Version 2 supported."
+ -- This bit should always be set.
+ version-3 (2) -- "Version 3 supported."
+-- Values higher than 'version-3' should be ignored. Both the Initialize request and Initialize Response APDUs
+-- include a value string corresponding to the supported versions. The highest common version is selected
+-- for use. If there are no versions in common, "Result" in the Init Response should indicate "reject."
+-- Note: Versions 1 and 2 are identical. Systems supporting version 2 should indicate support for version
+-- 1 as well, for interoperability with systems that indicate support for version 1 only (e.g. ISO 10163-1991
+-- implementations).
+ }
+ Options ::= [4] IMPLICIT BIT STRING{
+ search (0),
+ present (1),
+ delSet (2),
+ resourceReport (3),
+ triggerResourceCtrl (4),
+ resourceCtrl (5),
+ accessCtrl (6),
+ scan (7),
+ sort (8),
+ -- (not used) (9),
+ extendedServices (10),
+ level-1Segmentation (11),
+ level-2Segmentation (12),
+ concurrentOperations (13),
+ namedResultSets (14),
+ encapsulation (15),
+ resultCount (16),
+ negotiationModel (17),
+ duplicateDetection (18),
+ queryType104 (19),
+ pQESCorrection (20),
+ stringSchema (21)
+}
+-- end auxiliary definitions for Init PDUs
+
+
+--Search APDUs
+ SearchRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ smallSetUpperBound [13] IMPLICIT INTEGER,
+ largeSetLowerBound [14] IMPLICIT INTEGER,
+ mediumSetPresentNumber [15] IMPLICIT INTEGER,
+ replaceIndicator [16] IMPLICIT BOOLEAN,
+ resultSetName [17] IMPLICIT InternationalString,
+ databaseNames [18] IMPLICIT SEQUENCE OF DatabaseName,
+ smallSetElementSetNames [100] ElementSetNames OPTIONAL,
+ mediumSetElementSetNames [101] ElementSetNames OPTIONAL,
+ preferredRecordSyntax [104] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ query [21] Query,
+ -- Following two parameters may be used only if version 3 is in force.
+ additionalSearchInfo [203] IMPLICIT OtherInformation OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+
+-- Query Definitions
+ Query ::= CHOICE{
+ type-0 [0] ANY,
+ type-1 [1] IMPLICIT RPNQuery,
+ type-2 [2] OCTET STRING,
+ type-100 [100] OCTET STRING,
+ type-101 [101] IMPLICIT RPNQuery,
+ type-102 [102] OCTET STRING,
+ type-104 [104] IMPLICIT EXTERNAL
+}
+--
+-- Definitions for RPN query
+ RPNQuery ::= SEQUENCE{
+ attributeSet AttributeSetId,
+ rpn RPNStructure}
+--
+ RPNStructure ::= CHOICE{
+ op [0] Operand,
+ rpnRpnOp [1] IMPLICIT SEQUENCE{
+ rpn1 RPNStructure,
+ rpn2 RPNStructure,
+ op Operator }}
+ Operand ::= CHOICE{
+ attrTerm AttributesPlusTerm,
+ resultSet ResultSetId,
+ -- If version 2 is in force:
+ -- - If query type is 1, one of the above two must be chosen;
+ -- - resultAttr (below) may be used only if query type is 101.
+ resultAttr ResultSetPlusAttributes}
+
+ AttributesPlusTerm ::= [102] IMPLICIT SEQUENCE{
+ attributes AttributeList,
+ term Term}
+ ResultSetPlusAttributes ::= [214] IMPLICIT SEQUENCE{
+ resultSet ResultSetId,
+ attributes AttributeList}
+ AttributeList ::= [44] IMPLICIT SEQUENCE OF AttributeElement
+--
+ Term ::= CHOICE{
+ general [45] IMPLICIT OCTET STRING,
+ -- values below may be used only if version 3 is in force
+ numeric [215] IMPLICIT INTEGER,
+ characterString [216] IMPLICIT InternationalString,
+ oid [217] IMPLICIT OBJECT IDENTIFIER,
+ dateTime [218] IMPLICIT GeneralizedTime,
+ external [219] IMPLICIT EXTERNAL,
+ integerAndUnit [220] IMPLICIT IntUnit,
+ null [221] IMPLICIT NULL}
+
+ Operator ::= [46] CHOICE{
+ and [0] IMPLICIT NULL,
+ or [1] IMPLICIT NULL,
+ and-not [2] IMPLICIT NULL,
+ -- If version 2 is in force:
+ -- - For query type 1, one of the above three must be chosen;
+ -- - prox (below) may be used only if query type is 101.
+ prox [3] IMPLICIT ProximityOperator}
+ AttributeElement ::= SEQUENCE{
+ attributeSet [1] IMPLICIT AttributeSetId OPTIONAL,
+ -- Must be omitted if version 2 is in force.
+ -- If included, overrides value of attributeSet
+ -- in RPNQuery above, but only for this attribute.
+ attributeType [120] IMPLICIT INTEGER,
+ attributeValue CHOICE{
+ numeric [121] IMPLICIT INTEGER,
+ -- If version 2 is in force,
+ -- Must select 'numeric' for attributeValue.
+
+ complex [224] IMPLICIT SEQUENCE{
+ list [1] IMPLICIT SEQUENCE OF StringOrNumeric,
+ semanticAction [2] IMPLICIT SEQUENCE OF INTEGER OPTIONAL}}}
+
+
+ ProximityOperator ::= SEQUENCE{
+ exclusion [1] IMPLICIT BOOLEAN OPTIONAL,
+ distance [2] IMPLICIT INTEGER,
+ ordered [3] IMPLICIT BOOLEAN,
+ relationType [4] IMPLICIT INTEGER{
+ lessThan (1),
+ lessThanOrEqual (2),
+ equal (3),
+ greaterThanOrEqual (4),
+ greaterThan (5),
+ notEqual (6)},
+ proximityUnitCode [5] CHOICE{
+ known [1] IMPLICIT KnownProximityUnit,
+ private [2] IMPLICIT INTEGER}}
+--
+ KnownProximityUnit ::= INTEGER{
+ character (1),
+ word (2),
+ sentence (3),
+ paragraph (4),
+ section (5),
+ chapter (6),
+ document (7),
+ element (8),
+ subelement (9),
+ elementType (10),
+ byte (11) -- Version 3 only
+ }
+-- End definitions for RPN Query
+
+
+SearchResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ resultCount [23] IMPLICIT INTEGER,
+ numberOfRecordsReturned [24] IMPLICIT INTEGER,
+ nextResultSetPosition [25] IMPLICIT INTEGER,
+ searchStatus [22] IMPLICIT BOOLEAN,
+ resultSetStatus [26] IMPLICIT INTEGER{
+ subset (1),
+ interim (2),
+ none (3)} OPTIONAL,
+ presentStatus PresentStatus OPTIONAL,
+ records Records OPTIONAL,
+ -- Following two parameters may be used only if version 3 is in force.
+ additionalSearchInfo [203] IMPLICIT OtherInformation OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--Retrieval APDUs
+ PresentRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ resultSetId ResultSetId,
+ resultSetStartPoint [30] IMPLICIT INTEGER,
+ numberOfRecordsRequested [29] IMPLICIT INTEGER,
+ additionalRanges [212] IMPLICIT SEQUENCE OF Range OPTIONAL,
+ -- additionalRanges may be included only if version 3 is in force.
+ recordComposition CHOICE{
+ simple [19] ElementSetNames,
+ -- must choose 'simple' if version 2 is in force
+ complex [209] IMPLICIT CompSpec} OPTIONAL,
+ preferredRecordSyntax [104] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ maxSegmentCount [204] IMPLICIT INTEGER OPTIONAL, -- level 1 or 2
+ maxRecordSize [206] IMPLICIT INTEGER OPTIONAL, -- level 2 only
+ maxSegmentSize [207] IMPLICIT INTEGER OPTIONAL, -- level 2 only
+ otherInfo OtherInformation OPTIONAL}
+--
+ Segment ::= SEQUENCE{
+ -- Segment PDU may only be used when version 3 is in force,
+ -- and only when segmentation is in effect.
+ referenceId ReferenceId OPTIONAL,
+ numberOfRecordsReturned [24] IMPLICIT INTEGER,
+ segmentRecords [0] IMPLICIT SEQUENCE OF NamePlusRecord,
+ otherInfo OtherInformation OPTIONAL}
+--
+ PresentResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ numberOfRecordsReturned [24] IMPLICIT INTEGER,
+ nextResultSetPosition [25] IMPLICIT INTEGER,
+ presentStatus PresentStatus,
+ records Records OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+-- begin auxiliary definitions for Search and Present APDUs
+
+-- begin definition of records
+ Records ::= CHOICE{
+ responseRecords [28] IMPLICIT SEQUENCE OF NamePlusRecord,
+ nonSurrogateDiagnostic [130] IMPLICIT DefaultDiagFormat,
+ multipleNonSurDiagnostics [205] IMPLICIT SEQUENCE OF DiagRec}
+--
+ NamePlusRecord ::= SEQUENCE{
+ name [0] IMPLICIT DatabaseName OPTIONAL,
+ record [1] CHOICE{
+ retrievalRecord [1] EXTERNAL,
+ surrogateDiagnostic [2] DiagRec,
+ -- Must select one of the above two, retrievalRecord or
+ -- surrogateDiagnostic, unless 'level 2 segmentation' is in effect.
+ startingFragment [3] FragmentSyntax,
+ intermediateFragment [4] FragmentSyntax,
+ finalFragment [5] FragmentSyntax}}
+ FragmentSyntax ::= CHOICE{
+ externallyTagged EXTERNAL,
+ notExternallyTagged OCTET STRING}
+
+ DiagRec ::= CHOICE{
+ defaultFormat DefaultDiagFormat,
+ -- Must choose defaultFormat if version 2 is in effect.
+ externallyDefined EXTERNAL}
+
+ DefaultDiagFormat::= SEQUENCE{
+ diagnosticSetId OBJECT IDENTIFIER,
+ condition INTEGER,
+ addinfo CHOICE{
+ v2Addinfo VisibleString, -- version 2
+ v3Addinfo InternationalString -- version 3
+ }}
+ -- end definition of records
+ Range ::= SEQUENCE{
+ startingPosition [1] IMPLICIT INTEGER,
+ numberOfRecords [2] IMPLICIT INTEGER}
+--
+ ElementSetNames ::= CHOICE {
+ genericElementSetName [0] IMPLICIT InternationalString,
+ databaseSpecific [1] IMPLICIT SEQUENCE OF SEQUENCE{
+ dbName DatabaseName,
+ esn ElementSetName}}
+
+ PresentStatus ::= [27] IMPLICIT INTEGER{
+ success (0),
+ partial-1 (1),
+ partial-2 (2),
+ partial-3 (3),
+ partial-4 (4),
+ failure (5)}
+
+-- begin definition of composition specification
+ CompSpec ::= SEQUENCE{
+ selectAlternativeSyntax [1] IMPLICIT BOOLEAN,
+ -- See comment for recordSyntax, below.
+ generic [2] IMPLICIT Specification OPTIONAL,
+ dbSpecific [3] IMPLICIT SEQUENCE OF SEQUENCE{
+ db [1] DatabaseName,
+ spec [2] IMPLICIT Specification} OPTIONAL,
+ -- At least one of generic and dbSpecific must occur, and both may occur. If both, then for
+ -- any record not in the list of databases within dbSpecific, generic applies.
+ recordSyntax [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL
+ -- For each record, the target selects the first record syntax
+ -- in this list that it can support. If the list is exhausted, the
+ -- target may select an alternative syntax if
+ -- selectAlternativeSyntax is 'true'.
+ }
+ Specification ::= SEQUENCE{
+ schema CHOICE {
+ oid [1] IMPLICIT OBJECT IDENTIFIER,
+ uri [300] IMPLICIT InternationalString
+ } OPTIONAL,
+ elementSpec [2] CHOICE{
+ elementSetName [1] IMPLICIT InternationalString,
+ externalEspec [2] IMPLICIT EXTERNAL} OPTIONAL}
+-- end definition of composition specification
+-- end auxiliary definitions for search and response APDUs
+
+-- Delete APDUs
+ DeleteResultSetRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ deleteFunction [32] IMPLICIT INTEGER{
+ list (0),
+ all (1)},
+ resultSetList SEQUENCE OF ResultSetId OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--
+ DeleteResultSetResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ deleteOperationStatus [0] IMPLICIT DeleteSetStatus,
+ deleteListStatuses [1] IMPLICIT ListStatuses OPTIONAL,
+ numberNotDeleted [34] IMPLICIT INTEGER OPTIONAL,
+ bulkStatuses [35] IMPLICIT ListStatuses OPTIONAL,
+ deleteMessage [36] IMPLICIT InternationalString OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+ ListStatuses ::= SEQUENCE OF SEQUENCE{
+ id ResultSetId,
+ status DeleteSetStatus}
+
+ DeleteSetStatus ::= [33] IMPLICIT INTEGER{
+ success (0),
+ resultSetDidNotExist (1),
+ previouslyDeletedByTarget (2),
+ systemProblemAtTarget (3),
+ accessNotAllowed (4),
+ resourceControlAtOrigin (5),
+ resourceControlAtTarget (6),
+ bulkDeleteNotSupported (7),
+ notAllRsltSetsDeletedOnBulkDlte (8),
+ notAllRequestedResultSetsDeleted (9),
+ resultSetInUse (10)}
+--
+
+--Access- and Resource-control APDUs
+--
+ AccessControlRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ securityChallenge CHOICE{
+ simpleForm [37] IMPLICIT OCTET STRING,
+ externallyDefined [0] EXTERNAL},
+ otherInfo OtherInformation OPTIONAL}
+
+ AccessControlResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ securityChallengeResponse CHOICE{
+ simpleForm [38] IMPLICIT OCTET STRING,
+ externallyDefined [0] EXTERNAL} OPTIONAL,
+ -- Optional only in version 3; mandatory in version 2. If
+ -- omitted (in version 3) then diagnostic must occur.
+ diagnostic [223] DiagRec OPTIONAL, -- Version 3 only.
+ otherInfo OtherInformation OPTIONAL}
+
+
+
+ ResourceControlRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ suspendedFlag [39] IMPLICIT BOOLEAN OPTIONAL,
+ resourceReport [40] ResourceReport OPTIONAL,
+ partialResultsAvailable [41] IMPLICIT INTEGER{
+ subset (1),
+ interim (2),
+ none (3)} OPTIONAL,
+ responseRequired [42] IMPLICIT BOOLEAN,
+ triggeredRequestFlag [43] IMPLICIT BOOLEAN OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+
+ ResourceControlResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ continueFlag [44] IMPLICIT BOOLEAN,
+ resultSetWanted [45] IMPLICIT BOOLEAN OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+
+
+ TriggerResourceControlRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ requestedAction [46] IMPLICIT INTEGER{
+ resourceReport (1),
+ resourceControl (2),
+ cancel (3)},
+ prefResourceReportFormat [47] IMPLICIT ResourceReportId OPTIONAL,
+ resultSetWanted [48] IMPLICIT BOOLEAN OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+
+
+ ResourceReportRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ opId [210] IMPLICIT ReferenceId OPTIONAL,
+ prefResourceReportFormat [49] IMPLICIT ResourceReportId OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--
+ ResourceReportResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ resourceReportStatus [50] IMPLICIT INTEGER{
+ success (0),
+ partial (1),
+ failure-1 (2),
+ failure-2 (3),
+ failure-3 (4),
+ failure-4 (5),
+ failure-5 (6),
+ failure-6 (7)},
+ resourceReport [51] ResourceReport OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--
+ ResourceReport ::= EXTERNAL
+ ResourceReportId ::= OBJECT IDENTIFIER
+
+--Scan APDUs
+ ScanRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ databaseNames [3] IMPLICIT SEQUENCE OF DatabaseName,
+ attributeSet AttributeSetId OPTIONAL,
+ termListAndStartPoint AttributesPlusTerm,
+ stepSize [5] IMPLICIT INTEGER OPTIONAL,
+ numberOfTermsRequested [6] IMPLICIT INTEGER,
+ preferredPositionInResponse [7] IMPLICIT INTEGER OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+ ScanResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ stepSize [3] IMPLICIT INTEGER OPTIONAL,
+ scanStatus [4] IMPLICIT INTEGER {
+ success (0),
+ partial-1 (1),
+ partial-2 (2),
+ partial-3 (3),
+ partial-4 (4),
+ partial-5 (5),
+ failure (6) },
+ numberOfEntriesReturned [5] IMPLICIT INTEGER,
+ positionOfTerm [6] IMPLICIT INTEGER OPTIONAL,
+ entries [7] IMPLICIT ListEntries OPTIONAL,
+ attributeSet [8] IMPLICIT AttributeSetId OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Scan
+ ListEntries ::= SEQUENCE{
+ entries [1] IMPLICIT SEQUENCE OF Entry OPTIONAL,
+ nonsurrogateDiagnostics [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL
+ -- At least one of entries and nonsurrogateDiagnostics must occur
+ }
+
+ Entry ::= CHOICE {
+ termInfo [1] IMPLICIT TermInfo,
+ surrogateDiagnostic [2] DiagRec}
+--
+ TermInfo ::= SEQUENCE {
+ term Term,
+ displayTerm [0] IMPLICIT InternationalString OPTIONAL,
+ -- Presence of displayTerm means that term is not considered by
+ -- the target to be suitable for display, and displayTerm should
+ -- instead be displayed. 'term' is the actual term in the term list;
+ -- 'displayTerm' is for display purposes only, and is not an actual
+ -- term in the term list.
+ suggestedAttributes AttributeList OPTIONAL,
+ alternativeTerm [4] IMPLICIT SEQUENCE OF AttributesPlusTerm OPTIONAL,
+ globalOccurrences [2] IMPLICIT INTEGER OPTIONAL,
+ byAttributes [3] IMPLICIT OccurrenceByAttributes OPTIONAL,
+ otherTermInfo OtherInformation OPTIONAL}
+
+ OccurrenceByAttributes ::= SEQUENCE OF SEQUENCE{
+ attributes [1] AttributeList,
+ occurrences CHOICE{
+ global [2] INTEGER,
+ byDatabase [3] IMPLICIT SEQUENCE OF SEQUENCE{
+ db DatabaseName,
+ num [1] IMPLICIT INTEGER OPTIONAL,
+ otherDbInfo OtherInformation OPTIONAL}} OPTIONAL,
+ otherOccurInfo OtherInformation OPTIONAL}
+-- end auxiliary definitions for Scan
+
+-- Sort APDUs
+SortRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ inputResultSetNames [3] IMPLICIT SEQUENCE OF InternationalString,
+ sortedResultSetName [4] IMPLICIT InternationalString,
+ sortSequence [5] IMPLICIT SEQUENCE OF SortKeySpec,
+ -- order of occurrence is from major to minor
+ otherInfo OtherInformation OPTIONAL}
+
+SortResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ sortStatus [3] IMPLICIT INTEGER{
+ success (0),
+ partial-1 (1),
+ failure (2)},
+ resultSetStatus [4] IMPLICIT INTEGER{
+ empty (1),
+ interim (2),
+ unchanged (3),
+ none (4)} OPTIONAL,
+ diagnostics [5] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+ resultCount [6] IMPLICIT INTEGER OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Sort
+ SortKeySpec ::= SEQUENCE{
+ sortElement SortElement,
+ sortRelation [1] IMPLICIT INTEGER{
+ ascending (0),
+ descending (1),
+ ascendingByFrequency (3),
+ descendingByfrequency (4)},
+ caseSensitivity [2] IMPLICIT INTEGER{
+ caseSensitive (0),
+ caseInsensitive (1)},
+ missingValueAction [3] CHOICE{
+ abort [1] IMPLICIT NULL,
+ null [2] IMPLICIT NULL,
+ --supply a null value for missing value
+ missingValueData [3] IMPLICIT OCTET STRING} OPTIONAL}
+
+ SortElement ::= CHOICE{
+ generic [1] SortKey,
+ datbaseSpecific [2] IMPLICIT SEQUENCE OF SEQUENCE{
+ databaseName DatabaseName,
+ dbSort SortKey}}
+
+ SortKey ::= CHOICE{
+ sortfield [0] IMPLICIT InternationalString,
+ -- An element, element-group-tag, or alias supported by the target
+ -- and denoting a set of elements associated with each record.
+ elementSpec [1] IMPLICIT Specification,
+ sortAttributes [2] IMPLICIT SEQUENCE{
+ id AttributeSetId,
+ list AttributeList}}
+-- end auxiliary definitions for sort
+
+
+
+-- Extended Service APDUs
+ ExtendedServicesRequest ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ function [3] IMPLICIT INTEGER {
+ create (1),
+ delete (2),
+ modify (3)},
+ packageType [4] IMPLICIT OBJECT IDENTIFIER,
+ packageName [5] IMPLICIT InternationalString OPTIONAL,
+ -- PackageName mandatory for 'modify' or 'delete'; optional for
+ -- 'create'. Following four parameters mandatory for 'create'; should
+ -- be included on 'modify' if being modified; not needed on 'delete'.
+ userId [6] IMPLICIT InternationalString OPTIONAL,
+ retentionTime [7] IMPLICIT IntUnit OPTIONAL,
+ permissions [8] IMPLICIT Permissions OPTIONAL,
+ description [9] IMPLICIT InternationalString OPTIONAL,
+
+-- (ExtendedServiceRequest APDU continued)
+ taskSpecificParameters [10] IMPLICIT EXTERNAL OPTIONAL,
+ -- Mandatory for 'create'; included on 'modify' if specific
+ -- parameters being modified; not necessary on 'delete'. For the
+ -- 'EXTERNAL,' use OID of specific ES definition and select
+ -- CHOICE [1]: 'esRequest'.
+ waitAction [11] IMPLICIT INTEGER{
+ wait (1),
+ waitIfPossible (2),
+ dontWait (3),
+ dontReturnPackage (4)},
+ elements ElementSetName OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+--
+
+ExtendedServicesResponse ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL,
+ operationStatus [3] IMPLICIT INTEGER{
+ done (1),
+ accepted (2),
+ failure (3)},
+ diagnostics [4] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+ taskPackage [5] IMPLICIT EXTERNAL OPTIONAL,
+ -- Use OID: {Z39-50-recordSyntax (106)} and corresponding
+ -- syntax. For the EXTERNAL, 'taskSpecific,' within that
+ -- definition, use OID of the specific es, and choose [2],
+ -- 'taskPackage'.
+ otherInfo OtherInformation OPTIONAL}
+
+ Permissions ::= SEQUENCE OF SEQUENCE{
+ userId [1] IMPLICIT InternationalString,
+ allowableFunctions [2] IMPLICIT SEQUENCE OF INTEGER{
+ delete (1),
+ modifyContents (2),
+ modifyPermissions (3),
+ present (4),
+ invoke (5)}}
+
+Close ::= SEQUENCE{
+ referenceId ReferenceId OPTIONAL, -- See 3.2.11.1.5.
+ closeReason CloseReason,
+ diagnosticInformation [3] IMPLICIT InternationalString OPTIONAL,
+ resourceReportFormat [4] IMPLICIT ResourceReportId OPTIONAL,
+ -- For use by origin only, and only on Close request;
+ -- origin requests target to include report in response.
+ resourceReport [5] ResourceReport OPTIONAL,
+ -- For use by target only, unilaterally on Close request;
+ -- on Close response may be unilateral or in response
+ -- to origin request.
+ otherInfo OtherInformation OPTIONAL}
+
+ CloseReason ::= [211] IMPLICIT INTEGER{
+ finished (0),
+ shutdown (1),
+ systemProblem (2),
+ costLimit (3),
+ resources (4),
+ securityViolation (5),
+ protocolError (6),
+ lackOfActivity (7),
+ peerAbort (8),
+ unspecified (9)}
+
+--Duplicate detection APDUs
+DuplicateDetectionRequest ::= SEQUENCE {
+ referenceId ReferenceId OPTIONAL,
+ inputResultSetIds [3] IMPLICIT SEQUENCE OF InternationalString,
+ outputResultSetName [4] IMPLICIT InternationalString,
+ applicablePortionOfRecord [5] IMPLICIT EXTERNAL OPTIONAL,
+ duplicateDetectionCriteria [6] IMPLICIT SEQUENCE OF
+ DuplicateDetectionCriterion OPTIONAL,
+ clustering [7] IMPLICIT BOOLEAN OPTIONAL,
+ -- 'true' means "clustered".
+ -- This parameter may be omitted
+ -- only if retentionCriteria CHOICE is
+ -- 'numberOfEntries' and its value is 1.
+ retentionCriteria [8] IMPLICIT SEQUENCE OF
+ RetentionCriterion,
+ sortCriteria [9] IMPLICIT SEQUENCE OF
+ SortCriterion OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+DuplicateDetectionCriterion ::= CHOICE{
+ levelOfMatch [1] IMPLICIT INTEGER,
+ -- a percentage; 1-100.
+ caseSensitive [2] IMPLICIT NULL,
+ punctuationSensitive [3] IMPLICIT NULL,
+ regularExpression [4] IMPLICIT EXTERNAL,
+ rsDuplicates [5] IMPLICIT NULL
+ -- values 6-100 reserved for future assignment.
+ }
+
+RetentionCriterion ::= CHOICE{
+ numberOfEntries [1] IMPLICIT INTEGER,
+ -- greater than 0
+ percentOfEntries [2] IMPLICIT INTEGER,
+ -- 1-100,
+ duplicatesOnly [3] IMPLICIT NULL,
+ -- should not be chosen
+ -- if clustering is 'true'
+ discardRsDuplicates [4] IMPLICIT NULL
+ -- values 5-100 reserved for future assignment.
+ }
+
+SortCriterion ::= CHOICE{
+ mostComprehensive [1] IMPLICIT NULL,
+ leastConmprehensive [2] IMPLICIT NULL,
+ mostRecent [3] IMPLICIT NULL,
+ oldest [4] IMPLICIT NULL,
+ leastCost [5] IMPLICIT NULL,
+ preferredDatabases [6] IMPLICIT
+ SEQUENCE OF InternationalString
+ -- values 7-100 reserved for future assignment.
+}
+
+DuplicateDetectionResponse ::= SEQUENCE {
+ referenceId ReferenceId OPTIONAL,
+ status [3] IMPLICIT INTEGER{
+ success (0),
+ failure (1)},
+ resultSetCount [4] IMPLICIT INTEGER OPTIONAL,
+ diagnostics [5] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+-- Global auxiliary definitions
+ ReferenceId ::= [2] IMPLICIT OCTET STRING
+ ResultSetId ::= [31] IMPLICIT InternationalString
+ ElementSetName ::= [103] IMPLICIT InternationalString
+ DatabaseName ::= [105] IMPLICIT InternationalString
+ AttributeSetId ::= OBJECT IDENTIFIER
+
+
+-- OtherInformation
+ OtherInformation ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
+ category [1] IMPLICIT InfoCategory OPTIONAL,
+ information CHOICE{
+ characterInfo [2] IMPLICIT InternationalString,
+ binaryInfo [3] IMPLICIT OCTET STRING,
+ externallyDefinedInfo [4] IMPLICIT EXTERNAL,
+ oid [5] IMPLICIT OBJECT IDENTIFIER}}
+--
+ InfoCategory ::= SEQUENCE{
+ categoryTypeId [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ categoryValue [2] IMPLICIT INTEGER}
+
+
+-- Units
+ -- IntUnit is used when value and unit are supplied together. Unit, alone, is used when just
+ -- specifying a unit (without a value). For example, IntUnit is used in Term, in an RPNQuery, or
+ -- it can be the datatype of an element within a retrieval record. Unit (alone) would be used in an
+ -- element request, when requesting data be returned according to a particular unit.
+
+ IntUnit ::= SEQUENCE{
+ value [1] IMPLICIT INTEGER,
+ unitUsed [2] IMPLICIT Unit}
+--
+ Unit ::= SEQUENCE{
+ unitSystem [1] InternationalString OPTIONAL, -- e.g. 'SI'
+ unitType [2] StringOrNumeric OPTIONAL, -- e.g. 'mass'
+ unit [3] StringOrNumeric OPTIONAL, -- e.g. 'kilograms'
+ scaleFactor [4] IMPLICIT INTEGER OPTIONAL -- e.g. 9 means 10**9
+ }
+
+--CharacterString
+ InternationalString ::= GeneralString
+ -- When version 2 is in force, this collapses to VisibleString. That is, only characters in the
+ -- visibleString repertoire may be used. (Datatype compatibility with version 2 is not affected,
+ -- because references are IMPLICIT.) When version 3 is in force, the semantics of the
+ -- GeneralString content may be altered by negotiation during initialization. If no such
+ -- negotiation is in effect, then GeneralString semantics are in force.
+
+StringOrNumeric ::= CHOICE{
+ string [1] IMPLICIT InternationalString,
+ numeric [2] IMPLICIT INTEGER}
+
+END -- IR DEFINITIONS
+
+
+
+DiagnosticFormatDiag1
+{Z39-50-diagnosticFormat diag-1 (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Term, Specification, AttributeList, SortElement, DatabaseName,
+DefaultDiagFormat, InternationalString FROM Z39-50-APDU-1995;
+
+
+DiagnosticFormat ::= SEQUENCE OF SEQUENCE{
+ diagnostic [1] CHOICE{
+ defaultDiagRec [1] IMPLICIT DefaultDiagFormat,
+ explicitDiagnostic [2] DiagFormat} OPTIONAL,
+ message [2] IMPLICIT InternationalString OPTIONAL}
+
+
+DiagFormat ::= CHOICE{
+
+tooMany [1000] IMPLICIT SEQUENCE{
+ tooManyWhat [1] IMPLICIT INTEGER{
+ argumentWords (1),
+ truncatedWords (2),
+ booleanOperators (3),
+ incompleteSubfields (4),
+ characters (5),
+ recordsRetrieved (6),
+ dataBasesSpecified (7),
+ resultSetsCreated (8),
+ indexTermsProcessed (9)},
+ max [2] IMPLICIT INTEGER OPTIONAL},
+
+
+
+
+
+
+
+badSpec [1001] IMPLICIT SEQUENCE{ -- element set name or specification
+ spec [1] IMPLICIT Specification, -- esn or element spec not supported
+ db [2] IMPLICIT DatabaseName OPTIONAL,
+ -- if db specified, above spec not supported for db; otherwise,
+ -- spec not supported period.
+ goodOnes [3] IMPLICIT SEQUENCE OF Specification OPTIONAL
+ -- target supplies ones that are supported
+ },
+
+
+dbUnavail [1002] IMPLICIT SEQUENCE{ -- database unavailable
+ db [1] IMPLICIT DatabaseName,
+ why [2] IMPLICIT SEQUENCE{
+ reasonCode [1] IMPLICIT INTEGER{
+ doesNotExist (0),
+ existsButUnavail (1),
+ locked (2),
+ accessDenied (3)} OPTIONAL,
+ message [2] IMPLICIT InternationalString OPTIONAL}},
+
+
+unSupOp [1003] IMPLICIT INTEGER{ -- unsupported operator
+ and (0),
+ or (1),
+ and-not (2),
+ prox (3)},
+
+
+attribute [1004] IMPLICIT SEQUENCE{
+ -- Applies for unsupported attribute set, attribute type,
+ -- attribute value, or term (for a given attribute type or value).
+
+ id [1] IMPLICIT OBJECT IDENTIFIER,
+ -- if only "id" occurs, then attribute set is not supported
+ type [2] IMPLICIT INTEGER OPTIONAL,
+ -- must occur if value occurs.
+ value [3] IMPLICIT INTEGER OPTIONAL,
+ -- if omitted, and Type occurs, then Type is what is unsupported
+ term [4] Term OPTIONAL
+ -- If occurs, term is illegal or not supported, for attribute value,
+ -- if value occurs; otherwise, for type.
+ },
+
+
+attCombo [1005] IMPLICIT SEQUENCE{ -- attribute combination not supported
+ unsupportedCombination [1] IMPLICIT AttributeList,
+ recommendedAlternatives [2] IMPLICIT SEQUENCE OF AttributeList OPTIONAL},
+
+
+
+
+term [1006] IMPLICIT SEQUENCE{
+ problem [1] IMPLICIT INTEGER{
+ codedValue (1),
+ unparsable (2),
+ tooShort (3),
+ type (4)} OPTIONAL,
+ term [2] Term},
+
+
+proximity [1007] CHOICE{ -- proximity diagnostics:
+ resultSets [1] IMPLICIT NULL, -- proximity between sets not supported
+ badSet [2] IMPLICIT InternationalString, -- bad result set specified
+ relation [3] IMPLICIT INTEGER, -- 1 to 6 ; relation not supported
+ unit [4] IMPLICIT INTEGER, -- unsupported unit code
+ distance [5] IMPLICIT INTEGER, -- unsupported distance
+ attributes [6] AttributeList, -- proximity not supported with specified
+ -- attribute combination
+ ordered [7] IMPLICIT NULL, -- ordered flag not supported
+ exclusion [8] IMPLICIT NULL -- exclusion flag not supported
+ },
+
+
+
+
+
+scan [1008] CHOICE{ -- scan diagnostics:
+ nonZeroStepSize [0] IMPLICIT NULL, -- only zero step size supported
+ specifiedStepSize [1] IMPLICIT NULL, -- specified step size not supported
+ termList1 [3] IMPLICIT NULL, -- term list not supported (no alternative supplied)
+ termList2 [4] IMPLICIT SEQUENCE OF AttributeList,
+ -- term list not supported (alternatives supplied)
+ posInResponse [5] IMPLICIT INTEGER{ --value of positionInResponse not supported
+ mustBeOne (1),
+ mustBePositive (2),
+ mustBeNonNegative (3),
+ other (4)},
+ resources [6] IMPLICIT NULL, -- resources exhausted looking for satisfying terms
+ endOfList [7] IMPLICIT NULL -- beginning or end of term list
+ },
+
+
+sort [1009] CHOICE{
+ sequence [0] IMPLICIT NULL, -- cannot sort according to sequence
+ noRsName [1] IMPLICIT NULL, -- no result set name supplied
+ tooMany [2] IMPLICIT INTEGER, -- Too many input result sets,
+ -- maximum supplied.
+ incompatible [3] IMPLICIT NULL, -- records with different formats
+ -- not compatible for sorting
+ generic [4] IMPLICIT NULL, -- generic sort not supported
+ -- (db specific only)
+ dbSpecific [5] IMPLICIT NULL, -- db specific sort not supported
+ sortElement [6] SortElement,
+ key [7] IMPLICIT INTEGER{
+ tooMany (1), -- too many sort keys
+ duplicate (2)}, -- duplicate sort keys
+ action [8] IMPLICIT NULL, -- unsupported missing data action
+ illegal [9] IMPLICIT INTEGER{
+ relation (1), -- illegal sort relation
+ case (2), -- illegal case value
+ action (3), -- illegal missing data action
+ sort (4)}, -- illegal sort
+ inputTooLarge [10] IMPLICIT SEQUENCE OF InternationalString,
+ -- one or more of the input result sets too large to sort
+ aggregateTooLarge [11] IMPLICIT NULL -- aggregate result set too large
+ },
+
+segmentation [1010] CHOICE{
+ segmentCount [0] IMPLICIT NULL,
+ -- Cannot guarantee record will fit within max segments. Target
+ -- suggests that origin try again to retrieve record, without
+ -- including max-segment-count.
+ segmentSize [1] IMPLICIT INTEGER
+ -- record cannot be segmented into fragments such that the largest
+ -- will fit within max segment size specified. Target supplies (in
+ -- bytes) the smallest acceptable value of Max-segment-size to
+ -- retrieve the record.
+ },
+
+
+extServices [1011] CHOICE{
+ req [1] IMPLICIT INTEGER{ -- bad request
+ nameInUse (1), -- package name already in use
+ noSuchName (2), -- no such package, on modify/delete
+ quota (3), -- quota exceeded
+ type (4)}, -- extended service type not supported
+ permission [2] IMPLICIT INTEGER{ -- permission denied on ES, because:
+ id (1), -- id not authorized, or
+ modifyDelete (2)}, -- cannot modify or delete
+ immediate [3] IMPLICIT INTEGER{ -- immediate execution:
+ failed (1), -- failed,
+ service (2), -- not supported for this service, or
+ parameters (3) -- for these parameters.
+ }},
+
+
+accessCtrl [1012] CHOICE{
+ noUser [1] IMPLICIT NULL, -- no user to display challenge to
+ refused [2] IMPLICIT NULL, -- access control information refused by user
+ simple [3] IMPLICIT NULL, -- only simple form supported (target used
+ -- externally defined)
+ oid [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+ -- oid not supported (origin supplies alternative
+ -- suggested oids)
+ alternative [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+ -- origin insists that target use an alternative
+ -- challenge for this data (e.g. stronger
+
+ -- authentication or stronger Access control). The
+ -- origin supplies suggested alternative oids.
+ pwdInv [6] IMPLICIT NULL, -- password invalid
+ pwdExp [7] IMPLICIT NULL -- password expired
+ },
+
+
+recordSyntax [1013] IMPLICIT SEQUENCE{ -- record cannot be transferred in requested syntax
+ unsupportedSyntax [1] IMPLICIT OBJECT IDENTIFIER,
+ suggestedAlternatives [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+}
+
+END
+
+
+
+
+
+RecordSyntax-explain
+{Z39-50-recordSyntax explain (100)} DEFINITIONS ::=
+
+BEGIN
+IMPORTS AttributeSetId, Term, OtherInformation, DatabaseName, ElementSetName, IntUnit, Unit,
+ StringOrNumeric, Specification, InternationalString, AttributeList, AttributeElement FROM Z39-50-APDU-1995;
+EXPORTS LanguageCode;
+
+Explain-Record ::= CHOICE{
+ -- Each of these may be used as search term when Use attribute is 'explain-category'.
+ targetInfo [0] IMPLICIT TargetInfo,
+ databaseInfo [1] IMPLICIT DatabaseInfo,
+ schemaInfo [2] IMPLICIT SchemaInfo,
+ tagSetInfo [3] IMPLICIT TagSetInfo,
+ recordSyntaxInfo [4] IMPLICIT RecordSyntaxInfo,
+ attributeSetInfo [5] IMPLICIT AttributeSetInfo,
+ termListInfo [6] IMPLICIT TermListInfo,
+ extendedServicesInfo [7] IMPLICIT ExtendedServicesInfo,
+ attributeDetails [8] IMPLICIT AttributeDetails,
+ termListDetails [9] IMPLICIT TermListDetails,
+ elementSetDetails [10] IMPLICIT ElementSetDetails,
+ retrievalRecordDetails [11] IMPLICIT RetrievalRecordDetails,
+ sortDetails [12] IMPLICIT SortDetails,
+ processing [13] IMPLICIT ProcessingInformation,
+ variants [14] IMPLICIT VariantSetInfo,
+ units [15] IMPLICIT UnitInfo,
+ categoryList [100] IMPLICIT CategoryList}
+
+-- Element set name 'B' (brief) retrieves:
+-- - 'commonInfo' (except for otherInfo within commonInfo)
+-- - key elements
+-- - other elements designated as 'non-key brief elements'
+-- Esn 'description' retrieves brief elements as well as 'description', and specific additional descriptive
+-- elements if designated.
+-- Element set name 'F' (full) retrieves all of the above, as well as those designated as "non-brief elements". Some
+-- elements designated as OPTIONAL may be mandatory in full records, and are so identified. (Note that all elements
+-- that are not part of the brief element set must be designated as OPTIONAL in the ASN.1, otherwise it would be
+-- illegal to omit them.)
+-- Other esns are defined (below) as needed.
+
+-- - - - - - - - - - - - - Info Records
+ -- Info records are mainly for software consumption
+ -- They describe individual entities within the target system:
+ -- The target itself
+ -- Individual databases
+ -- Schemas
+ -- Tag sets
+ -- Record syntaxes
+ -- Attribute sets
+ -- Term lists
+ -- Extended services
+ -- The information about each Schema, Tag Set, Record Syntax and Attribute Set should
+ -- match the universal definitions of these items. The only exception is that a target may omit any
+ -- items it doesn't support, for example the description of the bib-1 attribute set may omit attributes
+ -- that the target does not support under any circumstances.
+ -- Databases that may be searched together can be listed in the dbCominations element of the TargetInfo record.
+TargetInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ name [1] IMPLICIT InternationalString,
+ -- Non-key brief elements follow:
+ recent-news [2] IMPLICIT HumanString OPTIONAL,
+ icon [3] IMPLICIT IconObject OPTIONAL,
+ namedResultSets [4] IMPLICIT BOOLEAN,
+ multipleDBsearch [5] IMPLICIT BOOLEAN,
+ maxResultSets [6] IMPLICIT INTEGER OPTIONAL,
+ maxResultSize [7] IMPLICIT INTEGER OPTIONAL,
+ maxTerms [8] IMPLICIT INTEGER OPTIONAL,
+ timeoutInterval [9] IMPLICIT IntUnit OPTIONAL,
+ welcomeMessage [10] IMPLICIT HumanString OPTIONAL,
+ -- non-brief elements follow:
+ -- 'description' esn retrieves the following two (as well as brief):
+ contactInfo [11] IMPLICIT ContactInfo OPTIONAL,
+ description [12] IMPLICIT HumanString OPTIONAL,
+ nicknames [13] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ usage-restrictions [14] IMPLICIT HumanString OPTIONAL,
+ paymentAddr [15] IMPLICIT HumanString OPTIONAL,
+ hours [16] IMPLICIT HumanString OPTIONAL,
+ dbCombinations [17] IMPLICIT SEQUENCE OF DatabaseList OPTIONAL,
+ addresses [18] IMPLICIT SEQUENCE OF NetworkAddress OPTIONAL,
+ languages [101] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ -- Languages supported for message strings. Each is a three-character
+ -- language code from Z39.53-1994.
+-- characterSets [102] this tag reserved for "character sets supported for name and message strings".
+ -- commonAccessInfo elements list objects the target supports. All objects listed in
+ -- AccessInfo for any individual database should also be listed here.
+ commonAccessInfo [19] IMPLICIT AccessInfo OPTIONAL}
+
+
+DatabaseInfo ::= SEQUENCE {
+ -- A target may provide "virtual databases" that are combinations of individual database. These
+ -- databases are indicated by the presence of subDbs in the combination database's DatabaseDescription.
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ name [1] IMPLICIT DatabaseName,
+ -- Non-key brief elements follow:
+ explainDatabase [2] IMPLICIT NULL OPTIONAL,
+ -- If present, this database is the Explain database, or an Explain database
+ -- for a different server, possibly on a different host. The means by which
+ -- that server may be accessed is not addressed by this standard. One
+ -- suggested possibility is an implementor agreement whereby the
+ -- database name is a url which may be used to connect to the server.
+ nicknames [3] IMPLICIT SEQUENCE OF DatabaseName OPTIONAL,
+ icon [4] IMPLICIT IconObject OPTIONAL,
+ user-fee [5] IMPLICIT BOOLEAN,
+ available [6] IMPLICIT BOOLEAN,
+ titleString [7] IMPLICIT HumanString OPTIONAL,
+ -- Non-brief elements follow:
+ keywords [8] IMPLICIT SEQUENCE OF HumanString OPTIONAL,
+ description [9] IMPLICIT HumanString OPTIONAL,
+ associatedDbs [10] IMPLICIT DatabaseList OPTIONAL,
+ -- databases that may be searched in combination with this one
+
+ subDbs [11] IMPLICIT DatabaseList OPTIONAL,
+ -- When present, this database is a composite representing the combined
+ -- databases 'subDbs'. The individual subDbs are also available.
+ disclaimers [12] IMPLICIT HumanString OPTIONAL,
+ news [13] IMPLICIT HumanString OPTIONAL,
+ recordCount [14] CHOICE {
+ actualNumber [0] IMPLICIT INTEGER,
+ approxNumber [1] IMPLICIT INTEGER} OPTIONAL,
+ defaultOrder [15] IMPLICIT HumanString OPTIONAL,
+ avRecordSize [16] IMPLICIT INTEGER OPTIONAL,
+ maxRecordSize [17] IMPLICIT INTEGER OPTIONAL,
+ hours [18] IMPLICIT HumanString OPTIONAL,
+ bestTime [19] IMPLICIT HumanString OPTIONAL,
+ lastUpdate [20] IMPLICIT GeneralizedTime OPTIONAL,
+ updateInterval [21] IMPLICIT IntUnit OPTIONAL,
+ coverage [22] IMPLICIT HumanString OPTIONAL,
+ proprietary [23] IMPLICIT BOOLEAN OPTIONAL, -- mandatory in full record
+ copyrightText [24] IMPLICIT HumanString OPTIONAL,
+ copyrightNotice [25] IMPLICIT HumanString OPTIONAL,
+ producerContactInfo [26] IMPLICIT ContactInfo OPTIONAL,
+ supplierContactInfo [27] IMPLICIT ContactInfo OPTIONAL,
+ submissionContactInfo [28] IMPLICIT ContactInfo OPTIONAL,
+ -- accessInfo lists items connected with the database. All listed items should be in the target's AccessInfo.
+ accessInfo [29] IMPLICIT AccessInfo OPTIONAL}
+
+
+SchemaInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ schema [1] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-key brief elements follow:
+ name [2] IMPLICIT InternationalString,
+ -- Non-brief elements follow:
+ description [3] IMPLICIT HumanString OPTIONAL,
+ tagTypeMapping [4] IMPLICIT SEQUENCE OF SEQUENCE {
+ tagType [0] IMPLICIT INTEGER,
+ tagSet [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ -- If tagSet is omitted, then this tagType is for a tagSet locally defined
+ -- within the schema that cannot be referenced by another schema.
+ defaultTagType [2] IMPLICIT NULL OPTIONAL
+ } OPTIONAL,
+ recordStructure [5] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL}
+
+
+ -- ElementInfo referenced in SchemaInfo and RecordSyntaxInfo
+ ElementInfo ::= SEQUENCE {
+ elementName [1] IMPLICIT InternationalString,
+ elementTagPath [2] IMPLICIT Path,
+ dataType [3] ElementDataType OPTIONAL, -- If omitted, not specified.
+ required [4] IMPLICIT BOOLEAN,
+ repeatable [5] IMPLICIT BOOLEAN,
+ description [6] IMPLICIT HumanString OPTIONAL}
+
+
+ -- Path is referenced by ElementInfo as well as PerElementDetails
+ Path ::= SEQUENCE OF SEQUENCE{
+ tagType [1] IMPLICIT INTEGER,
+ tagValue [2] StringOrNumeric}
+ ElementDataType ::= CHOICE{
+ primitive [0] IMPLICIT PrimitiveDataType,
+ structured [1] IMPLICIT SEQUENCE OF ElementInfo}
+ PrimitiveDataType ::= INTEGER{
+ octetString (0),
+ numeric (1),
+ date (2),
+ external (3),
+ string (4),
+ trueOrFalse (5),
+ oid (6),
+ intUnit (7),
+ empty (8),
+ noneOfTheAbove (100) -- see 'description'
+ }
+
+
+TagSetInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ tagSet [1] IMPLICIT OBJECT IDENTIFIER,
+ -- non-key brief elements follow:
+ name [2] IMPLICIT InternationalString,
+ -- non-brief elements follow:
+ description [3] IMPLICIT HumanString OPTIONAL,
+ elements [4] IMPLICIT SEQUENCE OF SEQUENCE {
+ elementname [1] IMPLICIT InternationalString,
+ nicknames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ elementTag [3] StringOrNumeric,
+ description [4] IMPLICIT HumanString OPTIONAL,
+ dataType [5] PrimitiveDataType OPTIONAL,
+ -- If the data type is expected to be structured, that is described in the schema info,
+ -- and datatype is omitted here.
+ otherTagInfo OtherInformation OPTIONAL} OPTIONAL}
+
+RecordSyntaxInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ recordSyntax [1] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-key brief elements follow:
+ name [2] IMPLICIT InternationalString,
+ -- non-brief elements follow:
+ transferSyntaxes [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ description [4] IMPLICIT HumanString OPTIONAL,
+ asn1Module [5] IMPLICIT InternationalString OPTIONAL,
+ abstractStructure [6] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL
+ -- Omitting abstractStructure only means target isn't using
+ -- Explain to describe the structure, not that there is no structure.
+ }
+
+AttributeSetInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ attributeSet [1] IMPLICIT AttributeSetId,
+ -- non-key brief elements follow:
+ name [2] IMPLICIT InternationalString,
+ -- non-brief elements follow:
+ attributes [3] IMPLICIT SEQUENCE OF AttributeType OPTIONAL,
+ -- mandatory in full record
+ description [4] IMPLICIT HumanString OPTIONAL}
+-- AttributeType referenced in AttributeSetInfo
+ AttributeType ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ attributeType [2] IMPLICIT INTEGER,
+ attributeValues [3] IMPLICIT SEQUENCE OF AttributeDescription}
+ AttributeDescription ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ attributeValue [2] StringOrNumeric,
+ equivalentAttributes [3] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL
+ -- each is an occurrence of 'attributeValue' from AttributeDescription for a
+ -- different attribute. Equivalences listed here should be derived from the
+ -- attribute set definition, not from a particular server's behavior.
+ }
+
+
+TermListInfo ::= SEQUENCE{
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ -- Non-key brief elements follow:
+ termLists [2] IMPLICIT SEQUENCE OF SEQUENCE{
+ name [1] IMPLICIT InternationalString,
+ title [2] IMPLICIT HumanString OPTIONAL,
+ -- Title is for users to see and can differ by language. Name, on the
+ -- other hand is typically a short string not necessarily meant to be
+ -- human-readable, and not variable by language.
+ searchCost [3] IMPLICIT INTEGER {
+ optimized (0), -- The attribute (or combination) associated
+ -- with this list will do fast searches.
+ normal (1), -- The attribute (combination) will work as
+ -- expected. So there's probably an index for the
+ -- attribute (combination) or some similar
+ -- mechanism.
+ expensive (2), -- Can use the attribute (combination), but it
+ -- might not provide satisfactory results.
+ -- Probably there is no index, or post-
+ -- processing of records is required.
+ filter (3) -- can't search with this attribute (combination) alone.
+ } OPTIONAL,
+ scanable [4] IMPLICIT BOOLEAN, -- 'true' means this list can be scanned.
+ broader [5] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ narrower [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL
+ -- broader and narrower list alternative term lists related to this one.
+ -- The term lists so listed should also be in this termLists structure.
+ }
+ -- no non-brief elements
+ }
+
+
+ExtendedServicesInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ type [1] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-key brief elements follow:
+ name [2] IMPLICIT InternationalString OPTIONAL,
+ -- should be supplied if privateType is 'true'
+ privateType [3] IMPLICIT BOOLEAN,
+ restrictionsApply [5] IMPLICIT BOOLEAN, -- if 'true' see 'description'
+ feeApply [6] IMPLICIT BOOLEAN, -- if 'true' see 'description'
+ available [7] IMPLICIT BOOLEAN,
+ retentionSupported [8] IMPLICIT BOOLEAN,
+ waitAction [9] IMPLICIT INTEGER{
+ waitSupported (1),
+ waitAlways (2),
+ waitNotSupported (3),
+ depends (4),
+ notSaying (5)},
+ -- non-brief elements follow:
+ -- To get brief plus 'description' use esn 'description'
+ description [10] IMPLICIT HumanString OPTIONAL,
+ -- to get above elements and 'specificExplain' use esn 'specificExplain'
+ specificExplain [11] IMPLICIT EXTERNAL OPTIONAL,
+ -- Use oid of specific ES, and select choice [3] 'explain'. Format
+ -- to be developed in conjunction with the specific ES definition.
+ -- to get all elements except 'specificExplain', use esn 'asn'
+ esASN [12] IMPLICIT InternationalString OPTIONAL -- the ASN.1 for this ES
+ }
+
+-- - - - - - - - - - - - - Detail records
+ -- The detail records describe relationships among entities supported by the target. RetrievalRecordDetails describes
+ -- the way that schema elements are mapped into record elements. This mapping may be different for each
+ -- combination of database, schema, record syntax. The per-element details describe the default mapping.
+ -- Origin-request re-tagging can change that mapping. When multiple databases are listed in a databaseNames
+ -- element, the record applies equally to all of the listed databases. This is unrelated to searching the databases
+ -- together. AttributeDetails describes how databases can be searched. Each supported attribute is listed, and the
+ -- allowable combinations can be described.
+
+
+AttributeDetails ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ -- Non-brief elements follow:
+ attributesBySet [2] IMPLICIT SEQUENCE OF AttributeSetDetails OPTIONAL,
+ -- mandatory in full record
+ attributeCombinations [3] IMPLICIT AttributeCombinations OPTIONAL}
+
+
+
+
+-- AttributeSetDetails referenced by AttributeDetails
+ AttributeSetDetails ::= SEQUENCE {
+ attributeSet [0] IMPLICIT AttributeSetId,
+ attributesByType [1] IMPLICIT SEQUENCE OF AttributeTypeDetails }
+ AttributeTypeDetails ::= SEQUENCE {
+ attributeType [0] IMPLICIT INTEGER,
+ defaultIfOmitted [1] IMPLICIT OmittedAttributeInterpretation OPTIONAL,
+ attributeValues [2] IMPLICIT SEQUENCE OF AttributeValue OPTIONAL }
+ -- If no attributeValues are supplied, all values of this type are fully
+ -- supported, and the descriptions in AttributeSetInfo are adequate.
+
+ OmittedAttributeInterpretation ::= SEQUENCE {
+ defaultValue [0] StringOrNumeric OPTIONAL,
+ -- A default value is listed if that's how the server works
+ defaultDescription [1] IMPLICIT HumanString OPTIONAL }
+ -- The human-readable description should generally be provided.
+ -- It is legal for both default elements to be missing, which
+ -- means that the target will allow the attribute type to be
+ -- omitted, but isn't saying what it will do.
+
+ AttributeValue ::= SEQUENCE {
+ value [0] StringOrNumeric,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ subAttributes [2] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+ superAttributes [3] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+ partialSupport [4] IMPLICIT NULL OPTIONAL }
+ -- partialSupport indicates that an attributeValue is accepted, but may not be processed in the
+ -- "expected" way. One important reason for this is composite databases: in this case partialSupport
+ -- may indicate that only some of the subDbs support the attribute, and others ignore it.
+
+
+
+TermListDetails ::= SEQUENCE{ -- one for each termList in TermListInfo
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ termListName [1] IMPLICIT InternationalString,
+ -- Non-key elements (all non-brief) follow:
+ description [2] IMPLICIT HumanString OPTIONAL,
+ attributes [3] IMPLICIT AttributeCombinations OPTIONAL,
+ -- Pattern for attributes that hit this list. Mandatory in full record
+ scanInfo [4] IMPLICIT SEQUENCE {
+ maxStepSize [0] IMPLICIT INTEGER OPTIONAL,
+ collatingSequence [1] IMPLICIT HumanString OPTIONAL,
+ increasing [2] IMPLICIT BOOLEAN OPTIONAL} OPTIONAL,
+ -- Occurs only if list is scanable. If list is scanable and if scanInfo is omitted,
+ -- target doesn't consider these important.
+ estNumberTerms [5] IMPLICIT INTEGER OPTIONAL,
+ sampleTerms [6] IMPLICIT SEQUENCE OF Term OPTIONAL}
+
+
+
+ElementSetDetails ::= SEQUENCE {
+ -- ElementSetDetails describes the way that database records are mapped to record elements. This
+ -- mapping may be different for each combination of database name and element set. The database record
+ -- description is a schema, which may be private to the target. The schema's abstract record structure
+ -- and tag sets provide the vocabulary for discussing record content; their presence in the Explain
+ -- database does not imply support for complex retrieval specification.
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ elementSetName [2] IMPLICIT ElementSetName,
+ recordSyntax [3] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-key Brief elements follow:
+ schema [4] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-brief elements follow:
+ description [5] IMPLICIT HumanString OPTIONAL,
+ detailsPerElement [6] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL -- mandatory in full record
+ }
+
+
+RetrievalRecordDetails ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ schema [2] IMPLICIT OBJECT IDENTIFIER,
+ recordSyntax [3] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-brief elements follow:
+ description [4] IMPLICIT HumanString OPTIONAL,
+ detailsPerElement [5] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL
+ -- mandatory in full record
+ }
+
+-- PerElementDetails is referenced in RetrievalRecordDetails and ElementSetDetails.
+ PerElementDetails ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ -- If the name is omitted, the record syntax's name for this element
+ -- is appropriate.
+ recordTag [1] IMPLICIT RecordTag OPTIONAL,
+ -- The record tag may be omitted if tags are inappropriate for the record
+ -- syntax, or if the origin can be expected to know it for some other reason.
+ schemaTags [2] IMPLICIT SEQUENCE OF Path OPTIONAL,
+ -- The information from the listed schema elements is combined
+ -- in some way to produce the data sent in the listed record tag. The
+ -- 'contents' element below may describe the logic used.
+ maxSize [3] IMPLICIT INTEGER OPTIONAL,
+ minSize [4] IMPLICIT INTEGER OPTIONAL,
+ avgSize [5] IMPLICIT INTEGER OPTIONAL,
+ fixedSize [6] IMPLICIT INTEGER OPTIONAL,
+ repeatable [8] IMPLICIT BOOLEAN,
+ required [9] IMPLICIT BOOLEAN,
+ -- 'required' really means that target will always supply the element.
+ description [12] IMPLICIT HumanString OPTIONAL,
+ contents [13] IMPLICIT HumanString OPTIONAL,
+ billingInfo [14] IMPLICIT HumanString OPTIONAL,
+ restrictions [15] IMPLICIT HumanString OPTIONAL,
+ alternateNames [16] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ genericNames [17] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ searchAccess [18] IMPLICIT AttributeCombinations OPTIONAL }
+ -- RecordTag referenced in PerElementDetails above
+ RecordTag ::= SEQUENCE {
+ qualifier [0] StringOrNumeric OPTIONAL,
+ -- E.g. tag set for GRS-1
+ tagValue [1] StringOrNumeric}
+
+SortDetails ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ -- No non-key brief elements
+ -- Non-brief elements follow:
+ sortKeys [2] IMPLICIT SEQUENCE OF SortKeyDetails OPTIONAL
+ -- mandatory in full record
+ }
+ SortKeyDetails ::= SEQUENCE {
+ description [0] IMPLICIT HumanString OPTIONAL,
+ elementSpecifications [1] IMPLICIT SEQUENCE OF Specification OPTIONAL,
+ -- each specification is a way of specifying this same sort key
+ attributeSpecifications [2] IMPLICIT AttributeCombinations OPTIONAL,
+ -- each combination is a way of specifying this same sort key
+ sortType [3] CHOICE {
+ character [0] IMPLICIT NULL,
+ numeric [1] IMPLICIT NULL,
+ structured [2] IMPLICIT HumanString} OPTIONAL,
+ caseSensitivity [4] IMPLICIT INTEGER {
+ always (0), -- always case-sensitive
+ never (1), -- never case-sensitive
+ default-yes (2), -- case-sensitivity is as specified on request, and if not
+ -- specified, case-sensitive.
+ default-no (3)} -- case-sensitivity is as specified on request, and if not
+ -- specified, not case-sensitive.
+ OPTIONAL}
+
+ProcessingInformation ::= SEQUENCE{
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ databaseName [1] IMPLICIT DatabaseName,
+ processingContext [2] IMPLICIT INTEGER {
+ access (0), -- e.g. choosing databases
+ search (1), -- e.g. "search strategies" or search forms
+ retrieval (2), -- e.g. recommended element combinations
+ record-presentation (3), -- display of retrieved records
+ record-handling (4) -- handling (e.g. saving) of retrieved records
+ },
+ name [3] IMPLICIT InternationalString,
+ oid [4] IMPLICIT OBJECT IDENTIFIER,
+ -- No non-key brief elements
+ -- Non-brief elements follow:
+ description [5] IMPLICIT HumanString OPTIONAL,
+ -- use element set name 'description' to retrieve all except instructions.
+ instructions [6] IMPLICIT EXTERNAL OPTIONAL -- mandatory in full record
+ }
+
+
+VariantSetInfo ::= SEQUENCE {
+ -- A record in this category describes a variant set definition, i.e., classes, types, and values, for a specific
+ -- variant set definition supported by the target. Support by the target of a particular variant set definition
+ -- does not imply that the definition is supported for any specific database or element.
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ variantSet [1] IMPLICIT OBJECT IDENTIFIER,
+ -- Non-key brief elements follow:
+ name [2] IMPLICIT InternationalString,
+ -- Non-brief elements follow:
+ variants [3] IMPLICIT SEQUENCE OF VariantClass OPTIONAL
+ -- mandatory in full record
+ }
+
+ -- Subsidiary structures for VariantSetInfo
+ VariantClass ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ variantClass [2] IMPLICIT INTEGER,
+ variantTypes [3] IMPLICIT SEQUENCE OF VariantType}
+ VariantType ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ variantType [2] IMPLICIT INTEGER,
+ variantValue [3] IMPLICIT VariantValue OPTIONAL}
+ VariantValue ::= SEQUENCE {
+ dataType [0] PrimitiveDataType,
+ values [1] ValueSet OPTIONAL }
+ ValueSet ::= CHOICE {
+ range [0] IMPLICIT ValueRange,
+ enumerated [1] IMPLICIT SEQUENCE OF ValueDescription }
+ ValueRange ::= SEQUENCE {
+ -- At last one the following must be supplied, both may be supplied.
+ lower [0] ValueDescription OPTIONAL,
+ upper [1] ValueDescription OPTIONAL }
+ ValueDescription ::= CHOICE{
+ integer INTEGER,
+ string InternationalString,
+ octets OCTET STRING,
+ oid OBJECT IDENTIFIER,
+ unit [1] IMPLICIT Unit,
+ valueAndUnit [2] IMPLICIT IntUnit
+ -- oid and unit can't be used in a ValueRange
+ }
+
+
+
+UnitInfo ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Key elements follow:
+ unitSystem [1] IMPLICIT InternationalString,
+ -- No non-key brief elements
+ -- Non-brief elements follow:
+ description [2] IMPLICIT HumanString OPTIONAL,
+ units [3] IMPLICIT SEQUENCE OF UnitType OPTIONAL
+ -- mandatory in full record
+ }
+
+ -- Subsidiary structures for UnitInfo
+ UnitType ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ unitType [2] StringOrNumeric,
+ units [3] IMPLICIT SEQUENCE OF Units}
+
+ Units ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ unit [2] StringOrNumeric}
+
+CategoryList ::= SEQUENCE {
+ commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
+ -- Only one record expected per Explain database. All elements appear in brief presentation.
+ categories [1] IMPLICIT SEQUENCE OF CategoryInfo }
+ CategoryInfo ::= SEQUENCE {
+ category [1] IMPLICIT InternationalString,
+ originalCategory [2] IMPLICIT InternationalString OPTIONAL,
+ description [3] IMPLICIT HumanString OPTIONAL,
+ asn1Module [4] IMPLICIT InternationalString OPTIONAL}
+
+
+-- - - - - - - - - - - - - - Subsidiary definitions
+
+CommonInfo ::= SEQUENCE {
+ dateAdded [0] IMPLICIT GeneralizedTime OPTIONAL,
+ dateChanged [1] IMPLICIT GeneralizedTime OPTIONAL,
+ expiry [2] IMPLICIT GeneralizedTime OPTIONAL,
+ humanString-Language [3] IMPLICIT LanguageCode OPTIONAL,
+ -- following not to occur for brief:
+ otherInfo OtherInformation OPTIONAL}
+
+
+HumanString ::= SEQUENCE OF SEQUENCE {
+ language [0] IMPLICIT LanguageCode OPTIONAL,
+ text [1] IMPLICIT InternationalString}
+
+IconObject ::= SEQUENCE OF SEQUENCE{
+ -- Note that the "SEQUENCE OF" is to allow alternative representations of the same Icon; it is not
+ -- intended to allow multiple icons.
+ bodyType [1] CHOICE{
+ ianaType [1] IMPLICIT InternationalString,
+ z3950type [2] IMPLICIT InternationalString,
+ otherType [3] IMPLICIT InternationalString},
+ content [2] IMPLICIT OCTET STRING}
+
+
+LanguageCode ::= InternationalString -- from ANSI/NISO Z39.53-1994
+
+ContactInfo ::= SEQUENCE {
+ name [0] IMPLICIT InternationalString OPTIONAL,
+ description [1] IMPLICIT HumanString OPTIONAL,
+ address [2] IMPLICIT HumanString OPTIONAL,
+ email [3] IMPLICIT InternationalString OPTIONAL,
+ phone [4] IMPLICIT InternationalString OPTIONAL}
+
+NetworkAddress ::= CHOICE {
+ internetAddress [0] IMPLICIT SEQUENCE {
+ hostAddress [0] IMPLICIT InternationalString,
+ port [1] IMPLICIT INTEGER},
+ osiPresentationAddress [1] IMPLICIT SEQUENCE {
+ pSel [0] IMPLICIT InternationalString,
+ sSel [1] IMPLICIT InternationalString OPTIONAL,
+ tSel [2] IMPLICIT InternationalString OPTIONAL,
+ nSap [3] IMPLICIT InternationalString},
+ other [2] IMPLICIT SEQUENCE {
+ type [0] IMPLICIT InternationalString,
+ address [1] IMPLICIT InternationalString}}
+
+AccessInfo ::= SEQUENCE {
+ -- AccessInfo contains the fundamental information about what facilities are required to use this target
+ -- or server. For example, if an origin can handle none of the record syntaxes a database can provide,
+ -- it might choose not to access the database.
+ queryTypesSupported [0] IMPLICIT SEQUENCE OF QueryTypeDetails OPTIONAL,
+ diagnosticsSets [1] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ attributeSetIds [2] IMPLICIT SEQUENCE OF AttributeSetId OPTIONAL,
+ schemas [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ recordSyntaxes [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ resourceChallenges [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ restrictedAccess [6] IMPLICIT AccessRestrictions OPTIONAL,
+ costInfo [8] IMPLICIT Costs OPTIONAL,
+ variantSets [9] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+ elementSetNames [10] IMPLICIT SEQUENCE OF ElementSetName OPTIONAL,
+ unitSystems [11] IMPLICIT SEQUENCE OF InternationalString}
+
+-- begin auxiliary definitions for AccessInfo
+-- Begin Query Details
+QueryTypeDetails ::= CHOICE {
+ private [0] IMPLICIT PrivateCapabilities,
+ rpn [1] IMPLICIT RpnCapabilities,
+ iso8777 [2] IMPLICIT Iso8777Capabilities,
+ z39-58 [100] IMPLICIT HumanString,
+ erpn [101] IMPLICIT RpnCapabilities,
+ rankedList [102] IMPLICIT HumanString}
+
+PrivateCapabilities ::= SEQUENCE {
+ operators [0] IMPLICIT SEQUENCE OF SEQUENCE {
+ operator [0] IMPLICIT InternationalString,
+ description [1] IMPLICIT HumanString OPTIONAL } OPTIONAL,
+ searchKeys [1] IMPLICIT SEQUENCE OF SearchKey OPTIONAL, -- field names that can be searched
+ description [2] IMPLICIT SEQUENCE OF HumanString OPTIONAL }
+
+RpnCapabilities ::= SEQUENCE {
+ operators [0] IMPLICIT SEQUENCE OF INTEGER OPTIONAL,
+ -- Omitted means all operators are supported.
+ resultSetAsOperandSupported [1] IMPLICIT BOOLEAN,
+ restrictionOperandSupported [2] IMPLICIT BOOLEAN,
+ proximity [3] IMPLICIT ProximitySupport OPTIONAL}
+
+Iso8777Capabilities ::= SEQUENCE {
+ searchKeys [0] IMPLICIT SEQUENCE OF SearchKey, -- field names that may be searched
+ restrictions [1] IMPLICIT HumanString OPTIONAL
+ -- Omitted means supported, not specifying units.
+ }
+
+ProximitySupport ::= SEQUENCE {
+ anySupport [0] IMPLICIT BOOLEAN,
+ -- 'false' means no proximity support, in which case unitsSupported not supplied.
+ unitsSupported [1] IMPLICIT SEQUENCE OF CHOICE{
+ known [1] IMPLICIT INTEGER, -- values from KnownProximityUnit
+ private [2] IMPLICIT SEQUENCE{
+ unit [0] IMPLICIT INTEGER,
+ description [1] HumanString OPTIONAL}} OPTIONAL}
+
+SearchKey ::= SEQUENCE {
+ searchKey [0] IMPLICIT InternationalString,
+ description [1] IMPLICIT HumanString OPTIONAL }
+-- End Query details
+AccessRestrictions ::= SEQUENCE OF SEQUENCE {
+ accessType [0] INTEGER {
+ any (0),
+ search (1),
+ present (2),
+ specific-elements (3),
+ extended-services (4),
+ by-database (5)},
+ accessText [1] IMPLICIT HumanString OPTIONAL,
+ accessChallenges [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+
+Costs ::= SEQUENCE {
+ connectCharge [0] IMPLICIT Charge OPTIONAL, -- Per-connection charge
+ connectTime [1] IMPLICIT Charge OPTIONAL, -- Time-based charge
+ displayCharge [2] IMPLICIT Charge OPTIONAL, -- Per-record charge
+ searchCharge [3] IMPLICIT Charge OPTIONAL, -- Per-search charge
+ subscriptCharge [4] IMPLICIT Charge OPTIONAL, -- Subscription charges
+ otherCharges [5] IMPLICIT SEQUENCE OF SEQUENCE{ -- Other charges
+ forWhat [1] IMPLICIT HumanString,
+ charge [2] IMPLICIT Charge} OPTIONAL}
+ Charge ::= SEQUENCE{
+ cost [1] IMPLICIT IntUnit,
+ perWhat [2] IMPLICIT Unit OPTIONAL,
+ -- e.g. "second," "minute," "line," "record"...
+ text [3] IMPLICIT HumanString OPTIONAL}
+-- End Auxiliary definitions for AccessInfo
+
+DatabaseList ::= SEQUENCE OF DatabaseName
+
+AttributeCombinations ::= SEQUENCE {
+ defaultAttributeSet [0] IMPLICIT AttributeSetId,
+ -- Default for the combinations. Also probably a good choice for the default
+ -- in searches, but that isn't required.
+ legalCombinations [1] IMPLICIT SEQUENCE OF AttributeCombination }
+
+
+AttributeCombination ::= SEQUENCE OF AttributeOccurrence
+ -- An AttributeCombination is a pattern for legal combination of attributes
+
+
+AttributeOccurrence ::= SEQUENCE {
+ -- An AttributeOccurrence lists the legal values for a specific attribute type in a combination.
+ attributeSet [0] IMPLICIT AttributeSetId OPTIONAL,
+ attributeType [1] IMPLICIT INTEGER,
+ mustBeSupplied [2] IMPLICIT NULL OPTIONAL,
+ attributeValues CHOICE {
+ any-or-none [3] IMPLICIT NULL, -- All supported values are OK
+ specific [4] IMPLICIT SEQUENCE OF StringOrNumeric}}
+ -- Only these values allowed
+END
+
+
+
+
+
+
+
+
+
+RecordSyntax-SUTRS
+{Z39-50-recordSyntax SUTRS (101)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+ SutrsRecord ::= InternationalString
+-- Line terminator is ASCII LF (X'0A').
+-- Recommended maximum line length is 72 characters.
+END
+
+
+
+
+
+RecordSyntax-opac
+{Z39-50-recordSyntax opac (102)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+OPACRecord ::= SEQUENCE {
+ bibliographicRecord [1] IMPLICIT EXTERNAL OPTIONAL,
+ holdingsData [2] IMPLICIT SEQUENCE OF HoldingsRecord OPTIONAL}
+HoldingsRecord ::= CHOICE {
+ marcHoldingsRecord [1] IMPLICIT EXTERNAL,
+ holdingsAndCirc [2] IMPLICIT HoldingsAndCircData}
+HoldingsAndCircData ::= SEQUENCE {
+-- the following elements are required to display holdings in conformance with NISO standards.
+ typeOfRecord [1] IMPLICIT InternationalString OPTIONAL, -- LDR 06
+ encodingLevel [2] IMPLICIT InternationalString OPTIONAL, -- LDR 017
+ format [3] IMPLICIT InternationalString OPTIONAL, -- 007 00-01
+ receiptAcqStatus [4] IMPLICIT InternationalString OPTIONAL, -- 008 06
+ generalRetention [5] IMPLICIT InternationalString OPTIONAL, -- 008 12
+ completeness [6] IMPLICIT InternationalString OPTIONAL, -- 008 16
+ dateOfReport [7] IMPLICIT InternationalString OPTIONAL, -- 008 26-31
+ nucCode [8] IMPLICIT InternationalString OPTIONAL, -- 852 $a
+ localLocation [9] IMPLICIT InternationalString OPTIONAL, -- 852 $b
+ shelvingLocation [10] IMPLICIT InternationalString OPTIONAL, -- 852 $c
+ callNumber [11] IMPLICIT InternationalString OPTIONAL, -- 852 $h and $i
+ shelvingData [12] IMPLICIT InternationalString OPTIONAL, -- 852 $j thru $m
+ copyNumber [13] IMPLICIT InternationalString OPTIONAL, -- 852 $t
+ publicNote [14] IMPLICIT InternationalString OPTIONAL, -- 852 $z
+ reproductionNote [15] IMPLICIT InternationalString OPTIONAL, -- 843
+ termsUseRepro [16] IMPLICIT InternationalString OPTIONAL, -- 845
+ enumAndChron [17] IMPLICIT InternationalString OPTIONAL, -- all 85x, 86x
+ volumes [18] IMPLICIT SEQUENCE OF Volume OPTIONAL,
+ -- repeats for each volume held
+ circulationData [19] IMPLICIT SEQUENCE OF CircRecord OPTIONAL
+ -- repeats for each circulating item.
+ }
+Volume ::= SEQUENCE {
+ enumeration [1] IMPLICIT InternationalString OPTIONAL,
+ chronology [2] IMPLICIT InternationalString OPTIONAL,
+ enumAndChron [3] IMPLICIT InternationalString OPTIONAL }
+CircRecord ::= SEQUENCE {
+ availableNow [1] IMPLICIT BOOLEAN,
+ availablityDate [2] IMPLICIT InternationalString OPTIONAL,
+ availableThru [3] IMPLICIT InternationalString OPTIONAL,
+ restrictions [4] IMPLICIT InternationalString OPTIONAL,
+ itemId [5] IMPLICIT InternationalString OPTIONAL,
+ renewable [6] IMPLICIT BOOLEAN,
+ onHold [7] IMPLICIT BOOLEAN,
+ enumAndChron [8] IMPLICIT InternationalString OPTIONAL,
+ midspine [9] IMPLICIT InternationalString OPTIONAL,
+ temporaryLocation [10] IMPLICIT InternationalString OPTIONAL}
+END
+
+
+
+RecordSyntax-summary
+
+{Z39-50-recordSyntax summary (103)} DEFINITIONS ::=
+BEGIN
+IMPORTS OtherInformation, InternationalString FROM Z39-50-APDU-1995;
+BriefBib ::= SEQUENCE {
+ title [1] IMPLICIT InternationalString,
+ author [2] IMPLICIT InternationalString OPTIONAL,
+ callNumber [3] IMPLICIT InternationalString OPTIONAL,
+ recordType [4] IMPLICIT InternationalString OPTIONAL,
+ bibliographicLevel [5] IMPLICIT InternationalString OPTIONAL,
+ format [6] IMPLICIT SEQUENCE OF FormatSpec OPTIONAL,
+ publicationPlace [7] IMPLICIT InternationalString OPTIONAL,
+ publicationDate [8] IMPLICIT InternationalString OPTIONAL,
+ targetSystemKey [9] IMPLICIT InternationalString OPTIONAL,
+ satisfyingElement [10] IMPLICIT InternationalString OPTIONAL,
+ rank [11] IMPLICIT INTEGER OPTIONAL,
+ documentId [12] IMPLICIT InternationalString OPTIONAL,
+ abstract [13] IMPLICIT InternationalString OPTIONAL,
+ otherInfo OtherInformation OPTIONAL}
+
+FormatSpec ::= SEQUENCE {
+ type [1] IMPLICIT InternationalString,
+ size [2] IMPLICIT INTEGER OPTIONAL,
+ bestPosn [3] IMPLICIT INTEGER OPTIONAL}
+END
+
+
+
+
+
+
+
+
+
+
+RecordSyntax-generic -- For detailed semantics, see Appendix RET.
+{Z39-50-recordSyntax GRS-1 (105)} DEFINITIONS ::=
+BEGIN
+EXPORTS Variant;
+IMPORTS IntUnit, Unit, InternationalString, StringOrNumeric, Term FROM Z39-50-APDU-1995;
+
+GenericRecord ::= SEQUENCE OF TaggedElement
+TaggedElement ::= SEQUENCE {
+ tagType [1] IMPLICIT INTEGER OPTIONAL,
+ -- If omitted, default should be supplied dynamically by tagSet-M;
+ -- otherwise it should be statically specified by the schema.
+ tagValue [2] StringOrNumeric,
+ tagOccurrence [3] IMPLICIT INTEGER OPTIONAL,
+ -- Occurrence within the database record, and relative to the parent. No
+ -- default; if omitted, target not telling or it is irrelevant.
+ content [4] ElementData,
+ metaData [5] IMPLICIT ElementMetaData OPTIONAL,
+ appliedVariant [6] IMPLICIT Variant OPTIONAL}
+
+ElementData ::= CHOICE{
+ octets OCTET STRING,
+ numeric INTEGER,
+ date GeneralizedTime,
+ ext EXTERNAL,
+ string InternationalString,
+ trueOrFalse BOOLEAN,
+ oid OBJECT IDENTIFIER,
+ intUnit [1] IMPLICIT IntUnit,
+ elementNotThere [2] IMPLICIT NULL, -- element requested but not there
+ elementEmpty [3] IMPLICIT NULL, -- element there, but empty
+ noDataRequested [4] IMPLICIT NULL, -- variant request said 'no data'
+ diagnostic [5] IMPLICIT EXTERNAL,
+ subtree [6] SEQUENCE OF TaggedElement -- recursive, for nested tags
+ }
+
+
+ElementMetaData ::= SEQUENCE{
+ seriesOrder [1] IMPLICIT Order OPTIONAL, -- only for a non-leaf node
+ usageRight [2] IMPLICIT Usage OPTIONAL,
+ hits [3] IMPLICIT SEQUENCE OF HitVector OPTIONAL,
+ displayName [4] IMPLICIT InternationalString OPTIONAL,
+ -- name for element that origin can use for display
+ supportedVariants [5] IMPLICIT SEQUENCE OF Variant OPTIONAL,
+ message [6] IMPLICIT InternationalString OPTIONAL,
+ elementDescriptor [7] IMPLICIT OCTET STRING OPTIONAL,
+ surrogateFor [8] IMPLICIT TagPath OPTIONAL,
+ -- the retrieved element is a surrogate for the element given by this path
+ surrogateElement [9] IMPLICIT TagPath OPTIONAL,
+ -- the element given by this path is a surrogate for the retrieved element
+ other [99] IMPLICIT EXTERNAL OPTIONAL}
+
+ TagPath ::= SEQUENCE OF SEQUENCE{
+ tagType [1] IMPLICIT INTEGER OPTIONAL,
+ tagValue [2] StringOrNumeric,
+ tagOccurrence [3] IMPLICIT INTEGER OPTIONAL}
+
+
+
+Order ::= SEQUENCE{
+ ascending [1] IMPLICIT BOOLEAN,
+ -- "true" means monotonically increasing (i.e. non-decreasing);
+ -- "false" means monotonically decreasing (i.e. non-increasing).
+ order [2] IMPLICIT INTEGER
+ -- Same as defined by 'elementOrdering' in tagSet-M, though this may be
+ -- overridden by schema.
+ }
+
+
+
+Usage ::= SEQUENCE {
+ type [1] IMPLICIT INTEGER{
+ redistributable (1), -- Element is freely redistributable.
+ restricted (2), -- Restriction contains statement.
+ licensePointer (3) -- Restriction contains license pointer.
+ },
+ restriction [2] IMPLICIT InternationalString OPTIONAL}
+
+
+
+HitVector ::= SEQUENCE{
+ -- Each hit vector points to a fragment within the element, via location and/or token.
+ satisfier Term OPTIONAL, -- sourceword, etc.
+ offsetIntoElement [1] IMPLICIT IntUnit OPTIONAL,
+ length [2] IMPLICIT IntUnit OPTIONAL,
+ hitRank [3] IMPLICIT INTEGER OPTIONAL,
+ targetToken [4] IMPLICIT OCTET STRING OPTIONAL
+ -- Origin may use token subsequently within a variantRequest (in
+ -- an elementRequest) to retrieve (or to refer to) the fragment.
+ }
+
+
+
+
+Variant ::= SEQUENCE{
+ globalVariantSetId [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ -- Applies to the triples below, when variantSetId omitted. If
+ -- globalVariantSetId omitted, default applies. Default may be provided by
+ -- the tagSet-M element defaultVariantSetId.
+
+
+
+
+ triples [2] IMPLICIT SEQUENCE OF SEQUENCE{
+ variantSetId [0] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ -- If omitted, globalVariantSetId (above)
+ -- applies, unless that too is omitted, in
+ -- which case, default used.
+ class [1] IMPLICIT INTEGER,
+ type [2] IMPLICIT INTEGER,
+ value [3] CHOICE{
+ integer INTEGER,
+ internationalString InternationalString,
+ octetString OCTET STRING,
+ objectIdentifier OBJECT IDENTIFIER,
+ boolean BOOLEAN,
+ null NULL,
+ -- Following need context tags:
+ unit [1] IMPLICIT Unit,
+ valueAndUnit [2] IMPLICIT IntUnit}}}
+END
+
+
+
+RecordSyntax-ESTaskPackage
+{Z39-50-recordSyntax ESTaskPackage (106)} DEFINITIONS ::=
+BEGIN
+IMPORTS Permissions, InternationalString, IntUnit, DiagRec FROM Z39-50-APDU-1995;
+
+TaskPackage ::= SEQUENCE{
+ packageType [1] IMPLICIT OBJECT IDENTIFIER,
+ -- oid of specific ES definition
+ packageName [2] IMPLICIT InternationalString OPTIONAL,
+ userId [3] IMPLICIT InternationalString OPTIONAL,
+ retentionTime [4] IMPLICIT IntUnit OPTIONAL,
+ permissions [5] IMPLICIT Permissions OPTIONAL,
+ description [6] IMPLICIT InternationalString OPTIONAL,
+ targetReference [7] IMPLICIT OCTET STRING OPTIONAL,
+ creationDateTime [8] IMPLICIT GeneralizedTime OPTIONAL,
+ taskStatus [9] IMPLICIT INTEGER{
+ pending (0),
+ active (1),
+ complete (2),
+ aborted (3)},
+ packageDiagnostics [10] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+ taskSpecificParameters [11] IMPLICIT EXTERNAL
+ -- Use oid for specific ES definition
+ -- (same oid as packageType above)
+ -- and select [2] "taskPackage."
+ }
+END
+
+
+
+
+ResourceReport-Format-Resource-1
+{Z39-50-resourceReport resource-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+--
+ResourceReport ::= SEQUENCE{
+estimates [1] IMPLICIT SEQUENCE OF Estimate,
+message [2] IMPLICIT InternationalString}
+--
+Estimate ::= SEQUENCE{
+type [1] IMPLICIT EstimateType,
+value [2] IMPLICIT INTEGER, -- the actual estimate
+currency-code [3] IMPLICIT INTEGER OPTIONAL
+ -- code for representation of currencies defined in ISO 4217-1990.
+ -- Applicable only to monetary estimates.
+ }
+EstimateType ::= INTEGER{
+currentSearchRecords (1), -- estimated no. records in current (incomplete) result set for search
+finalSearchRecords (2), -- estimated no. records that will be in result set if search completes
+currentPresentRecords (3), -- estimated number of records in current (incomplete) set of
+ -- records to be returned on Present
+finalPresentRecords (4), -- estimated number of records that will be in the set of records
+ -- to be returned by Present if Present completes
+currentOpTimeProcessing (5), -- processing time (in .001 CPU seconds) used by operation so far
+finalOpTimeProcessing (6), -- estimated total processing time (in .001 CPU seconds) that will
+ -- be used by this operation if it completes
+currentAssocTime (7), -- estimated processing time used by association (in .001 CPU sec.)
+currentOperationCost (8), -- estimated cost for this operation so far
+finalOperationCost (9), -- estimated cost for this operation if it completes
+currentAssocCost (10), -- estimated cost for this association so far
+finalOpTimeElapsed (11), -- estimated elapsed time for operation if it completes (in .001 sec.)
+percentComplete (12), -- estimated percent complete
+currentSearchAssocCost (13), -- estimated search cost for association so far
+currentPresentAssocCost (14), -- estimated present cost for this association so far
+currentConnectAssocCost (15), -- estimated connect time cost for association so far
+currentOtherAssocCost (16) -- estimated other cost (not included in 13-15) for association so far
+ }
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+ResourceReport-Format-Resource-2
+{Z39-50-resourceReport resource-2 (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, StringOrNumeric, IntUnit FROM Z39-50-APDU-1995;
+--
+ResourceReport ::= SEQUENCE{
+estimates [1] IMPLICIT SEQUENCE OF Estimate OPTIONAL,
+message [2] IMPLICIT InternationalString OPTIONAL}
+--
+Estimate ::= SEQUENCE{
+type [1] StringOrNumeric,
+ -- Numeric values of 1-16 are the same as used in Resource-1.
+value [2] IMPLICIT IntUnit
+ -- When expressing currency:
+ -- unitSystem (of Unit) is 'z3950' (case insensitive)
+ -- unitType is 'iso4217-1990' (case insensitive)
+ -- unit is currency code from ISO 4217-1990.
+}
+END
+
+
+
+
+
+AccessControlFormat-prompt-1
+{Z39-50-accessControl prompt-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, DiagRec FROM Z39-50-APDU-1995;
+--
+PromptObject ::= CHOICE{
+ challenge [1] IMPLICIT Challenge,
+ response [2] IMPLICIT Response}
+
+ Challenge ::= SEQUENCE OF SEQUENCE {
+ promptId [1] PromptId,
+ -- Target supplies a number (for an enumerated prompt) or string (for a non
+ -- -enumerated prompt), for each prompt, and the origin returns it in response, for
+ -- this prompt, so target may correlate the prompt response with the prompt.
+ defaultResponse [2] IMPLICIT InternationalString OPTIONAL,
+ promptInfo [3] CHOICE{
+ character [1] IMPLICIT InternationalString,
+ encrypted [2] IMPLICIT Encryption} OPTIONAL,
+ -- Information corresponding to an enumerated prompt. For example if 'type', within
+ -- PromptId, is 'copyright', then promptInfo may contain a copyright statement.
+ regExpr [4] IMPLICIT InternationalString OPTIONAL,
+ -- A regular expression that promptResponse should match. See IEEE 1003.2
+ -- Volume 1, Section 2.8 "Regular Expression Notation." For example if promptId
+ -- is "Year of publication," regExpr might be "19[89][0-9]|20[0-9][0-9]".
+ responseRequired [5] IMPLICIT NULL OPTIONAL,
+ allowedValues [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ -- e.g. promptId="Desired color"; allowed = 'red', 'blue','Green'.
+ shouldSave [7] IMPLICIT NULL OPTIONAL,
+ -- Target recommends that origin save the data that it prompts from the
+ -- user corresponding to this prompt, because it is likely to be requested again (so
+ -- origin might not have to prompt the user next time).
+ dataType [8] IMPLICIT INTEGER{
+ integer (1),
+ date (2),
+ float (3),
+ alphaNumeric (4),
+ url-urn (5),
+ boolean (6)} OPTIONAL,
+ -- Target telling origin type of data it wants. E.g., if "date" is specified,
+ -- presumably the origin will try to prompt something "date-like" from the user.
+ diagnostic [9] IMPLICIT EXTERNAL OPTIONAL
+ -- Intended for repeat requests when there is an error the origin
+ -- should report to the user from previous attempt.
+ }
+
+
+ Response ::= SEQUENCE OF SEQUENCE {
+ promptId [1] PromptId,
+ -- Corresponds to a prompt in the challenge, or may be unprompted, for
+ -- example "newPassword." If unprompted, should be "enumerated."
+ -- If this responds to a non-enumerated prompt, then nonEnumeratedPrompt
+ -- should contain the prompt string from the challenge.
+ promptResponse [2] CHOICE{
+ string [1] IMPLICIT InternationalString,
+ accept [2] IMPLICIT BOOLEAN,
+ acknowledge [3] IMPLICIT NULL,
+ diagnostic [4] DiagRec,
+ encrypted [5] IMPLICIT Encryption}}
+
+
+ PromptId ::= CHOICE{
+ enummeratedPrompt [1] IMPLICIT SEQUENCE{
+ type [1] IMPLICIT INTEGER{
+ groupId (0),
+ userId (1),
+ password (2),
+ newPassword (3),
+ copyright (4),
+ -- When type on Challenge is 'copyright', promptInfo has text of
+ -- copyright message to be displayed verbatim to the user. If
+ -- promptResponse indicates 'acceptance', this indicates the user has been
+ -- shown, and accepted, the terms of the copyright. This is not intended
+ -- to be legally binding, but provides a good-faith attempt on
+ -- the part of the target to inform the user of the copyright.
+ sessionId (5)},
+ suggestedString [2] IMPLICIT InternationalString OPTIONAL},
+ nonEnumeratedPrompt [2] IMPLICIT InternationalString}
+
+
+ Encryption ::= SEQUENCE{
+ cryptType [1] IMPLICIT OCTET STRING OPTIONAL,
+ credential [2] IMPLICIT OCTET STRING OPTIONAL,
+ --random number, SALT, or other factor
+ data [3] IMPLICIT OCTET STRING}
+
+END
+
+
+
+
+AccessControlFormat-des-1
+{Z39-50-accessControlFormat des-1 (2)} DEFINITIONS ::=
+BEGIN
+ DES-RN-Object ::= CHOICE {
+ challenge [1] IMPLICIT DRNType,
+ response [2] IMPLICIT DRNType}
+ DRNType ::= SEQUENCE{
+ userId [1] IMPLICIT OCTET STRING OPTIONAL,
+ salt [2] IMPLICIT OCTET STRING OPTIONAL,
+ randomNumber [3] IMPLICIT OCTET STRING}
+END
+
+
+AccessControlFormat-krb-1
+{Z39-50-accessControlFormat krb-1 (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+
+ KRBObject ::= CHOICE {
+ challenge [1] IMPLICIT KRBRequest,
+ response [2] IMPLICIT KRBResponse}
+ KRBRequest ::= SEQUENCE{
+ service [1] IMPLICIT InternationalString,
+ instance [2] IMPLICIT InternationalString OPTIONAL,
+ realm [3] IMPLICIT InternationalString OPTIONAL}
+ -- target requests a ticket for the given service, instance, and realm
+ KRBResponse ::= SEQUENCE{
+ userid [1] IMPLICIT InternationalString OPTIONAL,
+ ticket [2] IMPLICIT OCTET STRING}
+ -- origin responds with a ticket for the requested service
+END
+
+
+
+
+
+
+
+
+
+ESFormat-PersistentResultSet
+{Z39-50-extendedService PersistentResultSet (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+PersistentResultSet ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] IMPLICIT NULL,
+ notToKeep [2] OriginPartNotToKeep OPTIONAL},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] IMPLICIT NULL,
+ targetPart [2] TargetPart OPTIONAL}}
+OriginPartNotToKeep ::= SEQUENCE{
+ originSuppliedResultSet [1] IMPLICIT InternationalString OPTIONAL,
+ -- name of transient result set, supplied on request, mandatory unless function is 'delete'
+ replaceOrAppend [2] IMPLICIT INTEGER{ -- only if function is "modify"
+ replace (1),
+ append (2)} OPTIONAL}
+TargetPart ::= SEQUENCE{
+ targetSuppliedResultSet [1] IMPLICIT InternationalString OPTIONAL,
+ -- Name of transient result set, supplied by target, representing the persistent result set to which
+ -- package pertains. Meaningful only when package is presented. (i.e. not on ES response).
+ numberOfRecords [2] IMPLICIT INTEGER OPTIONAL}
+END
+
+
+ESFormat-PersistentQuery
+{Z39-50-extendedService PersistentQuery (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, OtherInformation FROM Z39-50-APDU-1995;
+PersistentQuery ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep OPTIONAL,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep OPTIONAL,
+ targetPart [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+ dbNames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ additionalSearchInfo [3] OtherInformation OPTIONAL}
+OriginPartNotToKeep ::= CHOICE{
+ package [1] IMPLICIT InternationalString,
+ query [2] Query}
+TargetPart ::= Query
+END
+
+ESFormat-PeriodicQuerySchedule
+{Z39-50-extendedService PeriodicQuerySchedule (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, IntUnit FROM Z39-50-APDU-1995
+ExportSpecification, Destination FROM ESFormat-ExportSpecification;
+
+PeriodicQuerySchedule ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep,
+ targetPart [2] TargetPart}}
+
+OriginPartToKeep ::=SEQUENCE{
+ activeFlag [1] IMPLICIT BOOLEAN,
+ databaseNames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ resultSetDisposition [3] IMPLICIT INTEGER{
+ replace (1),
+ append (2),
+ createNew (3) -- Only if origin and target have agreement about
+ -- naming convention for the resulting package,
+ -- and only if no result set is specified.
+ } OPTIONAL, -- Mandatory on 'create' if result set is specified, in
+ -- which case it must be 'replace' or 'append.
+ alertDestination [4] Destination OPTIONAL,
+ exportParameters [5] CHOICE{
+ packageName [1] IMPLICIT InternationalString,
+ exportPackage [2] ExportSpecification} OPTIONAL}
+
+OriginPartNotToKeep ::= SEQUENCE{
+ querySpec [1] CHOICE{
+ actualQuery [1] Query,
+ packageName [2] IMPLICIT InternationalString} OPTIONAL,
+ -- mandatory for 'create'
+ originSuggestedPeriod [2] Period OPTIONAL, -- mandatory for 'create'
+ expiration [3] IMPLICIT GeneralizedTime OPTIONAL,
+ resultSetPackage [4] IMPLICIT InternationalString OPTIONAL}
+
+TargetPart ::= SEQUENCE{
+ actualQuery [1] Query,
+ targetStatedPeriod [2] Period,
+ -- Target supplies the period, which may be same as origin proposed.
+ expiration [3] IMPLICIT GeneralizedTime OPTIONAL,
+ -- Target supplies value for task package. It may be the same as origin
+ -- proposed or different from (and overrides) origin proposal, but if
+ -- omitted, there is no expiration.
+ resultSetPackage [4] IMPLICIT InternationalString OPTIONAL,
+ -- May be omitted only if exportParameters was supplied. Target
+ -- supplies same name as origin supplied, if origin did supply a name.
+ lastQueryTime [5] IMPLICIT GeneralizedTime,
+ lastResultNumber [6] IMPLICIT INTEGER,
+ numberSinceModify [7] IMPLICIT INTEGER OPTIONAL}
+
+
+
+
+ Period ::= CHOICE{
+ unit [1] IMPLICIT IntUnit,
+ businessDaily [2] IMPLICIT NULL,
+ continuous [3] IMPLICIT NULL,
+ other [4] IMPLICIT InternationalString}
+END
+
+
+ESFormat-ItemOrder
+{Z39-50-extendedService ItemOrder (4)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+ItemOrder ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep OPTIONAL,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep OPTIONAL,
+ targetPart [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+ supplDescription [1] IMPLICIT EXTERNAL OPTIONAL,
+ contact [2] IMPLICIT SEQUENCE{
+ name [1] IMPLICIT InternationalString OPTIONAL,
+ phone [2] IMPLICIT InternationalString OPTIONAL,
+ email [3] IMPLICIT InternationalString OPTIONAL} OPTIONAL,
+ addlBilling [3] IMPLICIT SEQUENCE{
+ paymentMethod [1] CHOICE{
+ billInvoice [0] IMPLICIT NULL,
+ prepay [1] IMPLICIT NULL,
+ depositAccount [2] IMPLICIT NULL,
+ creditCard [3] IMPLICIT CreditCardInfo,
+ cardInfoPreviouslySupplied [4] IMPLICIT NULL,
+ privateKnown [5] IMPLICIT NULL,
+ privateNotKnown [6] IMPLICIT EXTERNAL},
+ customerReference [2] IMPLICIT InternationalString OPTIONAL,
+ customerPONumber [3] IMPLICIT InternationalString OPTIONAL}
+ OPTIONAL}
+CreditCardInfo ::= SEQUENCE{
+ nameOnCard [1] IMPLICIT InternationalString,
+ expirationDate [2] IMPLICIT InternationalString,
+ cardNumber [3] IMPLICIT InternationalString}
+
+OriginPartNotToKeep ::= SEQUENCE{ -- Corresponds to 'requestedItem' in service definition.
+ -- Must supply at least one, and may supply both.
+ resultSetItem [1] IMPLICIT SEQUENCE{
+ resultSetId [1] IMPLICIT InternationalString,
+ item [2] IMPLICIT INTEGER} OPTIONAL,
+ itemRequest [2] IMPLICIT EXTERNAL OPTIONAL
+ -- When itemRequest is an ILL-Request APDU,
+ -- use OID {iso standard 10161 abstract-syntax (2) ill-apdus (1)}
+ }
+
+TargetPart ::= SEQUENCE{
+ itemRequest [1] IMPLICIT EXTERNAL OPTIONAL,
+ -- When itemRequest is an ILL-Request APDU, use OID 1.0.10161.2.1 (as above)
+ statusOrErrorReport [2] IMPLICIT EXTERNAL OPTIONAL,
+ -- When statusOrErrorReport is an ILL Status-Or-Error-Report APDU, use OID 1.0.10161.2.1 (as above)
+ auxiliaryStatus [3] IMPLICIT INTEGER{
+ notReceived (1),
+ loanQueue (2),
+ forwarded (3),
+ unfilledCopyright (4),
+ filledCopyright (5)} OPTIONAL}
+END
+
+
+
+
+ESFormat-Update0
+{Z39-50-extendedService Update (5)} DEFINITIONS ::=
+BEGIN
+IMPORTS DiagRec, InternationalString FROM Z39-50-APDU-1995;
+Update ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep,
+ targetPart [2] TargetPart}}
+
+
+OriginPartToKeep ::= SEQUENCE{
+ action [1] IMPLICIT INTEGER{
+ recordInsert (1),
+ recordReplace (2),
+ recordDelete (3),
+ elementUpdate (4)},
+ databaseName [2] IMPLICIT InternationalString,
+ schema [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ elementSetName [4] IMPLICIT InternationalString OPTIONAL}
+
+
+OriginPartNotToKeep ::= SuppliedRecords
+
+
+TargetPart ::= SEQUENCE{
+ updateStatus [1] IMPLICIT INTEGER{
+ success (1),
+ partial (2),
+ failure (3)},
+ globalDiagnostics [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+ -- These are non-surrogate diagnostics relating to the task,
+ -- not to individual records.
+ taskPackageRecords [3] IMPLICIT SEQUENCE OF TaskPackageRecordStructure
+ -- There should be a TaskPackageRecordStructure for every record
+ -- supplied. The target should create such a structure for every
+ -- record immediately upon creating the task package to include
+ -- correlation information and status. The record itself would not
+ -- be included until processing for that record is complete.
+ }
+
+-- Auxiliary definitions for Update
+SuppliedRecords ::= SEQUENCE OF SEQUENCE{
+ recordId [1] CHOICE{
+ number [1] IMPLICIT INTEGER,
+ string [2] IMPLICIT InternationalString,
+ opaque [3] IMPLICIT OCTET STRING} OPTIONAL,
+ supplementalId [2] CHOICE{
+ timeStamp [1] IMPLICIT GeneralizedTime,
+ versionNumber [2] IMPLICIT InternationalString,
+ previousVersion [3] IMPLICIT EXTERNAL} OPTIONAL,
+ correlationInfo [3] IMPLICIT CorrelationInfo OPTIONAL,
+ record [4] IMPLICIT EXTERNAL}
+
+CorrelationInfo ::= SEQUENCE{
+ -- origin may supply one or both for any record:
+ note [1] IMPLICIT InternationalString OPTIONAL,
+ id [2] IMPLICIT INTEGER OPTIONAL}
+
+TaskPackageRecordStructure ::= SEQUENCE{
+ recordOrSurDiag [1] CHOICE {
+ record [1] IMPLICIT EXTERNAL,
+ -- Choose 'record' if recordStatus is 'success', and
+ -- elementSetName was supplied.
+ diagnostic [2] DiagRec
+ -- Choose 'diagnostic', if RecordStatus is failure.
+ } OPTIONAL,
+ -- The parameter recordOrSurDiag will thus be omitted only if
+ -- 'elementSetName' was omitted and recordStatus is
+ -- 'success'; or if record status is 'queued' or in 'process'.
+ correlationInfo [2] IMPLICIT CorrelationInfo OPTIONAL,
+ -- This should be included if it was supplied by the origin.
+ recordStatus [3] IMPLICIT INTEGER{
+ success (1),
+ queued (2),
+ inProcess (3),
+ failure (4)}}
+END
+
+
+ESFormat-ExportSpecification
+{Z39-50-extendedService ExportSpecification (6)} DEFINITIONS ::=
+BEGIN
+EXPORTS ExportSpecification, Destination; IMPORTS CompSpec, InternationalString FROM Z39-50-APDU-1995;
+ExportSpecification ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] IMPLICIT NULL},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep,
+ targetPart [2] IMPLICIT NULL}}
+OriginPartToKeep ::= SEQUENCE{
+ composition [1] IMPLICIT CompSpec,
+ exportDestination [2] Destination}
+
+ Destination ::= CHOICE{
+ phoneNumber [1] IMPLICIT InternationalString,
+ faxNumber [2] IMPLICIT InternationalString,
+ x400address [3] IMPLICIT InternationalString,
+ emailAddress [4] IMPLICIT InternationalString,
+ pagerNumber [5] IMPLICIT InternationalString,
+ ftpAddress [6] IMPLICIT InternationalString,
+ ftamAddress [7] IMPLICIT InternationalString,
+ printerAddress [8] IMPLICIT InternationalString,
+ other [100] IMPLICIT SEQUENCE{
+ vehicle [1] IMPLICIT InternationalString OPTIONAL,
+ destination [2] IMPLICIT InternationalString}}
+END
+
+
+
+
+ESFormat-ExportInvocation
+{Z39-50-extendedService ExportInvocation (7)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, IntUnit FROM Z39-50-APDU-1995
+ExportSpecification FROM ESFormat-ExportSpecification;
+ExportInvocation ::= CHOICE{
+ esRequest [1] IMPLICIT SEQUENCE{
+ toKeep [1] OriginPartToKeep,
+ notToKeep [2] OriginPartNotToKeep},
+ taskPackage [2] IMPLICIT SEQUENCE{
+ originPart [1] OriginPartToKeep,
+ targetPart [2] TargetPart OPTIONAL}}
+
+OriginPartToKeep ::= SEQUENCE{
+ exportSpec [1] CHOICE{
+ packageName [1] IMPLICIT InternationalString,
+ packageSpec [2] ExportSpecification},
+ numberOfCopies [2] IMPLICIT INTEGER}
+
+
+
+
+
+OriginPartNotToKeep ::= SEQUENCE{
+ resultSetId [1] IMPLICIT InternationalString,
+ records [2] CHOICE{
+ all [1] IMPLICIT NULL,
+ ranges [2] IMPLICIT SEQUENCE OF SEQUENCE{
+ start [1] IMPLICIT INTEGER,
+ count [2] IMPLICIT INTEGER OPTIONAL
+ -- Count may be omitted only on last range, to indicate
+ -- "all remaining records beginning with 'start'."
+ }}}
+
+TargetPart ::= SEQUENCE{
+ estimatedQuantity [1] IMPLICIT IntUnit OPTIONAL,
+ quantitySoFar [2] IMPLICIT IntUnit OPTIONAL,
+ estimatedCost [3] IMPLICIT IntUnit OPTIONAL,
+ costSoFar [4] IMPLICIT IntUnit OPTIONAL}
+END
+
+
+
+UserInfoFormat-searchResult-1
+{Z39-50-userInfoFormat searchResult-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS DatabaseName, Term, Query, IntUnit, InternationalString FROM Z39-50-APDU-1995;
+SearchInfoReport ::= SEQUENCE OF SEQUENCE{
+ subqueryId [1] IMPLICIT InternationalString OPTIONAL,
+ -- shorthand identifier of subquery
+ fullQuery [2] IMPLICIT BOOLEAN, -- 'true' means this is the full query; 'false',
+ -- a sub-query
+ subqueryExpression [3] QueryExpression OPTIONAL, -- A subquery of the query as
+ -- submitted. May be whole query;
+ -- if so, "fullQuery" should be 'true'.
+ subqueryInterpretation [4] QueryExpression OPTIONAL, -- how target interpreted subquery
+ subqueryRecommendation [5] QueryExpression OPTIONAL, -- target-recommended alternative
+ subqueryCount [6] IMPLICIT INTEGER OPTIONAL, -- Number of records for this
+ -- subQuery, across all of the specified
+ -- databases. (If during search, via resource
+ -- control, number of records so far).
+ subqueryWeight [7] IMPLICIT IntUnit OPTIONAL, -- relative weight of this subquery
+ resultsByDB [8] IMPLICIT ResultsByDB OPTIONAL}
+
+ResultsByDB ::= SEQUENCE OF SEQUENCE{
+ databases [1] CHOICE{
+ all [1] IMPLICIT NULL,
+ -- applies across all of the databases in Search PDU
+ list [2] IMPLICIT SEQUENCE OF DatabaseName
+ -- applies across all databases in this list
+ },
+ count [2] IMPLICIT INTEGER OPTIONAL,
+ -- Number of records for query component (and, as above, if during search,
+ -- via resource control, number of records so far).
+ resultSetName [3] IMPLICIT InternationalString OPTIONAL
+ -- Target-assigned result set by which subQuery is available. Should not
+ -- be provided unless processing for this query component is concluded (i.e.,
+ -- when this report comes during search, via resource control, as opposed
+ -- to after search, via additionalSearchInfo).
+ }
+
+QueryExpression ::= CHOICE {
+ term [1] IMPLICIT SEQUENCE{
+ queryTerm [1] Term,
+ termComment [2] IMPLICIT InternationalString OPTIONAL},
+ query [2] Query}
+END
+
+
+
+ElementSpecificationFormat-eSpec-1
+{Z39-50-elementSpec eSpec-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS Variant FROM RecordSyntax-generic
+StringOrNumeric, InternationalString FROM Z39-50-APDU-1995;
+--
+Espec-1 ::= SEQUENCE{
+ elementSetNames [1] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+ -- Origin may include one or more element set names, each
+ -- specifying a set of elements. Each of the elements is to be
+ -- treated as an elementRequest in the form of simpleElement,
+ -- where occurrence is 1.
+ defaultVariantSetId [2] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ -- If supplied, applies whenever variantRequest
+ -- does not include variantSetId.
+ defaultVariantRequest [3] IMPLICIT Variant OPTIONAL,
+ -- If supplied, then for each simple elementRequest that does not
+ -- include a variantRequest, the defaultVariantRequest applies.
+ -- (defaultVariantRequest does not apply to a compositeRequest.)
+ defaultTagType [4] IMPLICIT INTEGER OPTIONAL,
+ -- If supplied, applies whenever 'tagType' (within 'tag' within TagPath)
+ -- is omitted.
+ elements [5] IMPLICIT SEQUENCE OF ElementRequest OPTIONAL}
+--
+
+ElementRequest::= CHOICE{
+ simpleElement [1] IMPLICIT SimpleElement,
+ compositeElement [2] IMPLICIT SEQUENCE{
+ elementList [1] CHOICE{
+ primitives [1] IMPLICIT SEQUENCE OF InternationalString,
+ -- Origin may specify one or more element
+ -- set names, each identifying a set of elements,
+ -- and the composite element is the union.
+ specs [2] IMPLICIT SEQUENCE OF SimpleElement},
+
+ deliveryTag [2] IMPLICIT TagPath,
+ -- DeliveryTag tagPath for compositeElement may not
+ -- include wildThing or wildPath.
+ variantRequest [3] IMPLICIT Variant OPTIONAL}}
+
+SimpleElement ::= SEQUENCE{
+ path [1] IMPLICIT TagPath,
+ variantRequest [2] IMPLICIT Variant OPTIONAL}
+
+
+TagPath ::= SEQUENCE OF CHOICE{
+ specificTag [1] IMPLICIT SEQUENCE{
+ tagType [1] IMPLICIT INTEGER OPTIONAL,
+ -- If omitted, then 'defaultTagType' (above) applies, if supplied, and
+ -- if not supplied, then default listed in schema applies.
+ tagValue [2] StringOrNumeric,
+ occurrence [3] Occurrences OPTIONAL
+ -- default is "first occurrence"
+ },
+ wildThing [2] Occurrences,
+ -- Get Nth "thing" at this level, regardless of tag, for each N specified by
+ -- "Occurrences" (which may be 'all' meaning match every element at this level).
+ -- E.g., if "Occurrences" is 3, get third element regardless of its tag or the tag of
+ -- the first two elements.
+ wildPath [3] IMPLICIT NULL
+ -- Match any tag, at this level or below, that is on a path for which next tag in this
+ -- TagPath sequence occurs. WildPath may not be last member of the TagPath
+ -- sequence.
+ }
+--
+
+Occurrences ::= CHOICE{
+ all [1] IMPLICIT NULL,
+ last [2] IMPLICIT NULL,
+ values [3] IMPLICIT SEQUENCE{
+ start [1] IMPLICIT INTEGER,
+ -- if 'start' alone is included, then single occurrence is requested
+ howMany [2] IMPLICIT INTEGER OPTIONAL
+ -- For example, if 'start' is 5 and 'howMany' is 6, then request is for
+ -- "occurrences 5 through 10."
+ }}
+END
+
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: zgdu.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#include <yaz/odr.h>
+#include <yaz/yaz-version.h>
+#include <yaz/zgdu.h>
+
+static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
+ char **content_buf, int *content_len)
+{
+ int i = off;
+
+ *headers = 0;
+ while (i < o->size-1 && o->buf[i] == '\r')
+ {
+ int po;
+ i++;
+ if (o->buf[i] != '\n')
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i++;
+ if (o->buf[i] == '\r')
+ break;
+ for (po = i; ; i++)
+ {
+ if (i == o->size)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ else if (o->buf[i] == ':')
+ break;
+ }
+ *headers = (Z_HTTP_Header *) odr_malloc(o, sizeof(**headers));
+ (*headers)->name = (char*) odr_malloc(o, i - po + 1);
+ memcpy ((*headers)->name, o->buf + po, i - po);
+ (*headers)->name[i - po] = '\0';
+ i++;
+ while (i < o->size-1 && o->buf[i] == ' ')
+ i++;
+ for (po = i; i < o->size-1 && o->buf[i] != '\r' ; i++)
+ ;
+
+ (*headers)->value = (char*) odr_malloc(o, i - po + 1);
+ memcpy ((*headers)->value, o->buf + po, i - po);
+ (*headers)->value[i - po] = '\0';
+
+ headers = &(*headers)->next;
+ }
+ *headers = 0;
+ i++;
+ if (o->buf[i] != '\n')
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i++;
+
+ if (i > o->size)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ else if (i == o->size)
+ {
+ *content_buf = 0;
+ *content_len = 0;
+ }
+ else
+ {
+ *content_len = o->size - i;
+ *content_buf = (char*) odr_malloc(o, *content_len + 1);
+ memcpy(*content_buf, o->buf + i, *content_len);
+ (*content_buf)[*content_len] = '\0';
+ }
+ return 1;
+}
+
+void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n,
+ const char *v)
+{
+ while (*hp)
+ hp = &(*hp)->next;
+ *hp = (Z_HTTP_Header *) odr_malloc(o, sizeof(**hp));
+ (*hp)->name = odr_strdup(o, n);
+ (*hp)->value = odr_strdup(o, v);
+ (*hp)->next = 0;
+}
+
+const char *z_HTTP_header_lookup(Z_HTTP_Header *hp, const char *n)
+{
+ for (; hp; hp = hp->next)
+ if (!strcmp(hp->name, n))
+ return hp->value;
+ return 0;
+}
+
+
+Z_GDU *z_get_HTTP_Request(ODR o)
+{
+ Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p));
+ Z_HTTP_Request *hreq;
+
+ p->which = Z_GDU_HTTP_Request;
+ p->u.HTTP_Request = (Z_HTTP_Request *) odr_malloc(o, sizeof(*hreq));
+ hreq = p->u.HTTP_Request;
+ hreq->headers = 0;
+ hreq->content_len = 0;
+ hreq->content_buf = 0;
+ hreq->version = "1.1";
+ hreq->method = "POST";
+ hreq->path = "/";
+ z_HTTP_header_add(o, &hreq->headers, "User-Agent",
+ "YAZ/" YAZ_VERSION);
+ return p;
+}
+
+Z_GDU *z_get_HTTP_Response(ODR o, int code)
+{
+ Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p));
+ Z_HTTP_Response *hres;
+
+ p->which = Z_GDU_HTTP_Response;
+ p->u.HTTP_Response = (Z_HTTP_Response *) odr_malloc(o, sizeof(*hres));
+ hres = p->u.HTTP_Response;
+ hres->headers = 0;
+ hres->content_len = 0;
+ hres->content_buf = 0;
+ hres->code = code;
+ hres->version = "1.1";
+ z_HTTP_header_add(o, &hres->headers, "Server",
+ "YAZ/" YAZ_VERSION);
+ if (code != 200)
+ {
+ hres->content_buf = (char*) odr_malloc(o, 400);
+ sprintf (hres->content_buf,
+ "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
+ "<HTML>\n"
+ " <HEAD>\n"
+ " <TITLE>YAZ " YAZ_VERSION "</TITLE>\n"
+ " </HEAD>\n"
+ " <BODY>\n"
+ " <P><A HREF=\"http://www.indexdata.dk/yaz/\">YAZ</A> "
+ YAZ_VERSION "</P>\n"
+ " <P>Error: %d</P>\n"
+ " <P>Description: %.50s</P>\n"
+ " </BODY>\n"
+ "</HTML>\n",
+ code, z_HTTP_errmsg(code));
+ hres->content_len = strlen(hres->content_buf);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
+ }
+ return p;
+}
+
+const char *z_HTTP_errmsg(int code)
+{
+ if (code == 200)
+ return "OK";
+ else if (code == 400)
+ return "Bad Request";
+ else if (code == 404)
+ return "Not Found";
+ else if (code == 405)
+ return "Method Not Allowed";
+ else if (code == 500)
+ return "Internal Error";
+ else
+ return "Unknown Error";
+}
+
+int z_GDU (ODR o, Z_GDU **p, int opt, const char *name)
+{
+ if (o->direction == ODR_DECODE) {
+ *p = (Z_GDU *) odr_malloc(o, sizeof(**p));
+ if (o->size > 10 && !memcmp(o->buf, "HTTP/", 5))
+ {
+ int i, po;
+ Z_HTTP_Response *hr;
+ (*p)->which = Z_GDU_HTTP_Response;
+
+ hr = (*p)->u.HTTP_Response = (Z_HTTP_Response *)
+ odr_malloc(o, sizeof(*hr));
+ po = i = 5;
+ while (i < o->size-2 && o->buf[i] != ' ' && o->buf[i] != '\r')
+ i++;
+ hr->version = (char *) odr_malloc(o, i - po + 1);
+ if (i - po)
+ memcpy(hr->version, o->buf + po, i - po);
+ hr->version[i-po] = 0;
+ if (o->buf[i] != ' ')
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i++;
+ hr->code = 0;
+ while (i < o->size-2 && o->buf[i] >= '0' && o->buf[i] <= '9')
+ {
+ hr->code = hr->code*10 + (o->buf[i] - '0');
+ i++;
+ }
+ while (i < o->size-1 && o->buf[i] != '\r')
+ i++;
+ return decode_headers_content(o, i, &hr->headers,
+ &hr->content_buf, &hr->content_len);
+ }
+ else if (o->size > 5 &&
+ o->buf[0] >= 0x20 && o->buf[0] < 0x7f
+ && o->buf[1] >= 0x20 && o->buf[1] < 0x7f
+ && o->buf[2] >= 0x20 && o->buf[2] < 0x7f
+ && o->buf[3] >= 0x20 && o->buf[3] < 0x7f)
+ {
+ int i, po;
+ Z_HTTP_Request *hr;
+
+ (*p)->which = Z_GDU_HTTP_Request;
+ hr = (*p)->u.HTTP_Request =
+ (Z_HTTP_Request *) odr_malloc(o, sizeof(*hr));
+
+ /* method .. */
+ for (i = 0; o->buf[i] != ' '; i++)
+ if (i >= o->size-5 || i > 30)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ hr->method = (char *) odr_malloc(o, i+1);
+ memcpy (hr->method, o->buf, i);
+ hr->method[i] = '\0';
+ /* path */
+ po = i+1;
+ for (i = po; o->buf[i] != ' '; i++)
+ if (i >= o->size-5)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ hr->path = (char *) odr_malloc(o, i - po + 1);
+ memcpy (hr->path, o->buf+po, i - po);
+ hr->path[i - po] = '\0';
+ /* HTTP version */
+ i++;
+ if (i > o->size-5 || memcmp(o->buf+i, "HTTP/", 5))
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i+= 5;
+ po = i;
+ while (o->buf[i] != '\r')
+ {
+ if (i >= o->size-1)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i++;
+ }
+ hr->version = (char *) odr_malloc(o, i - po + 1);
+ memcpy(hr->version, o->buf + po, i - po);
+ hr->version[i - po] = '\0';
+ /* headers */
+ return decode_headers_content(o, i, &hr->headers,
+ &hr->content_buf, &hr->content_len);
+
+ }
+ else
+ {
+ (*p)->which = Z_GDU_Z3950;
+ return z_APDU(o, &(*p)->u.z3950, opt, 0);
+ }
+ }
+ else /* ENCODE or PRINT */
+ {
+ int top0 = o->top;
+ char sbuf[80];
+ Z_HTTP_Header *h;
+ switch((*p)->which)
+ {
+ case Z_GDU_HTTP_Response:
+ sprintf(sbuf, "HTTP/%s %d %s\r\n", (*p)->u.HTTP_Response->version,
+ (*p)->u.HTTP_Response->code,
+ z_HTTP_errmsg((*p)->u.HTTP_Response->code));
+ odr_write(o, (unsigned char *) sbuf, strlen(sbuf));
+ /* apply Content-Length if not already applied */
+ if (!z_HTTP_header_lookup((*p)->u.HTTP_Response->headers,
+ "Content-Length"))
+ {
+ char lstr[20];
+ sprintf(lstr, "%d", (*p)->u.HTTP_Response->content_len);
+ z_HTTP_header_add(o,
+ &(*p)->u.HTTP_Response->headers,
+ "Content-Length", lstr);
+ }
+ for (h = (*p)->u.HTTP_Response->headers; h; h = h->next)
+ {
+ odr_write(o, (unsigned char *) h->name, strlen(h->name));
+ odr_write(o, (unsigned char *) ": ", 2);
+ odr_write(o, (unsigned char *) h->value, strlen(h->value));
+ odr_write(o, (unsigned char *) "\r\n", 2);
+ }
+ odr_write(o, (unsigned char *) "\r\n", 2);
+ if ((*p)->u.HTTP_Response->content_buf)
+ odr_write(o, (unsigned char *)
+ (*p)->u.HTTP_Response->content_buf,
+ (*p)->u.HTTP_Response->content_len);
+ if (o->direction == ODR_PRINT)
+ {
+ fprintf(o->print, "-- HTTP response:\n%.*s\n", o->top - top0,
+ o->buf + top0);
+ fprintf(o->print, "-- \n");
+ }
+ break;
+ case Z_GDU_HTTP_Request:
+ odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->method,
+ strlen((*p)->u.HTTP_Request->method));
+ odr_write(o, (unsigned char *) " ", 1);
+ odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->path,
+ strlen((*p)->u.HTTP_Request->path));
+ odr_write(o, (unsigned char *) " HTTP/", 6);
+ odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->version,
+ strlen((*p)->u.HTTP_Request->version));
+ odr_write(o, (unsigned char *) "\r\n", 2);
+ if ((*p)->u.HTTP_Request->content_len &&
+ !z_HTTP_header_lookup((*p)->u.HTTP_Request->headers,
+ "Content-Length"))
+ {
+ char lstr[20];
+ sprintf(lstr, "%d", (*p)->u.HTTP_Request->content_len);
+ z_HTTP_header_add(o,
+ &(*p)->u.HTTP_Request->headers,
+ "Content-Length", lstr);
+ }
+ for (h = (*p)->u.HTTP_Request->headers; h; h = h->next)
+ {
+ odr_write(o, (unsigned char *) h->name, strlen(h->name));
+ odr_write(o, (unsigned char *) ": ", 2);
+ odr_write(o, (unsigned char *) h->value, strlen(h->value));
+ odr_write(o, (unsigned char *) "\r\n", 2);
+ }
+ odr_write(o, (unsigned char *) "\r\n", 2);
+ if ((*p)->u.HTTP_Request->content_buf)
+ odr_write(o, (unsigned char *)
+ (*p)->u.HTTP_Request->content_buf,
+ (*p)->u.HTTP_Request->content_len);
+ if (o->direction == ODR_PRINT)
+ {
+ fprintf(o->print, "-- HTTP request:\n%.*s\n", o->top, o->buf);
+ }
+ break;
+ case Z_GDU_Z3950:
+ return z_APDU(o, &(*p)->u.z3950, opt, 0);
+ }
+ }
+ return 1;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id: zget.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#include <yaz/proto.h>
+
+Z_InitRequest *zget_InitRequest(ODR o)
+{
+ Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
+ ODR_MASK_ZERO(r->options);
+ r->protocolVersion = (Odr_bitmask *)
+ odr_malloc(o, sizeof(*r->protocolVersion));
+
+ ODR_MASK_SET(r->options, Z_Options_search);
+ ODR_MASK_SET(r->options, Z_Options_present);
+
+ ODR_MASK_ZERO(r->protocolVersion);
+
+ ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_1);
+ ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_2);
+
+ r->preferredMessageSize = odr_intdup(o, 30*1024);
+ r->maximumRecordSize = odr_intdup(o, 30*1024);
+ r->idAuthentication = 0;
+ r->implementationId = "81";
+ r->implementationName = "Index Data/YAZ";
+ r->implementationVersion = YAZ_VERSION
+#ifdef YAZ_DATE_STR
+ " (" YAZ_DATE_STR ")"
+#endif
+#ifdef YAZ_OS
+ " " YAZ_OS
+#endif
+ ;
+ r->userInformationField = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_InitResponse *zget_InitResponse(ODR o)
+{
+ Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
+ ODR_MASK_ZERO(r->options);
+ r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
+ ODR_MASK_ZERO(r->protocolVersion);
+ r->preferredMessageSize = odr_intdup(o, 30*1024);
+ r->maximumRecordSize = odr_intdup(o, 30*1024);
+ r->result = odr_intdup(o, 1);
+ r->implementationId = "81";
+ r->implementationName = "Index Data/YAZ";
+ r->implementationVersion = YAZ_VERSION
+#ifdef YAZ_DATE_STR
+ " (" YAZ_DATE_STR ")"
+#endif
+#ifdef YAZ_OS
+ " " YAZ_OS
+#endif
+ ;
+ r->userInformationField = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_SearchRequest *zget_SearchRequest(ODR o)
+{
+ Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->smallSetUpperBound = odr_intdup(o, 0);
+ r->largeSetLowerBound = odr_intdup(o, 1);
+ r->mediumSetPresentNumber = odr_intdup(o, 0);
+ r->replaceIndicator = odr_intdup(o, 1);
+ r->resultSetName = "default";
+ r->num_databaseNames = 0;
+ r->databaseNames = 0;
+ r->smallSetElementSetNames = 0;
+ r->mediumSetElementSetNames = 0;
+ r->preferredRecordSyntax = 0;
+ r->query = 0;
+ r->additionalSearchInfo = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_SearchResponse *zget_SearchResponse(ODR o)
+{
+ Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->resultCount = odr_intdup(o, 0);
+ r->numberOfRecordsReturned = odr_intdup(o, 0);
+ r->nextResultSetPosition = odr_intdup(o, 0);
+ r->searchStatus = odr_intdup(o, 1);
+ r->resultSetStatus = 0;
+ r->presentStatus = 0;
+ r->records = 0;
+ r->additionalSearchInfo = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_PresentRequest *zget_PresentRequest(ODR o)
+{
+ Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->resultSetId = "default";
+ r->resultSetStartPoint = odr_intdup(o, 1);
+ r->numberOfRecordsRequested = odr_intdup(o, 10);
+ r->num_ranges = 0;
+ r->additionalRanges = 0;
+ r->recordComposition = 0;
+ r->preferredRecordSyntax = 0;
+ r->maxSegmentCount = 0;
+ r->maxRecordSize = 0;
+ r->maxSegmentSize = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_PresentResponse *zget_PresentResponse(ODR o)
+{
+ Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->numberOfRecordsReturned = odr_intdup(o, 0);
+ r->nextResultSetPosition = odr_intdup(o, 0);
+ r->presentStatus = odr_intdup(o, Z_PresentStatus_success);
+ r->records = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o)
+{
+ Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->deleteFunction = odr_intdup(o, Z_DeleteRequest_list);
+ r->num_resultSetList = 0;
+ r->resultSetList = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o)
+{
+ Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->deleteOperationStatus = odr_intdup(o, Z_DeleteStatus_success);
+ r->deleteListStatuses = 0;
+ r->numberNotDeleted = 0;
+ r->bulkStatuses = 0;
+ r->deleteMessage = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ScanRequest *zget_ScanRequest(ODR o)
+{
+ Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->num_databaseNames = 0;
+ r->databaseNames = 0;
+ r->attributeSet = 0;
+ r->termListAndStartPoint = 0;
+ r->stepSize = 0;
+ r->numberOfTermsRequested = odr_intdup(o, 20);
+ r->preferredPositionInResponse = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ScanResponse *zget_ScanResponse(ODR o)
+{
+ Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->stepSize = 0;
+ r->scanStatus = odr_intdup(o, Z_Scan_success);
+ r->numberOfEntriesReturned = odr_intdup(o, 0);
+ r->positionOfTerm =0;
+ r->entries = 0;
+ r->attributeSet = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o)
+{
+ Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->requestedAction = odr_intdup(o, Z_TriggerResourceCtrl_resourceReport);
+ r->prefResourceReportFormat = 0;
+ r->resultSetWanted = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o)
+{
+ Z_ResourceControlRequest *r = (Z_ResourceControlRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->suspendedFlag = 0;
+ r->resourceReport = 0;
+ r->partialResultsAvailable = 0;
+ r->responseRequired = odr_intdup(o, 0);
+ r->triggeredRequestFlag = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o)
+{
+ Z_ResourceControlResponse *r = (Z_ResourceControlResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->continueFlag = odr_intdup(o, 1);
+ r->resultSetWanted = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_AccessControlRequest *zget_AccessControlRequest(ODR o)
+{
+ Z_AccessControlRequest *r = (Z_AccessControlRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->which = Z_AccessRequest_simpleForm;
+ r->u.simpleForm = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_AccessControlResponse *zget_AccessControlResponse(ODR o)
+{
+ Z_AccessControlResponse *r = (Z_AccessControlResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->which = Z_AccessResponse_simpleForm;
+ r->u.simpleForm = 0;
+ r->diagnostic = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_Segment *zget_Segment(ODR o)
+{
+ Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->numberOfRecordsReturned = odr_intdup(o, 0);
+ r->num_segmentRecords = 0;
+ r->segmentRecords = (Z_NamePlusRecord **) odr_nullval();
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_Close *zget_Close(ODR o)
+{
+ Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->closeReason = odr_intdup(o, Z_Close_finished);
+ r->diagnosticInformation = 0;
+ r->resourceReportFormat = 0;
+ r->resourceReport = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ResourceReportRequest *zget_ResourceReportRequest(ODR o)
+{
+ Z_ResourceReportRequest *r = (Z_ResourceReportRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->opId = 0;
+ r->prefResourceReportFormat = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o)
+{
+ Z_ResourceReportResponse *r = (Z_ResourceReportResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->resourceReportStatus = odr_intdup(o, Z_ResourceReportStatus_success);
+ r->resourceReport = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_SortRequest *zget_SortRequest(ODR o)
+{
+ Z_SortRequest *r = (Z_SortRequest *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->inputResultSetNames = 0;
+ r->sortedResultSetName = 0;
+ r->sortSequence = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_SortResponse *zget_SortResponse(ODR o)
+{
+ Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->sortStatus = odr_intdup(o, Z_SortStatus_success);
+ r->resultSetStatus = odr_intdup(o, Z_SortResultSetStatus_empty);
+ r->diagnostics = 0;
+ r->resultCount = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o)
+{
+ Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->function = odr_intdup(o, Z_ExtendedServicesRequest_create);
+ r->packageType = 0;
+ r->packageName = 0;
+ r->userId = 0;
+ r->retentionTime = 0;
+ r->permissions = 0;
+ r->description = 0;
+ r->taskSpecificParameters = 0;
+ r->waitAction = odr_intdup(o, Z_ExtendedServicesRequest_waitIfPossible);
+ r->elements = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o)
+{
+ Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->operationStatus = odr_intdup(o, Z_ExtendedServicesResponse_done);
+ r->num_diagnostics = 0;
+ r->diagnostics = 0;
+ r->taskPackage = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_DuplicateDetectionRequest *zget_DuplicateDetectionRequest(ODR o)
+{
+ Z_DuplicateDetectionRequest *r = (Z_DuplicateDetectionRequest *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->num_inputResultSetIds = 0;
+ r->inputResultSetIds = 0;
+ r->outputResultSetName = 0;
+ r->applicablePortionOfRecord = 0;
+ r->num_duplicateDetectionCriteria = 0;
+ r->duplicateDetectionCriteria = 0;
+ r->clustering = 0;
+ r->num_retentionCriteria = 0;
+ r->retentionCriteria = 0;
+ r->num_sortCriteria = 0;
+ r->sortCriteria = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_DuplicateDetectionResponse *zget_DuplicateDetectionResponse(ODR o)
+{
+ Z_DuplicateDetectionResponse *r = (Z_DuplicateDetectionResponse *)
+ odr_malloc(o, sizeof(*r));
+
+ r->referenceId = 0;
+ r->status = odr_intdup(o, Z_DuplicateDetectionResponse_success);
+ r->resultSetCount = 0;
+ r->num_diagnostics = 0;
+ r->diagnostics = 0;
+ r->otherInfo = 0;
+ return r;
+}
+
+Z_APDU *zget_APDU(ODR o, int which)
+{
+ Z_APDU *r = (Z_APDU *)odr_malloc(o, sizeof(*r));
+
+ switch (r->which = which)
+ {
+ case Z_APDU_initRequest:
+ r->u.initRequest = zget_InitRequest(o);
+ break;
+ case Z_APDU_initResponse:
+ r->u.initResponse = zget_InitResponse(o);
+ break;
+ case Z_APDU_searchRequest:
+ r->u.searchRequest = zget_SearchRequest(o);
+ break;
+ case Z_APDU_searchResponse:
+ r->u.searchResponse = zget_SearchResponse(o);
+ break;
+ case Z_APDU_presentRequest:
+ r->u.presentRequest = zget_PresentRequest(o);
+ break;
+ case Z_APDU_presentResponse:
+ r->u.presentResponse = zget_PresentResponse(o);
+ break;
+ case Z_APDU_deleteResultSetRequest:
+ r->u.deleteResultSetRequest = zget_DeleteResultSetRequest(o);
+ break;
+ case Z_APDU_deleteResultSetResponse:
+ r->u.deleteResultSetResponse = zget_DeleteResultSetResponse(o);
+ break;
+ case Z_APDU_scanRequest:
+ r->u.scanRequest = zget_ScanRequest(o);
+ break;
+ case Z_APDU_scanResponse:
+ r->u.scanResponse = zget_ScanResponse(o);
+ break;
+ case Z_APDU_triggerResourceControlRequest:
+ r->u.triggerResourceControlRequest =
+ zget_TriggerResourceControlRequest(o);
+ break;
+ case Z_APDU_resourceControlRequest:
+ r->u.resourceControlRequest = zget_ResourceControlRequest(o);
+ break;
+ case Z_APDU_resourceControlResponse:
+ r->u.resourceControlResponse = zget_ResourceControlResponse(o);
+ break;
+ case Z_APDU_segmentRequest:
+ r->u.segmentRequest = zget_Segment(o);
+ break;
+ case Z_APDU_close:
+ r->u.close = zget_Close(o);
+ break;
+ case Z_APDU_accessControlRequest:
+ r->u.accessControlRequest = zget_AccessControlRequest(o);
+ break;
+ case Z_APDU_accessControlResponse:
+ r->u.accessControlResponse = zget_AccessControlResponse(o);
+ break;
+ case Z_APDU_resourceReportRequest:
+ r->u.resourceReportRequest = zget_ResourceReportRequest(o);
+ break;
+ case Z_APDU_resourceReportResponse:
+ r->u.resourceReportResponse = zget_ResourceReportResponse(o);
+ break;
+ case Z_APDU_sortRequest:
+ r->u.sortRequest = zget_SortRequest(o);
+ break;
+ case Z_APDU_sortResponse:
+ r->u.sortResponse = zget_SortResponse(o);
+ break;
+ case Z_APDU_extendedServicesRequest:
+ r->u.extendedServicesRequest = zget_ExtendedServicesRequest(o);
+ break;
+ case Z_APDU_extendedServicesResponse:
+ r->u.extendedServicesResponse = zget_ExtendedServicesResponse(o);
+ break;
+ case Z_APDU_duplicateDetectionRequest:
+ r->u.duplicateDetectionRequest = zget_DuplicateDetectionRequest(o);
+ break;
+ case Z_APDU_duplicateDetectionResponse:
+ r->u.duplicateDetectionResponse = zget_DuplicateDetectionResponse(o);
+ break;
+ default:
+ fprintf(stderr, "Bad APDU-type to zget_APDU");
+ exit(1);
+ }
+ return r;
+}
--- /dev/null
+/*
+ * Copyright (c) 2000-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: zoom-c.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ *
+ * ZOOM layer for C, connections, result sets, queries.
+ */
+#include <assert.h>
+#include <string.h>
+#include "zoom-p.h"
+
+#include <yaz/yaz-util.h>
+#include <yaz/xmalloc.h>
+#include <yaz/otherinfo.h>
+#include <yaz/log.h>
+#include <yaz/pquery.h>
+#include <yaz/marcdisp.h>
+#include <yaz/diagbib1.h>
+#include <yaz/charneg.h>
+#include <yaz/ill.h>
+#include <yaz/srw.h>
+
+#if HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif
+
+typedef enum {
+ zoom_pending,
+ zoom_complete
+} zoom_ret;
+
+static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
+static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
+
+static ZOOM_Event ZOOM_Event_create (int kind)
+{
+ ZOOM_Event event = (ZOOM_Event) xmalloc (sizeof(*event));
+ event->kind = kind;
+ event->next = 0;
+ event->prev = 0;
+ return event;
+}
+
+static void ZOOM_Event_destroy (ZOOM_Event event)
+{
+ xfree (event);
+}
+
+static void ZOOM_connection_put_event (ZOOM_connection c, ZOOM_Event event)
+{
+ if (c->m_queue_back)
+ {
+ c->m_queue_back->prev = event;
+ assert (c->m_queue_front);
+ }
+ else
+ {
+ assert (!c->m_queue_front);
+ c->m_queue_front = event;
+ }
+ event->next = c->m_queue_back;
+ event->prev = 0;
+ c->m_queue_back = event;
+}
+
+static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c)
+{
+ ZOOM_Event event = c->m_queue_front;
+ if (!event)
+ {
+ c->last_event = ZOOM_EVENT_NONE;
+ return 0;
+ }
+ assert (c->m_queue_back);
+ c->m_queue_front = event->prev;
+ if (c->m_queue_front)
+ {
+ assert (c->m_queue_back);
+ c->m_queue_front->next = 0;
+ }
+ else
+ c->m_queue_back = 0;
+ c->last_event = event->kind;
+ return event;
+}
+
+
+static void set_dset_error (ZOOM_connection c, int error,
+ const char *dset,
+ const char *addinfo, const char *addinfo2)
+{
+ xfree (c->addinfo);
+ c->addinfo = 0;
+ c->error = error;
+ c->diagset = dset;
+ if (addinfo && addinfo2)
+ {
+ c->addinfo = xmalloc(strlen(addinfo) + strlen(addinfo2) + 2);
+ strcpy(c->addinfo, addinfo);
+ strcat(c->addinfo, addinfo2);
+ }
+ else if (addinfo)
+ c->addinfo = xstrdup(addinfo);
+ if (error)
+ yaz_log(LOG_DEBUG, "Error %s %s:%d %s %s",
+ c->host_port ? c->host_port : "<>", dset, error,
+ addinfo ? addinfo : "",
+ addinfo2 ? addinfo2 : "");
+}
+
+#if HAVE_XML2
+static void set_HTTP_error (ZOOM_connection c, int error,
+ const char *addinfo, const char *addinfo2)
+{
+ set_dset_error(c, error, "HTTP", addinfo, addinfo2);
+}
+#endif
+
+static void set_ZOOM_error (ZOOM_connection c, int error,
+ const char *addinfo)
+{
+ set_dset_error(c, error, "ZOOM", addinfo, 0);
+}
+
+static void clear_error (ZOOM_connection c)
+{
+
+ switch (c->error)
+ {
+ case ZOOM_ERROR_CONNECT:
+ case ZOOM_ERROR_MEMORY:
+ case ZOOM_ERROR_DECODE:
+ case ZOOM_ERROR_CONNECTION_LOST:
+ case ZOOM_ERROR_INIT:
+ case ZOOM_ERROR_INTERNAL:
+ case ZOOM_ERROR_UNSUPPORTED_PROTOCOL:
+ break;
+ default:
+ set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
+ }
+}
+
+ZOOM_task ZOOM_connection_add_task (ZOOM_connection c, int which)
+{
+ ZOOM_task *taskp = &c->tasks;
+ while (*taskp)
+ taskp = &(*taskp)->next;
+ *taskp = (ZOOM_task) xmalloc (sizeof(**taskp));
+ (*taskp)->running = 0;
+ (*taskp)->which = which;
+ (*taskp)->next = 0;
+ clear_error (c);
+ return *taskp;
+}
+
+ZOOM_task ZOOM_connection_insert_task (ZOOM_connection c, int which)
+{
+ ZOOM_task task = (ZOOM_task) xmalloc (sizeof(*task));
+
+ task->next = c->tasks;
+ c->tasks = task;
+
+ task->running = 0;
+ task->which = which;
+ clear_error (c);
+ return task;
+}
+
+void ZOOM_connection_remove_task (ZOOM_connection c)
+{
+ ZOOM_task task = c->tasks;
+
+ if (task)
+ {
+ c->tasks = task->next;
+ switch (task->which)
+ {
+ case ZOOM_TASK_SEARCH:
+
+ ZOOM_resultset_destroy (task->u.search.resultset);
+ break;
+ case ZOOM_TASK_RETRIEVE:
+ ZOOM_resultset_destroy (task->u.retrieve.resultset);
+ break;
+ case ZOOM_TASK_CONNECT:
+ break;
+ case ZOOM_TASK_SCAN:
+ ZOOM_scanset_destroy (task->u.scan.scan);
+ break;
+ case ZOOM_TASK_PACKAGE:
+ ZOOM_package_destroy (task->u.package);
+ break;
+ default:
+ assert (0);
+ }
+ xfree (task);
+ }
+}
+
+static int ZOOM_connection_exec_task (ZOOM_connection c);
+
+void ZOOM_connection_remove_tasks (ZOOM_connection c)
+{
+ while (c->tasks)
+ ZOOM_connection_remove_task(c);
+}
+
+static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos);
+
+ZOOM_API(ZOOM_connection)
+ZOOM_connection_create (ZOOM_options options)
+{
+ ZOOM_connection c = (ZOOM_connection) xmalloc (sizeof(*c));
+
+ c->proto = PROTO_Z3950;
+ c->cs = 0;
+ c->mask = 0;
+ c->reconnect_ok = 0;
+ c->state = STATE_IDLE;
+ c->addinfo = 0;
+ set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
+ c->buf_in = 0;
+ c->len_in = 0;
+ c->buf_out = 0;
+ c->len_out = 0;
+ c->resultsets = 0;
+
+ c->options = ZOOM_options_create_with_parent(options);
+
+ c->host_port = 0;
+ c->path = 0;
+ c->proxy = 0;
+
+ c->charset = c->lang = 0;
+
+ c->cookie_out = 0;
+ c->cookie_in = 0;
+ c->client_IP = 0;
+ c->tasks = 0;
+
+ c->odr_in = odr_createmem (ODR_DECODE);
+ c->odr_out = odr_createmem (ODR_ENCODE);
+
+ c->async = 0;
+ c->support_named_resultsets = 0;
+ c->last_event = ZOOM_EVENT_NONE;
+
+ c->m_queue_front = 0;
+ c->m_queue_back = 0;
+ return c;
+}
+
+/* set database names. Take local databases (if set); otherwise
+ take databases given in ZURL (if set); otherwise use Default */
+static char **set_DatabaseNames (ZOOM_connection con, ZOOM_options options,
+ int *num)
+{
+ char **databaseNames;
+ const char *c;
+ int no = 2;
+ const char *cp = ZOOM_options_get (options, "databaseName");
+
+ if (!cp || !*cp)
+ {
+ if (strncmp (con->host_port, "unix:", 5) == 0)
+ cp = strchr (con->host_port+5, ':');
+ else
+ cp = strchr (con->host_port, '/');
+ if (cp)
+ cp++;
+ }
+ if (cp)
+ {
+ c = cp;
+ while ((c = strchr(c, '+')))
+ {
+ c++;
+ no++;
+ }
+ }
+ else
+ cp = "Default";
+ databaseNames = (char**)
+ odr_malloc (con->odr_out, no * sizeof(*databaseNames));
+ no = 0;
+ while (*cp)
+ {
+ c = strchr (cp, '+');
+ if (!c)
+ c = cp + strlen(cp);
+ else if (c == cp)
+ {
+ cp++;
+ continue;
+ }
+ /* cp ptr to first char of db name, c is char
+ following db name */
+ databaseNames[no] = (char*) odr_malloc (con->odr_out, 1+c-cp);
+ memcpy (databaseNames[no], cp, c-cp);
+ databaseNames[no++][c-cp] = '\0';
+ cp = c;
+ if (*cp)
+ cp++;
+ }
+ databaseNames[no] = NULL;
+ *num = no;
+ return databaseNames;
+}
+
+ZOOM_API(ZOOM_connection)
+ZOOM_connection_new (const char *host, int portnum)
+{
+ ZOOM_connection c = ZOOM_connection_create (0);
+
+ ZOOM_connection_connect (c, host, portnum);
+ return c;
+}
+
+ZOOM_API(void)
+ZOOM_connection_connect(ZOOM_connection c,
+ const char *host, int portnum)
+{
+ const char *val;
+ ZOOM_task task;
+
+ if (c->cs)
+ {
+ yaz_log (LOG_DEBUG, "reconnect");
+ c->reconnect_ok = 1;
+ return;
+ }
+ yaz_log(LOG_DEBUG, "connect");
+ xfree (c->proxy);
+ val = ZOOM_options_get (c->options, "proxy");
+ if (val && *val)
+ c->proxy = xstrdup (val);
+ else
+ c->proxy = 0;
+
+ xfree (c->charset);
+ val = ZOOM_options_get (c->options, "charset");
+ if (val && *val)
+ c->charset = xstrdup (val);
+ else
+ c->charset = 0;
+
+ xfree (c->lang);
+ val = ZOOM_options_get (c->options, "lang");
+ if (val && *val)
+ c->lang = xstrdup (val);
+ else
+ c->lang = 0;
+
+ xfree (c->host_port);
+ if (portnum)
+ {
+ char hostn[128];
+ sprintf (hostn, "%.80s:%d", host, portnum);
+ c->host_port = xstrdup(hostn);
+ }
+ else
+ c->host_port = xstrdup(host);
+
+ ZOOM_options_set(c->options, "host", c->host_port);
+
+ val = ZOOM_options_get (c->options, "cookie");
+ if (val && *val)
+ c->cookie_out = xstrdup (val);
+
+ val = ZOOM_options_get (c->options, "clientIP");
+ if (val && *val)
+ c->client_IP = xstrdup (val);
+
+ c->async = ZOOM_options_get_bool (c->options, "async", 0);
+
+ set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
+
+ task = ZOOM_connection_add_task (c, ZOOM_TASK_CONNECT);
+
+ if (!c->async)
+ {
+ while (ZOOM_event (1, &c))
+ ;
+ }
+}
+
+ZOOM_API(ZOOM_query)
+ZOOM_query_create(void)
+{
+ ZOOM_query s = (ZOOM_query) xmalloc (sizeof(*s));
+
+ s->refcount = 1;
+ s->z_query = 0;
+ s->sort_spec = 0;
+ s->odr = odr_createmem (ODR_ENCODE);
+ s->query_string = 0;
+
+ return s;
+}
+
+ZOOM_API(void)
+ZOOM_query_destroy(ZOOM_query s)
+{
+ if (!s)
+ return;
+
+ (s->refcount)--;
+ yaz_log (LOG_DEBUG, "ZOOM_query_destroy count=%d", s->refcount);
+ if (s->refcount == 0)
+ {
+ odr_destroy (s->odr);
+ xfree (s);
+ }
+}
+
+ZOOM_API(int)
+ZOOM_query_prefix(ZOOM_query s, const char *str)
+{
+ s->query_string = odr_strdup(s->odr, str);
+ s->z_query = (Z_Query *) odr_malloc (s->odr, sizeof(*s->z_query));
+ s->z_query->which = Z_Query_type_1;
+ s->z_query->u.type_1 = p_query_rpn(s->odr, PROTO_Z3950, str);
+ if (!s->z_query->u.type_1)
+ return -1;
+ return 0;
+}
+
+ZOOM_API(int)
+ZOOM_query_cql(ZOOM_query s, const char *str)
+{
+ Z_External *ext;
+
+ s->query_string = odr_strdup(s->odr, str);
+
+ ext = (Z_External *) odr_malloc(s->odr, sizeof(*ext));
+ ext->direct_reference = odr_getoidbystr(s->odr, "1.2.840.10003.16.2");
+ ext->indirect_reference = 0;
+ ext->descriptor = 0;
+ ext->which = Z_External_CQL;
+ ext->u.cql = s->query_string;
+
+ s->z_query = (Z_Query *) odr_malloc (s->odr, sizeof(*s->z_query));
+ s->z_query->which = Z_Query_type_104;
+ s->z_query->u.type_104 = ext;
+
+ return 0;
+}
+
+ZOOM_API(int)
+ZOOM_query_sortby(ZOOM_query s, const char *criteria)
+{
+ s->sort_spec = yaz_sort_spec (s->odr, criteria);
+ if (!s->sort_spec)
+ return -1;
+ return 0;
+}
+
+static zoom_ret do_write(ZOOM_connection c);
+
+ZOOM_API(void)
+ZOOM_connection_destroy(ZOOM_connection c)
+{
+ ZOOM_resultset r;
+ if (!c)
+ return;
+ if (c->cs)
+ cs_close (c->cs);
+ for (r = c->resultsets; r; r = r->next)
+ r->connection = 0;
+
+ xfree (c->buf_in);
+ xfree (c->addinfo);
+ odr_destroy (c->odr_in);
+ odr_destroy (c->odr_out);
+ ZOOM_options_destroy (c->options);
+ ZOOM_connection_remove_tasks (c);
+ xfree (c->host_port);
+ xfree (c->path);
+ xfree (c->proxy);
+ xfree (c->charset);
+ xfree (c->lang);
+ xfree (c->cookie_out);
+ xfree (c->cookie_in);
+ xfree (c->client_IP);
+ xfree (c);
+}
+
+void ZOOM_resultset_addref (ZOOM_resultset r)
+{
+ if (r)
+ {
+ (r->refcount)++;
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_addref r=%p count=%d",
+ r, r->refcount);
+ }
+}
+ZOOM_resultset ZOOM_resultset_create ()
+{
+ ZOOM_resultset r = (ZOOM_resultset) xmalloc (sizeof(*r));
+
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_create r = %p", r);
+ r->refcount = 1;
+ r->size = 0;
+ r->odr = odr_createmem (ODR_ENCODE);
+ r->start = 0;
+ r->piggyback = 1;
+ r->setname = 0;
+ r->schema = 0;
+ r->count = 0;
+ r->step = 0;
+ r->record_cache = 0;
+ r->r_sort_spec = 0;
+ r->query = 0;
+ r->connection = 0;
+ r->next = 0;
+ return r;
+}
+
+ZOOM_API(ZOOM_resultset)
+ZOOM_connection_search_pqf(ZOOM_connection c, const char *q)
+{
+ ZOOM_resultset r;
+ ZOOM_query s = ZOOM_query_create();
+
+ ZOOM_query_prefix (s, q);
+
+ r = ZOOM_connection_search (c, s);
+ ZOOM_query_destroy (s);
+ return r;
+}
+
+ZOOM_API(ZOOM_resultset)
+ZOOM_connection_search(ZOOM_connection c, ZOOM_query q)
+{
+ ZOOM_resultset r = ZOOM_resultset_create ();
+ ZOOM_task task;
+ const char *cp;
+
+ r->r_sort_spec = q->sort_spec;
+ r->query = q;
+
+ r->options = ZOOM_options_create_with_parent(c->options);
+
+ r->start = ZOOM_options_get_int(r->options, "start", 0);
+ r->count = ZOOM_options_get_int(r->options, "count", 0);
+ r->step = ZOOM_options_get_int(r->options, "step", 0);
+ r->piggyback = ZOOM_options_get_bool (r->options, "piggyback", 1);
+ cp = ZOOM_options_get (r->options, "setname");
+ if (cp)
+ r->setname = xstrdup(cp);
+ cp = ZOOM_options_get (r->options, "schema");
+ if (cp)
+ r->schema = xstrdup(cp);
+
+ r->connection = c;
+
+ r->next = c->resultsets;
+ c->resultsets = r;
+
+ if (c->host_port && c->proto == PROTO_HTTP)
+ {
+ if (!c->cs)
+ {
+ yaz_log(LOG_DEBUG, "NO COMSTACK");
+ ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
+ }
+ else
+ {
+ yaz_log(LOG_DEBUG, "PREPARE FOR RECONNECT");
+ c->reconnect_ok = 1;
+ }
+ }
+
+ task = ZOOM_connection_add_task (c, ZOOM_TASK_SEARCH);
+ task->u.search.resultset = r;
+ ZOOM_resultset_addref (r);
+
+ (q->refcount)++;
+
+ if (!c->async)
+ {
+ while (ZOOM_event (1, &c))
+ ;
+ }
+ return r;
+}
+
+ZOOM_API(void)
+ZOOM_resultset_destroy(ZOOM_resultset r)
+{
+ if (!r)
+ return;
+ (r->refcount)--;
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_destroy r = %p count=%d",
+ r, r->refcount);
+ if (r->refcount == 0)
+ {
+ ZOOM_record_cache rc;
+
+ for (rc = r->record_cache; rc; rc = rc->next)
+ {
+ if (rc->rec.wrbuf_marc)
+ wrbuf_free (rc->rec.wrbuf_marc, 1);
+ if (rc->rec.wrbuf_iconv)
+ wrbuf_free (rc->rec.wrbuf_iconv, 1);
+ if (rc->rec.wrbuf_opac)
+ wrbuf_free (rc->rec.wrbuf_opac, 1);
+ }
+ if (r->connection)
+ {
+ /* remove ourselves from the resultsets in connection */
+ ZOOM_resultset *rp = &r->connection->resultsets;
+ while (1)
+ {
+ assert (*rp); /* we must be in this list!! */
+ if (*rp == r)
+ { /* OK, we're here - take us out of it */
+ *rp = (*rp)->next;
+ break;
+ }
+ rp = &(*rp)->next;
+ }
+ }
+ ZOOM_query_destroy (r->query);
+ ZOOM_options_destroy (r->options);
+ odr_destroy (r->odr);
+ xfree (r->setname);
+ xfree (r->schema);
+ xfree (r);
+ }
+}
+
+ZOOM_API(size_t)
+ZOOM_resultset_size (ZOOM_resultset r)
+{
+ return r->size;
+}
+
+static void do_close (ZOOM_connection c)
+{
+ if (c->cs)
+ cs_close(c->cs);
+ c->cs = 0;
+ c->mask = 0;
+ c->state = STATE_IDLE;
+}
+
+static void ZOOM_resultset_retrieve (ZOOM_resultset r,
+ int force_sync, int start, int count)
+{
+ ZOOM_task task;
+ ZOOM_connection c;
+ const char *cp;
+
+ if (!r)
+ return;
+ c = r->connection;
+ if (!c)
+ return;
+
+ if (c->host_port && c->proto == PROTO_HTTP)
+ {
+ if (!c->cs)
+ {
+ yaz_log(LOG_DEBUG, "NO COMSTACK");
+ ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
+ }
+ else
+ {
+ yaz_log(LOG_DEBUG, "PREPARE FOR RECONNECT");
+ c->reconnect_ok = 1;
+ }
+ }
+ task = ZOOM_connection_add_task (c, ZOOM_TASK_RETRIEVE);
+ task->u.retrieve.resultset = r;
+ task->u.retrieve.start = start;
+ task->u.retrieve.count = count;
+
+ cp = ZOOM_options_get (r->options, "schema");
+ if (cp)
+ {
+ if (!r->schema || strcmp(r->schema, cp))
+ {
+ xfree(r->schema);
+ r->schema = xstrdup(cp);
+ }
+ }
+
+ ZOOM_resultset_addref (r);
+
+ if (!r->connection->async || force_sync)
+ while (r->connection && ZOOM_event (1, &r->connection))
+ ;
+}
+
+ZOOM_API(void)
+ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs,
+ size_t start, size_t count)
+{
+ int force_present = 0;
+
+ if (!r)
+ return ;
+ if (count && recs)
+ force_present = 1;
+ ZOOM_resultset_retrieve (r, force_present, start, count);
+ if (force_present)
+ {
+ size_t i;
+ for (i = 0; i< count; i++)
+ recs[i] = ZOOM_resultset_record_immediate (r, i+start);
+ }
+}
+
+static zoom_ret do_connect (ZOOM_connection c)
+{
+ void *add;
+ const char *effective_host;
+
+ if (c->proxy)
+ effective_host = c->proxy;
+ else
+ effective_host = c->host_port;
+
+ yaz_log (LOG_DEBUG, "do_connect host=%s", effective_host);
+
+ assert (!c->cs);
+ c->cs = cs_create_host (effective_host, 0, &add);
+
+ if (c->cs && c->cs->protocol == PROTO_HTTP)
+ {
+#if HAVE_XML2
+ const char *path = 0;
+
+ c->proto = PROTO_HTTP;
+ cs_get_host_args(c->host_port, &path);
+ xfree(c->path);
+ c->path = xmalloc(strlen(path)+2);
+ c->path[0] = '/';
+ strcpy (c->path+1, path);
+#else
+ set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_PROTOCOL, "SRW");
+ do_close(c);
+ return zoom_complete;
+#endif
+ }
+ if (c->cs)
+ {
+ int ret = cs_connect (c->cs, add);
+ if (ret == 0)
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
+ ZOOM_connection_put_event(c, event);
+ if (c->proto == PROTO_Z3950)
+ ZOOM_connection_send_init(c);
+ else
+ {
+ /* no init request for SRW .. */
+ assert (c->tasks->which == ZOOM_TASK_CONNECT);
+ ZOOM_connection_remove_task (c);
+ c->mask = 0;
+ ZOOM_connection_exec_task (c);
+ }
+ c->state = STATE_ESTABLISHED;
+ return zoom_pending;
+ }
+ else if (ret > 0)
+ {
+ c->state = STATE_CONNECTING;
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
+ return zoom_pending;
+ }
+ }
+ c->state = STATE_IDLE;
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECT, effective_host);
+ return zoom_complete;
+}
+
+int z3950_connection_socket(ZOOM_connection c)
+{
+ if (c->cs)
+ return cs_fileno(c->cs);
+ return -1;
+}
+
+int z3950_connection_mask(ZOOM_connection c)
+{
+ if (c->cs)
+ return c->mask;
+ return 0;
+}
+
+static void otherInfo_attach (ZOOM_connection c, Z_APDU *a, ODR out)
+{
+ int i;
+ for (i = 0; i<200; i++)
+ {
+ size_t len;
+ Z_OtherInformation **oi;
+ char buf[80];
+ const char *val;
+ const char *cp;
+ int oidval;
+
+ sprintf (buf, "otherInfo%d", i);
+ val = ZOOM_options_get (c->options, buf);
+ if (!val)
+ break;
+ cp = strchr (val, ':');
+ if (!cp)
+ continue;
+ len = cp - val;
+ if (len >= sizeof(buf))
+ len = sizeof(buf)-1;
+ memcpy (buf, val, len);
+ buf[len] = '\0';
+ oidval = oid_getvalbyname (buf);
+ if (oidval == VAL_NONE)
+ continue;
+
+ yaz_oi_APDU(a, &oi);
+ yaz_oi_set_string_oidval(oi, out, oidval, 1, cp+1);
+ }
+}
+
+static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out)
+{
+ assert (a);
+ if (c->cookie_out)
+ {
+ Z_OtherInformation **oi;
+ yaz_oi_APDU(a, &oi);
+ yaz_oi_set_string_oidval(oi, out, VAL_COOKIE, 1, c->cookie_out);
+ }
+ if (c->client_IP)
+ {
+ Z_OtherInformation **oi;
+ yaz_oi_APDU(a, &oi);
+ yaz_oi_set_string_oidval(oi, out, VAL_CLIENT_IP, 1, c->client_IP);
+ }
+ otherInfo_attach (c, a, out);
+ if (!z_APDU(out, &a, 0, 0))
+ {
+ FILE *outf = fopen("/tmp/apdu.txt", "a");
+ if (a && outf)
+ {
+ ODR odr_pr = odr_createmem(ODR_PRINT);
+ fprintf (outf, "a=%p\n", a);
+ odr_setprint(odr_pr, outf);
+ z_APDU(odr_pr, &a, 0, 0);
+ odr_destroy(odr_pr);
+ }
+ yaz_log (LOG_DEBUG, "encoding failed");
+ set_ZOOM_error(c, ZOOM_ERROR_ENCODE, 0);
+ odr_reset(out);
+ return -1;
+ }
+
+ return 0;
+}
+
+static zoom_ret send_APDU (ZOOM_connection c, Z_APDU *a)
+{
+ ZOOM_Event event;
+ assert (a);
+ if (encode_APDU(c, a, c->odr_out))
+ return zoom_complete;
+ yaz_log(LOG_DEBUG, "send APDU type=%d", a->which);
+ c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
+ event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
+ ZOOM_connection_put_event (c, event);
+ odr_reset(c->odr_out);
+ return do_write (c);
+}
+
+/* returns 1 if PDU was sent OK (still pending )
+ 0 if PDU was not sent OK (nothing to wait for)
+*/
+
+static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
+{
+ const char *impname;
+ Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_initRequest);
+ Z_InitRequest *ireq = apdu->u.initRequest;
+ Z_IdAuthentication *auth = (Z_IdAuthentication *)
+ odr_malloc(c->odr_out, sizeof(*auth));
+ const char *auth_groupId = ZOOM_options_get (c->options, "group");
+ const char *auth_userId = ZOOM_options_get (c->options, "user");
+ const char *auth_password = ZOOM_options_get (c->options, "pass");
+
+ ODR_MASK_SET(ireq->options, Z_Options_search);
+ ODR_MASK_SET(ireq->options, Z_Options_present);
+ ODR_MASK_SET(ireq->options, Z_Options_scan);
+ ODR_MASK_SET(ireq->options, Z_Options_sort);
+ ODR_MASK_SET(ireq->options, Z_Options_extendedServices);
+ ODR_MASK_SET(ireq->options, Z_Options_namedResultSets);
+
+ ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_1);
+ ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_2);
+ ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_3);
+
+ impname = ZOOM_options_get (c->options, "implementationName");
+ ireq->implementationName =
+ (char *) odr_malloc (c->odr_out, 15 + (impname ? strlen(impname) : 0));
+ strcpy (ireq->implementationName, "");
+ if (impname)
+ {
+ strcat (ireq->implementationName, impname);
+ strcat (ireq->implementationName, "/");
+ }
+ strcat (ireq->implementationName, "ZOOM-C/YAZ");
+
+ *ireq->maximumRecordSize =
+ ZOOM_options_get_int (c->options, "maximumRecordSize", 1024*1024);
+ *ireq->preferredMessageSize =
+ ZOOM_options_get_int (c->options, "preferredMessageSize", 1024*1024);
+
+ if (auth_groupId || auth_password)
+ {
+ Z_IdPass *pass = (Z_IdPass *) odr_malloc(c->odr_out, sizeof(*pass));
+ int i = 0;
+ pass->groupId = 0;
+ if (auth_groupId && *auth_groupId)
+ {
+ pass->groupId = (char *)
+ odr_malloc(c->odr_out, strlen(auth_groupId)+1);
+ strcpy(pass->groupId, auth_groupId);
+ i++;
+ }
+ pass->userId = 0;
+ if (auth_userId && *auth_userId)
+ {
+ pass->userId = (char *)
+ odr_malloc(c->odr_out, strlen(auth_userId)+1);
+ strcpy(pass->userId, auth_userId);
+ i++;
+ }
+ pass->password = 0;
+ if (auth_password && *auth_password)
+ {
+ pass->password = (char *)
+ odr_malloc(c->odr_out, strlen(auth_password)+1);
+ strcpy(pass->password, auth_password);
+ i++;
+ }
+ if (i)
+ {
+ auth->which = Z_IdAuthentication_idPass;
+ auth->u.idPass = pass;
+ ireq->idAuthentication = auth;
+ }
+ }
+ else if (auth_userId)
+ {
+ auth->which = Z_IdAuthentication_open;
+ auth->u.open = (char *)
+ odr_malloc(c->odr_out, strlen(auth_userId)+1);
+ strcpy(auth->u.open, auth_userId);
+ ireq->idAuthentication = auth;
+ }
+ if (c->proxy)
+ yaz_oi_set_string_oidval(&ireq->otherInfo, c->odr_out,
+ VAL_PROXY, 1, c->host_port);
+ if (c->charset||c->lang)
+ {
+ Z_OtherInformation **oi;
+ Z_OtherInformationUnit *oi_unit;
+
+ yaz_oi_APDU(apdu, &oi);
+
+ if ((oi_unit = yaz_oi_update(oi, c->odr_out, NULL, 0, 0)))
+ {
+ ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
+
+ oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
+ oi_unit->information.externallyDefinedInfo =
+ yaz_set_proposal_charneg
+ (c->odr_out,
+ (const char **)&c->charset, (c->charset) ? 1:0,
+ (const char **)&c->lang, (c->lang) ? 1:0, 1);
+ }
+ }
+ assert (apdu);
+ return send_APDU (c, apdu);
+}
+
+#if HAVE_XML2
+static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
+{
+ char ctype[50];
+ Z_SOAP_Handler h[2] = {
+ {"http://www.loc.gov/zing/srw/v1.0/", 0, (Z_SOAP_fun) yaz_srw_codec},
+ {0, 0, 0}
+ };
+ ODR o = odr_createmem(ODR_ENCODE);
+ int ret;
+ Z_SOAP *p = odr_malloc(o, sizeof(*p));
+ Z_GDU *gdu;
+ ZOOM_Event event;
+
+ gdu = z_get_HTTP_Request(c->odr_out);
+ gdu->u.HTTP_Request->path = c->path;
+
+ if (c->host_port)
+ {
+ const char *cp0 = strstr(c->host_port, "://");
+ const char *cp1 = 0;
+ if (cp0)
+ cp0 = cp0+3;
+ else
+ cp0 = c->host_port;
+
+ cp1 = strchr(cp0, '/');
+ if (!cp1)
+ cp1 = cp0+strlen(cp0);
+
+ if (cp0 && cp1)
+ {
+ char *h = odr_malloc(c->odr_out, cp1 - cp0 + 1);
+ memcpy (h, cp0, cp1 - cp0);
+ h[cp1-cp0] = '\0';
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+ "host", h);
+ }
+ }
+
+ strcpy(ctype, "text/xml");
+ if (c->charset && strlen(c->charset) < 20)
+ {
+ strcat(ctype, "; charset=");
+ strcat(ctype, c->charset);
+ }
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+ "Content-Type", ctype);
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+ "SOAPAction", "\"\"");
+ p->which = Z_SOAP_generic;
+ p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
+ p->u.generic->no = 0;
+ p->u.generic->ns = 0;
+ p->u.generic->p = sr;
+ p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+
+ ret = z_soap_codec_enc(o, &p,
+ &gdu->u.HTTP_Request->content_buf,
+ &gdu->u.HTTP_Request->content_len, h,
+ c->charset);
+
+ if (!z_GDU(c->odr_out, &gdu, 0, 0))
+ return zoom_complete;
+ c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
+
+ odr_destroy(o);
+
+ event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
+ ZOOM_connection_put_event (c, event);
+ odr_reset(c->odr_out);
+ return do_write (c);
+}
+#endif
+
+#if HAVE_XML2
+static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
+{
+ int i;
+ ZOOM_resultset resultset = 0;
+ Z_SRW_PDU *sr = 0;
+ const char *recordPacking = 0;
+
+ if (c->error) /* don't continue on error */
+ return zoom_complete;
+ assert (c->tasks);
+ if (c->tasks->which == ZOOM_TASK_SEARCH)
+ {
+ resultset = c->tasks->u.search.resultset;
+ resultset->setname = xstrdup ("default");
+ ZOOM_options_set (resultset->options, "setname", resultset->setname);
+ }
+ else if(c->tasks->which == ZOOM_TASK_RETRIEVE)
+ {
+ resultset = c->tasks->u.retrieve.resultset;
+
+ resultset->start = c->tasks->u.retrieve.start;
+ resultset->count = c->tasks->u.retrieve.count;
+
+ if (resultset->start >= resultset->size)
+ return zoom_complete;
+ if (resultset->start + resultset->count > resultset->size)
+ resultset->count = resultset->size - resultset->start;
+
+ for (i = 0; i<resultset->count; i++)
+ {
+ ZOOM_record rec =
+ record_cache_lookup (resultset, i + resultset->start);
+ if (!rec)
+ break;
+ }
+ if (i == resultset->count)
+ return zoom_complete;
+ }
+ assert(resultset->query);
+
+ sr = yaz_srw_get(c->odr_out, Z_SRW_searchRetrieve_request);
+
+ if (resultset->query->z_query->which == Z_Query_type_104
+ && resultset->query->z_query->u.type_104->which == Z_External_CQL)
+ {
+
+ sr->u.request->query_type = Z_SRW_query_type_cql;
+ sr->u.request->query.cql =resultset->query->z_query->u.type_104->u.cql;
+ }
+ else if (resultset->query->z_query->which == Z_Query_type_1 &&
+ resultset->query->z_query->u.type_1)
+ {
+ sr->u.request->query_type = Z_SRW_query_type_pqf;
+ sr->u.request->query.pqf = resultset->query->query_string;
+ }
+ else
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_QUERY, 0);
+ return zoom_complete;
+ }
+ sr->u.request->startRecord = odr_intdup (c->odr_out, resultset->start + 1);
+ sr->u.request->maximumRecords = odr_intdup (
+ c->odr_out, resultset->step>0 ? resultset->step : resultset->count);
+ sr->u.request->recordSchema = resultset->schema;
+
+ recordPacking = ZOOM_resultset_option_get (resultset, "recordPacking");
+
+ if (recordPacking)
+ sr->u.request->recordPacking = odr_strdup(c->odr_out, recordPacking);
+
+ return send_srw(c, sr);
+}
+#else
+static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
+{
+ return zoom_complete;
+}
+#endif
+
+static zoom_ret ZOOM_connection_send_search (ZOOM_connection c)
+{
+ ZOOM_resultset r;
+ int lslb, ssub, mspn;
+ const char *syntax;
+ Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_searchRequest);
+ Z_SearchRequest *search_req = apdu->u.searchRequest;
+ const char *elementSetName;
+ const char *smallSetElementSetName;
+ const char *mediumSetElementSetName;
+
+ assert (c->tasks);
+ assert (c->tasks->which == ZOOM_TASK_SEARCH);
+
+ r = c->tasks->u.search.resultset;
+
+ elementSetName =
+ ZOOM_options_get (r->options, "elementSetName");
+ smallSetElementSetName =
+ ZOOM_options_get (r->options, "smallSetElementSetName");
+ mediumSetElementSetName =
+ ZOOM_options_get (r->options, "mediumSetElementSetName");
+
+ if (!smallSetElementSetName)
+ smallSetElementSetName = elementSetName;
+
+ if (!mediumSetElementSetName)
+ mediumSetElementSetName = elementSetName;
+
+ assert (r);
+ assert (r->query);
+
+ /* prepare query for the search request */
+ search_req->query = r->query->z_query;
+
+ search_req->databaseNames =
+ set_DatabaseNames (c, r->options, &search_req->num_databaseNames);
+
+ /* get syntax (no need to provide unless piggyback is in effect) */
+ syntax = ZOOM_options_get (r->options, "preferredRecordSyntax");
+
+ lslb = ZOOM_options_get_int (r->options, "largeSetLowerBound", -1);
+ ssub = ZOOM_options_get_int (r->options, "smallSetUpperBound", -1);
+ mspn = ZOOM_options_get_int (r->options, "mediumSetPresentNumber", -1);
+ if (lslb != -1 && ssub != -1 && mspn != -1)
+ {
+ /* So're a Z39.50 expert? Let's hope you don't do sort */
+ *search_req->largeSetLowerBound = lslb;
+ *search_req->smallSetUpperBound = ssub;
+ *search_req->mediumSetPresentNumber = mspn;
+ }
+ else if (r->start == 0 && r->count > 0
+ && r->piggyback && !r->r_sort_spec && !r->schema)
+ {
+ /* Regular piggyback - do it unless we're going to do sort */
+ *search_req->largeSetLowerBound = 2000000000;
+ *search_req->smallSetUpperBound = 1;
+ *search_req->mediumSetPresentNumber = r->step>0 ? r->step : r->count;
+ }
+ else
+ {
+ /* non-piggyback. Need not provide elementsets or syntaxes .. */
+ smallSetElementSetName = 0;
+ mediumSetElementSetName = 0;
+ syntax = 0;
+ }
+ if (smallSetElementSetName && *smallSetElementSetName)
+ {
+ Z_ElementSetNames *esn = (Z_ElementSetNames *)
+ odr_malloc (c->odr_out, sizeof(*esn));
+
+ esn->which = Z_ElementSetNames_generic;
+ esn->u.generic = odr_strdup (c->odr_out, smallSetElementSetName);
+ search_req->smallSetElementSetNames = esn;
+ }
+ if (mediumSetElementSetName && *mediumSetElementSetName)
+ {
+ Z_ElementSetNames *esn = (Z_ElementSetNames *)
+ odr_malloc (c->odr_out, sizeof(*esn));
+
+ esn->which = Z_ElementSetNames_generic;
+ esn->u.generic = odr_strdup (c->odr_out, mediumSetElementSetName);
+ search_req->mediumSetElementSetNames = esn;
+ }
+ if (syntax)
+ search_req->preferredRecordSyntax =
+ yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, syntax);
+
+ if (!r->setname)
+ {
+ if (c->support_named_resultsets)
+ {
+ char setname[14];
+ int ord;
+ /* find the lowest unused ordinal so that we re-use
+ result sets on the server. */
+ for (ord = 1; ; ord++)
+ {
+ ZOOM_resultset rp;
+ sprintf (setname, "%d", ord);
+ for (rp = c->resultsets; rp; rp = rp->next)
+ if (rp->setname && !strcmp (rp->setname, setname))
+ break;
+ if (!rp)
+ break;
+ }
+ r->setname = xstrdup (setname);
+ yaz_log (LOG_DEBUG, "allocating set %s", r->setname);
+ }
+ else
+ r->setname = xstrdup ("default");
+ ZOOM_options_set (r->options, "setname", r->setname);
+ }
+ search_req->resultSetName = odr_strdup(c->odr_out, r->setname);
+ /* send search request */
+ return send_APDU (c, apdu);
+}
+
+static void response_diag (ZOOM_connection c, Z_DiagRec *p)
+{
+ int oclass;
+ Z_DefaultDiagFormat *r;
+ char *addinfo = 0;
+
+ xfree (c->addinfo);
+ c->addinfo = 0;
+ if (p->which != Z_DiagRec_defaultFormat)
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ return;
+ }
+ r = p->u.defaultFormat;
+ switch (r->which)
+ {
+ case Z_DefaultDiagFormat_v2Addinfo:
+ addinfo = r->u.v2Addinfo;
+ break;
+ case Z_DefaultDiagFormat_v3Addinfo:
+ addinfo = r->u.v3Addinfo;
+ break;
+ }
+ set_dset_error(c, *r->condition,
+ yaz_z3950oid_to_str(r->diagnosticSetId, &oclass),
+ addinfo, 0);
+}
+
+ZOOM_API(ZOOM_record)
+ZOOM_record_clone (ZOOM_record srec)
+{
+ char *buf;
+ int size;
+ ODR odr_enc;
+ ZOOM_record nrec;
+
+ odr_enc = odr_createmem(ODR_ENCODE);
+ if (!z_NamePlusRecord (odr_enc, &srec->npr, 0, 0))
+ return 0;
+ buf = odr_getbuf (odr_enc, &size, 0);
+
+ nrec = (ZOOM_record) xmalloc (sizeof(*nrec));
+ nrec->odr = odr_createmem(ODR_DECODE);
+ nrec->wrbuf_marc = 0;
+ nrec->wrbuf_iconv = 0;
+ nrec->wrbuf_opac = 0;
+ odr_setbuf (nrec->odr, buf, size, 0);
+ z_NamePlusRecord (nrec->odr, &nrec->npr, 0, 0);
+
+ odr_destroy (odr_enc);
+ return nrec;
+}
+
+ZOOM_API(ZOOM_record)
+ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos)
+{
+ return record_cache_lookup (s, pos);
+}
+
+ZOOM_API(ZOOM_record)
+ZOOM_resultset_record (ZOOM_resultset r, size_t pos)
+{
+ ZOOM_record rec = ZOOM_resultset_record_immediate(r, pos);
+
+ if (!rec)
+ {
+ ZOOM_resultset_retrieve (r, 1, pos, 1);
+ rec = ZOOM_resultset_record_immediate (r, pos);
+ }
+ return rec;
+}
+
+ZOOM_API(void)
+ZOOM_record_destroy (ZOOM_record rec)
+{
+ if (!rec)
+ return;
+ if (rec->wrbuf_marc)
+ wrbuf_free (rec->wrbuf_marc, 1);
+ if (rec->wrbuf_iconv)
+ wrbuf_free (rec->wrbuf_iconv, 1);
+ if (rec->wrbuf_opac)
+ wrbuf_free (rec->wrbuf_opac, 1);
+ odr_destroy (rec->odr);
+ xfree (rec);
+}
+
+static const char *record_iconv_return(ZOOM_record rec, int *len,
+ const char *buf, int sz,
+ const char *record_charset)
+{
+ char to[40];
+ char from[40];
+ yaz_iconv_t cd = 0;
+
+ *from = '\0';
+ strcpy(to, "UTF-8");
+ if (record_charset && *record_charset)
+ {
+ /* Use "from,to" or just "from" */
+ const char *cp =strchr(record_charset, ',');
+ int clen = strlen(record_charset);
+ if (cp && cp[1])
+ {
+ strncpy( to, cp+1, sizeof(to)-1);
+ to[sizeof(to)-1] = '\0';
+ clen = cp - record_charset;
+ }
+ if (clen > sizeof(from)-1)
+ clen = sizeof(from)-1;
+
+ if (clen)
+ strncpy(from, record_charset, clen);
+ from[clen] = '\0';
+ }
+
+ if (*from && *to && (cd = yaz_iconv_open(to, from)))
+ {
+ char outbuf[12];
+ size_t inbytesleft = sz;
+ const char *inp = buf;
+
+ if (!rec->wrbuf_iconv)
+ rec->wrbuf_iconv = wrbuf_alloc();
+
+ wrbuf_rewind(rec->wrbuf_iconv);
+
+ while (inbytesleft)
+ {
+ size_t outbytesleft = sizeof(outbuf);
+ char *outp = outbuf;
+ size_t r = yaz_iconv (cd, (char**) &inp,
+ &inbytesleft,
+ &outp, &outbytesleft);
+ if (r == (size_t) (-1))
+ {
+ int e = yaz_iconv_error(cd);
+ if (e != YAZ_ICONV_E2BIG)
+ break;
+ }
+ wrbuf_write(rec->wrbuf_iconv, outbuf, outp - outbuf);
+ }
+ wrbuf_puts(rec->wrbuf_iconv, "");
+ buf = wrbuf_buf(rec->wrbuf_iconv);
+ sz = wrbuf_len(rec->wrbuf_iconv);
+ yaz_iconv_close(cd);
+ }
+ if (len)
+ *len = sz;
+ return buf;
+}
+
+ZOOM_API(const char *)
+ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
+{
+ char type[40];
+ char charset[40];
+ const char *cp;
+ int i;
+ Z_NamePlusRecord *npr;
+
+ if (len)
+ *len = 0; /* default return */
+
+ if (!rec)
+ return 0;
+ npr = rec->npr;
+ if (!npr)
+ return 0;
+
+ cp = type_spec;
+ for (i = 0; cp[i] && i < sizeof(type)-1; i++)
+ {
+ if (cp[i] == ';' || cp[i] == ' ')
+ break;
+ type[i] = cp[i];
+ }
+ type[i] = '\0';
+ charset[0] = '\0';
+ if (type_spec[i] == ';')
+ {
+ i++;
+ while (type_spec[i] == ' ')
+ i++;
+ if (!strncmp(type_spec+i, "charset=", 8))
+ {
+ cp = type_spec+i+8;
+ for (i = 0; cp[i] && i < sizeof(charset)-1; i++)
+ {
+ if (cp[i] == ';' || cp[i] == ' ')
+ break;
+ charset[i] = cp[i];
+ }
+ charset[i] = '\0';
+ }
+ }
+
+ if (!strcmp (type, "database"))
+ {
+ if (len)
+ *len = (npr->databaseName ? strlen(npr->databaseName) : 0);
+ return npr->databaseName;
+ }
+ else if (!strcmp (type, "syntax"))
+ {
+ const char *desc = 0;
+ if (npr->which == Z_NamePlusRecord_databaseRecord)
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+ oident *ent = oid_getentbyoid(r->direct_reference);
+ if (ent)
+ desc = ent->desc;
+ }
+ if (!desc)
+ desc = "none";
+ if (len)
+ *len = strlen(desc);
+ return desc;
+ }
+ else if (!strcmp (type, "render") &&
+ npr->which == Z_NamePlusRecord_databaseRecord)
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+ oident *ent = oid_getentbyoid(r->direct_reference);
+
+ /* render bibliographic record .. */
+ if (r->which == Z_External_OPAC)
+ {
+ r = r->u.opac->bibliographicRecord;
+ if (!r)
+ return 0;
+ ent = oid_getentbyoid(r->direct_reference);
+ }
+ if (r->which == Z_External_sutrs)
+ return record_iconv_return(rec, len,
+ r->u.sutrs->buf, r->u.sutrs->len,
+ charset);
+ else if (r->which == Z_External_octet)
+ {
+ yaz_marc_t mt;
+ switch (ent->value)
+ {
+ case VAL_SOIF:
+ case VAL_HTML:
+ case VAL_SUTRS:
+ break;
+ case VAL_TEXT_XML:
+ case VAL_APPLICATION_XML:
+ break;
+ default:
+ if (!rec->wrbuf_marc)
+ rec->wrbuf_marc = wrbuf_alloc();
+
+ mt = yaz_marc_create();
+ wrbuf_rewind (rec->wrbuf_marc);
+ if (yaz_marc_decode_wrbuf (
+ mt, (const char *) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len,
+ rec->wrbuf_marc) > 0)
+ {
+ yaz_marc_destroy(mt);
+ return record_iconv_return(rec, len,
+ wrbuf_buf(rec->wrbuf_marc),
+ wrbuf_len(rec->wrbuf_marc),
+ charset);
+ }
+ yaz_marc_destroy(mt);
+ }
+ return record_iconv_return(rec, len,
+ (const char *) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len,
+ charset);
+ }
+ else if (r->which == Z_External_grs1)
+ {
+ if (!rec->wrbuf_marc)
+ rec->wrbuf_marc = wrbuf_alloc();
+ wrbuf_rewind (rec->wrbuf_marc);
+ yaz_display_grs1(rec->wrbuf_marc, r->u.grs1, 0);
+ return record_iconv_return(rec, len,
+ wrbuf_buf(rec->wrbuf_marc),
+ wrbuf_len(rec->wrbuf_marc),
+ charset);
+ }
+ return 0;
+ }
+ else if (npr->which == Z_NamePlusRecord_databaseRecord &&
+ (!strcmp (type, "xml") || !strcmp(type, "oai")))
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+ oident *ent = oid_getentbyoid(r->direct_reference);
+
+ /* render bibliographic record .. */
+ if (r->which == Z_External_OPAC)
+ {
+ r = r->u.opac->bibliographicRecord;
+ if (!r)
+ return 0;
+ ent = oid_getentbyoid(r->direct_reference);
+ }
+
+ if (r->which == Z_External_sutrs)
+ return record_iconv_return(rec, len,
+ (const char *) r->u.sutrs->buf,
+ r->u.sutrs->len,
+ charset);
+ else if (r->which == Z_External_octet)
+ {
+ yaz_marc_t mt;
+ int marc_decode_type = YAZ_MARC_MARCXML;
+
+ if (!strcmp(type, "oai"))
+ marc_decode_type = YAZ_MARC_OAIMARC;
+ switch (ent->value)
+ {
+ case VAL_SOIF:
+ case VAL_HTML:
+ case VAL_SUTRS:
+ break;
+ case VAL_TEXT_XML:
+ case VAL_APPLICATION_XML:
+ break;
+ default:
+ if (!rec->wrbuf_marc)
+ rec->wrbuf_marc = wrbuf_alloc();
+ wrbuf_rewind (rec->wrbuf_marc);
+ mt = yaz_marc_create();
+
+ yaz_marc_xml(mt, YAZ_MARC_MARCXML);
+ if (yaz_marc_decode_wrbuf (
+ mt, (const char *) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len,
+ rec->wrbuf_marc) > 0)
+ {
+ yaz_marc_destroy(mt);
+ return record_iconv_return(rec, len,
+ wrbuf_buf(rec->wrbuf_marc),
+ wrbuf_len(rec->wrbuf_marc),
+ charset);
+ }
+ yaz_marc_destroy(mt);
+ }
+ return record_iconv_return(rec, len,
+ (const char *) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len,
+ charset);
+ }
+ else if (r->which == Z_External_grs1)
+ {
+ if (len) *len = 5;
+ return "GRS-1";
+ }
+ return 0;
+ }
+ else if (!strcmp (type, "raw"))
+ {
+ if (npr->which == Z_NamePlusRecord_databaseRecord)
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+
+ if (r->which == Z_External_sutrs)
+ {
+ if (len) *len = r->u.sutrs->len;
+ return (const char *) r->u.sutrs->buf;
+ }
+ else if (r->which == Z_External_octet)
+ {
+ if (len) *len = r->u.octet_aligned->len;
+ return (const char *) r->u.octet_aligned->buf;
+ }
+ else /* grs-1, explain, OPAC, ... */
+ {
+ if (len) *len = -1;
+ return (const char *) npr->u.databaseRecord;
+ }
+ }
+ return 0;
+ }
+ else if (!strcmp (type, "ext"))
+ {
+ if (npr->which == Z_NamePlusRecord_databaseRecord)
+ return (const char *) npr->u.databaseRecord;
+ return 0;
+ }
+ else if (npr->which == Z_NamePlusRecord_databaseRecord &&
+ !strcmp (type, "opac"))
+
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+ if (r->which == Z_External_OPAC)
+ {
+ if (!rec->wrbuf_opac)
+ rec->wrbuf_opac = wrbuf_alloc();
+ wrbuf_rewind (rec->wrbuf_opac);
+ yaz_display_OPAC(rec->wrbuf_opac, r->u.opac, 0);
+ return record_iconv_return(rec, len,
+ wrbuf_buf(rec->wrbuf_opac),
+ wrbuf_len(rec->wrbuf_opac),
+ charset);
+ }
+ }
+ return 0;
+}
+
+static int strcmp_null(const char *v1, const char *v2)
+{
+ if (!v1 && !v2)
+ return 0;
+ if (!v1 || !v2)
+ return -1;
+ return strcmp(v1, v2);
+}
+
+static void record_cache_add (ZOOM_resultset r, Z_NamePlusRecord *npr,
+ int pos)
+{
+ ZOOM_record_cache rc;
+ const char *elementSetName =
+ ZOOM_resultset_option_get (r, "elementSetName");
+ const char *syntax =
+ ZOOM_resultset_option_get (r, "preferredRecordSyntax");
+
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
+ ZOOM_connection_put_event(r->connection, event);
+
+ for (rc = r->record_cache; rc; rc = rc->next)
+ {
+ if (pos == rc->pos)
+ {
+ if (strcmp_null(r->schema, rc->schema))
+ continue;
+ if (strcmp_null(elementSetName,rc->elementSetName))
+ continue;
+ if (strcmp_null(syntax, rc->syntax))
+ continue;
+ /* not destroying rc->npr (it's handled by nmem )*/
+ rc->rec.npr = npr;
+ /* keeping wrbuf_marc too */
+ return;
+ }
+ }
+ rc = (ZOOM_record_cache) odr_malloc (r->odr, sizeof(*rc));
+ rc->rec.npr = npr;
+ rc->rec.odr = 0;
+ rc->rec.wrbuf_marc = 0;
+ rc->rec.wrbuf_iconv = 0;
+ rc->rec.wrbuf_opac = 0;
+ if (elementSetName)
+ rc->elementSetName = odr_strdup (r->odr, elementSetName);
+ else
+ rc->elementSetName = 0;
+
+ if (syntax)
+ rc->syntax = odr_strdup (r->odr, syntax);
+ else
+ rc->syntax = 0;
+
+ if (r->schema)
+ rc->schema = odr_strdup (r->odr, r->schema);
+ else
+ rc->schema = 0;
+
+ rc->pos = pos;
+ rc->next = r->record_cache;
+ r->record_cache = rc;
+}
+
+static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos)
+{
+ ZOOM_record_cache rc;
+ const char *elementSetName =
+ ZOOM_resultset_option_get (r, "elementSetName");
+ const char *syntax =
+ ZOOM_resultset_option_get (r, "preferredRecordSyntax");
+
+ for (rc = r->record_cache; rc; rc = rc->next)
+ {
+ if (pos == rc->pos)
+ {
+ if (strcmp_null(r->schema, rc->schema))
+ continue;
+ if (strcmp_null(elementSetName,rc->elementSetName))
+ continue;
+ if (strcmp_null(syntax, rc->syntax))
+ continue;
+ return &rc->rec;
+ }
+ }
+ return 0;
+}
+
+static void handle_records (ZOOM_connection c, Z_Records *sr,
+ int present_phase)
+{
+ ZOOM_resultset resultset;
+
+ if (!c->tasks)
+ return ;
+ switch (c->tasks->which)
+ {
+ case ZOOM_TASK_SEARCH:
+ resultset = c->tasks->u.search.resultset;
+ break;
+ case ZOOM_TASK_RETRIEVE:
+ resultset = c->tasks->u.retrieve.resultset;
+ break;
+ default:
+ return;
+ }
+ if (sr && sr->which == Z_Records_NSD)
+ {
+ Z_DiagRec dr, *dr_p = &dr;
+ dr.which = Z_DiagRec_defaultFormat;
+ dr.u.defaultFormat = sr->u.nonSurrogateDiagnostic;
+
+ response_diag (c, dr_p);
+ }
+ else if (sr && sr->which == Z_Records_multipleNSD)
+ {
+ if (sr->u.multipleNonSurDiagnostics->num_diagRecs >= 1)
+ response_diag(c, sr->u.multipleNonSurDiagnostics->diagRecs[0]);
+ else
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ }
+ else
+ {
+ if (resultset->count + resultset->start > resultset->size)
+ resultset->count = resultset->size - resultset->start;
+ if (resultset->count < 0)
+ resultset->count = 0;
+ if (sr && sr->which == Z_Records_DBOSD)
+ {
+ int i;
+ NMEM nmem = odr_extract_mem (c->odr_in);
+ Z_NamePlusRecordList *p =
+ sr->u.databaseOrSurDiagnostics;
+ for (i = 0; i<p->num_records; i++)
+ {
+ record_cache_add (resultset, p->records[i],
+ i+ resultset->start);
+ }
+ /* transfer our response to search_nmem .. we need it later */
+ nmem_transfer (resultset->odr->mem, nmem);
+ nmem_destroy (nmem);
+ if (present_phase && p->num_records == 0)
+ {
+ /* present response and we didn't get any records! */
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ }
+ }
+ else if (present_phase)
+ {
+ /* present response and we didn't get any records! */
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ }
+ }
+}
+
+static void handle_present_response (ZOOM_connection c, Z_PresentResponse *pr)
+{
+ handle_records (c, pr->records, 1);
+}
+
+static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr)
+{
+ ZOOM_resultset resultset;
+ ZOOM_Event event;
+
+ yaz_log (LOG_DEBUG, "got search response");
+
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
+ return ;
+
+ event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH);
+ ZOOM_connection_put_event(c, event);
+
+ resultset = c->tasks->u.search.resultset;
+
+ resultset->size = *sr->resultCount;
+ handle_records (c, sr->records, 0);
+}
+
+static void sort_response (ZOOM_connection c, Z_SortResponse *res)
+{
+ if (res->diagnostics && res->num_diagnostics > 0)
+ response_diag (c, res->diagnostics[0]);
+}
+
+static int scan_response (ZOOM_connection c, Z_ScanResponse *res)
+{
+ NMEM nmem = odr_extract_mem (c->odr_in);
+ ZOOM_scanset scan;
+
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_SCAN)
+ return 0;
+ scan = c->tasks->u.scan.scan;
+
+ if (res->entries && res->entries->nonsurrogateDiagnostics)
+ response_diag(c, res->entries->nonsurrogateDiagnostics[0]);
+ scan->scan_response = res;
+ nmem_transfer (scan->odr->mem, nmem);
+ if (res->stepSize)
+ ZOOM_options_set_int (scan->options, "stepSize", *res->stepSize);
+ if (res->positionOfTerm)
+ ZOOM_options_set_int (scan->options, "position", *res->positionOfTerm);
+ if (res->scanStatus)
+ ZOOM_options_set_int (scan->options, "scanStatus", *res->scanStatus);
+ if (res->numberOfEntriesReturned)
+ ZOOM_options_set_int (scan->options, "number",
+ *res->numberOfEntriesReturned);
+ nmem_destroy (nmem);
+ return 1;
+}
+
+static zoom_ret send_sort (ZOOM_connection c)
+{
+ ZOOM_resultset resultset;
+
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
+ return zoom_complete;
+
+ resultset = c->tasks->u.search.resultset;
+
+ if (c->error)
+ {
+ resultset->r_sort_spec = 0;
+ return zoom_complete;
+ }
+ if (resultset->r_sort_spec)
+ {
+ Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_sortRequest);
+ Z_SortRequest *req = apdu->u.sortRequest;
+
+ req->num_inputResultSetNames = 1;
+ req->inputResultSetNames = (Z_InternationalString **)
+ odr_malloc (c->odr_out, sizeof(*req->inputResultSetNames));
+ req->inputResultSetNames[0] =
+ odr_strdup (c->odr_out, resultset->setname);
+ req->sortedResultSetName = odr_strdup (c->odr_out, resultset->setname);
+ req->sortSequence = resultset->r_sort_spec;
+ resultset->r_sort_spec = 0;
+ return send_APDU (c, apdu);
+ }
+ return zoom_complete;
+}
+
+static zoom_ret send_present (ZOOM_connection c)
+{
+ Z_APDU *apdu = 0;
+ Z_PresentRequest *req = 0;
+ int i = 0;
+ const char *syntax = 0;
+ const char *elementSetName = 0;
+ ZOOM_resultset resultset;
+
+ if (!c->tasks)
+ return zoom_complete;
+
+ switch (c->tasks->which)
+ {
+ case ZOOM_TASK_SEARCH:
+ resultset = c->tasks->u.search.resultset;
+ break;
+ case ZOOM_TASK_RETRIEVE:
+ resultset = c->tasks->u.retrieve.resultset;
+ resultset->start = c->tasks->u.retrieve.start;
+ resultset->count = c->tasks->u.retrieve.count;
+
+ if (resultset->start >= resultset->size)
+ return zoom_complete;
+ if (resultset->start + resultset->count > resultset->size)
+ resultset->count = resultset->size - resultset->start;
+ break;
+ default:
+ return zoom_complete;
+ }
+
+ syntax = ZOOM_resultset_option_get (resultset, "preferredRecordSyntax");
+ elementSetName = ZOOM_resultset_option_get (resultset, "elementSetName");
+
+ if (c->error) /* don't continue on error */
+ return zoom_complete;
+ if (resultset->start < 0)
+ return zoom_complete;
+ for (i = 0; i<resultset->count; i++)
+ {
+ ZOOM_record rec =
+ record_cache_lookup (resultset, i + resultset->start);
+ if (!rec)
+ break;
+ }
+ if (i == resultset->count)
+ return zoom_complete;
+
+ apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
+ req = apdu->u.presentRequest;
+
+ resultset->start += i;
+ resultset->count -= i;
+ *req->resultSetStartPoint = resultset->start + 1;
+ *req->numberOfRecordsRequested = resultset->step>0 ?
+ resultset->step : resultset->count;
+ assert (*req->numberOfRecordsRequested > 0);
+
+ if (syntax && *syntax)
+ req->preferredRecordSyntax =
+ yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, syntax);
+
+ if (resultset->schema && *resultset->schema)
+ {
+ Z_RecordComposition *compo = (Z_RecordComposition *)
+ odr_malloc (c->odr_out, sizeof(*compo));
+
+ req->recordComposition = compo;
+ compo->which = Z_RecordComp_complex;
+ compo->u.complex = (Z_CompSpec *)
+ odr_malloc(c->odr_out, sizeof(*compo->u.complex));
+ compo->u.complex->selectAlternativeSyntax = (bool_t *)
+ odr_malloc(c->odr_out, sizeof(bool_t));
+ *compo->u.complex->selectAlternativeSyntax = 0;
+
+ compo->u.complex->generic = (Z_Specification *)
+ odr_malloc(c->odr_out, sizeof(*compo->u.complex->generic));
+
+ compo->u.complex->generic->which = Z_Schema_oid;
+ compo->u.complex->generic->schema.oid = (Odr_oid *)
+ yaz_str_to_z3950oid (c->odr_out, CLASS_SCHEMA, resultset->schema);
+
+ if (!compo->u.complex->generic->schema.oid)
+ {
+ /* OID wasn't a schema! Try record syntax instead. */
+
+ compo->u.complex->generic->schema.oid = (Odr_oid *)
+ yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, resultset->schema);
+ }
+ if (elementSetName && *elementSetName)
+ {
+ compo->u.complex->generic->elementSpec = (Z_ElementSpec *)
+ odr_malloc(c->odr_out, sizeof(Z_ElementSpec));
+ compo->u.complex->generic->elementSpec->which =
+ Z_ElementSpec_elementSetName;
+ compo->u.complex->generic->elementSpec->u.elementSetName =
+ odr_strdup (c->odr_out, elementSetName);
+ }
+ else
+ compo->u.complex->generic->elementSpec = 0;
+ compo->u.complex->num_dbSpecific = 0;
+ compo->u.complex->dbSpecific = 0;
+ compo->u.complex->num_recordSyntax = 0;
+ compo->u.complex->recordSyntax = 0;
+ }
+ else if (elementSetName && *elementSetName)
+ {
+ Z_ElementSetNames *esn = (Z_ElementSetNames *)
+ odr_malloc (c->odr_out, sizeof(*esn));
+ Z_RecordComposition *compo = (Z_RecordComposition *)
+ odr_malloc (c->odr_out, sizeof(*compo));
+
+ esn->which = Z_ElementSetNames_generic;
+ esn->u.generic = odr_strdup (c->odr_out, elementSetName);
+ compo->which = Z_RecordComp_simple;
+ compo->u.simple = esn;
+ req->recordComposition = compo;
+ }
+ req->resultSetId = odr_strdup(c->odr_out, resultset->setname);
+ return send_APDU (c, apdu);
+}
+
+ZOOM_API(ZOOM_scanset)
+ZOOM_connection_scan (ZOOM_connection c, const char *start)
+{
+ ZOOM_scanset scan = (ZOOM_scanset) xmalloc (sizeof(*scan));
+
+ scan->connection = c;
+ scan->odr = odr_createmem (ODR_DECODE);
+ scan->options = ZOOM_options_create_with_parent (c->options);
+ scan->refcount = 1;
+ scan->scan_response = 0;
+
+ if ((scan->termListAndStartPoint =
+ p_query_scan(scan->odr, PROTO_Z3950, &scan->attributeSet,
+ start)))
+ {
+ ZOOM_task task = ZOOM_connection_add_task (c, ZOOM_TASK_SCAN);
+ task->u.scan.scan = scan;
+
+ (scan->refcount)++;
+ if (!c->async)
+ {
+ while (ZOOM_event (1, &c))
+ ;
+ }
+ }
+ return scan;
+}
+
+ZOOM_API(void)
+ZOOM_scanset_destroy (ZOOM_scanset scan)
+{
+ if (!scan)
+ return;
+ (scan->refcount)--;
+ if (scan->refcount == 0)
+ {
+ odr_destroy (scan->odr);
+
+ ZOOM_options_destroy (scan->options);
+ xfree (scan);
+ }
+}
+
+static zoom_ret send_package (ZOOM_connection c)
+{
+ ZOOM_Event event;
+ if (!c->tasks)
+ return zoom_complete;
+ assert (c->tasks->which == ZOOM_TASK_PACKAGE);
+
+ event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
+ ZOOM_connection_put_event (c, event);
+
+ return do_write_ex (c, c->tasks->u.package->buf_out,
+ c->tasks->u.package->len_out);
+}
+
+static zoom_ret send_scan (ZOOM_connection c)
+{
+ ZOOM_scanset scan;
+ Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest);
+ Z_ScanRequest *req = apdu->u.scanRequest;
+ if (!c->tasks)
+ return zoom_complete;
+ assert (c->tasks->which == ZOOM_TASK_SCAN);
+ scan = c->tasks->u.scan.scan;
+
+ req->termListAndStartPoint = scan->termListAndStartPoint;
+ req->attributeSet = scan->attributeSet;
+
+ *req->numberOfTermsRequested =
+ ZOOM_options_get_int(scan->options, "number", 10);
+
+ req->preferredPositionInResponse =
+ odr_intdup (c->odr_out,
+ ZOOM_options_get_int(scan->options, "position", 1));
+
+ req->stepSize =
+ odr_intdup (c->odr_out,
+ ZOOM_options_get_int(scan->options, "stepSize", 0));
+
+ req->databaseNames = set_DatabaseNames (c, scan->options,
+ &req->num_databaseNames);
+
+ return send_APDU (c, apdu);
+}
+
+ZOOM_API(size_t)
+ZOOM_scanset_size (ZOOM_scanset scan)
+{
+ if (!scan || !scan->scan_response || !scan->scan_response->entries)
+ return 0;
+ return scan->scan_response->entries->num_entries;
+}
+
+ZOOM_API(const char *)
+ZOOM_scanset_term (ZOOM_scanset scan, size_t pos,
+ int *occ, int *len)
+{
+ const char *term = 0;
+ size_t noent = ZOOM_scanset_size (scan);
+ Z_ScanResponse *res = scan->scan_response;
+
+ *len = 0;
+ *occ = 0;
+ if (pos >= noent)
+ return 0;
+ if (res->entries->entries[pos]->which == Z_Entry_termInfo)
+ {
+ Z_TermInfo *t = res->entries->entries[pos]->u.termInfo;
+
+ if (t->term->which == Z_Term_general)
+ {
+ term = (const char *) t->term->u.general->buf;
+ *len = t->term->u.general->len;
+ }
+ *occ = t->globalOccurrences ? *t->globalOccurrences : 0;
+ }
+ return term;
+}
+
+ZOOM_API(const char *)
+ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key)
+{
+ return ZOOM_options_get (scan->options, key);
+}
+
+ZOOM_API(void)
+ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (scan->options, key, val);
+}
+
+static Z_APDU *create_es_package (ZOOM_package p, int type)
+{
+ const char *str;
+ Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest);
+ Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+
+ *req->function = Z_ExtendedServicesRequest_create;
+
+ str = ZOOM_options_get(p->options, "package-name");
+ if (str && *str)
+ req->packageName = nmem_strdup (p->odr_out->mem, str);
+
+ str = ZOOM_options_get(p->options, "user-id");
+ if (str)
+ req->userId = nmem_strdup (p->odr_out->mem, str);
+
+ req->packageType = yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
+ type);
+
+ str = ZOOM_options_get(p->options, "function");
+ if (str)
+ {
+ if (!strcmp (str, "create"))
+ *req->function = 1;
+ if (!strcmp (str, "delete"))
+ *req->function = 2;
+ if (!strcmp (str, "modify"))
+ *req->function = 3;
+ }
+ return apdu;
+}
+
+static const char *ill_array_lookup (void *clientData, const char *idx)
+{
+ ZOOM_package p = (ZOOM_package) clientData;
+ return ZOOM_options_get (p->options, idx+4);
+}
+
+static Z_External *encode_ill_request (ZOOM_package p)
+{
+ ODR out = p->odr_out;
+ ILL_Request *req;
+ Z_External *r = 0;
+ struct ill_get_ctl ctl;
+
+ ctl.odr = p->odr_out;
+ ctl.clientData = p;
+ ctl.f = ill_array_lookup;
+
+ req = ill_get_ILLRequest(&ctl, "ill", 0);
+
+ if (!ill_Request (out, &req, 0, 0))
+ {
+ int ill_request_size;
+ char *ill_request_buf = odr_getbuf (out, &ill_request_size, 0);
+ if (ill_request_buf)
+ odr_setbuf (out, ill_request_buf, ill_request_size, 1);
+ return 0;
+ }
+ else
+ {
+ oident oid;
+ int illRequest_size = 0;
+ char *illRequest_buf = odr_getbuf (out, &illRequest_size, 0);
+
+ oid.proto = PROTO_GENERAL;
+ oid.oclass = CLASS_GENERAL;
+ oid.value = VAL_ISO_ILL_1;
+
+ r = (Z_External *) odr_malloc (out, sizeof(*r));
+ r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid));
+ r->indirect_reference = 0;
+ r->descriptor = 0;
+ r->which = Z_External_single;
+
+ r->u.single_ASN1_type = (Odr_oct *)
+ odr_malloc (out, sizeof(*r->u.single_ASN1_type));
+ r->u.single_ASN1_type->buf = (unsigned char*)
+ odr_malloc (out, illRequest_size);
+ r->u.single_ASN1_type->len = illRequest_size;
+ r->u.single_ASN1_type->size = illRequest_size;
+ memcpy (r->u.single_ASN1_type->buf, illRequest_buf, illRequest_size);
+ }
+ return r;
+}
+
+static Z_ItemOrder *encode_item_order(ZOOM_package p)
+{
+ Z_ItemOrder *req = (Z_ItemOrder *) odr_malloc (p->odr_out, sizeof(*req));
+ const char *str;
+
+ req->which=Z_IOItemOrder_esRequest;
+ req->u.esRequest = (Z_IORequest *)
+ odr_malloc(p->odr_out,sizeof(Z_IORequest));
+
+ /* to keep part ... */
+ req->u.esRequest->toKeep = (Z_IOOriginPartToKeep *)
+ odr_malloc(p->odr_out,sizeof(Z_IOOriginPartToKeep));
+ req->u.esRequest->toKeep->supplDescription = 0;
+ req->u.esRequest->toKeep->contact = (Z_IOContact *)
+ odr_malloc (p->odr_out, sizeof(*req->u.esRequest->toKeep->contact));
+
+ str = ZOOM_options_get(p->options, "contact-name");
+ req->u.esRequest->toKeep->contact->name = str ?
+ nmem_strdup (p->odr_out->mem, str) : 0;
+
+ str = ZOOM_options_get(p->options, "contact-phone");
+ req->u.esRequest->toKeep->contact->phone = str ?
+ nmem_strdup (p->odr_out->mem, str) : 0;
+
+ str = ZOOM_options_get(p->options, "contact-email");
+ req->u.esRequest->toKeep->contact->email = str ?
+ nmem_strdup (p->odr_out->mem, str) : 0;
+
+ req->u.esRequest->toKeep->addlBilling = 0;
+
+ /* not to keep part ... */
+ req->u.esRequest->notToKeep = (Z_IOOriginPartNotToKeep *)
+ odr_malloc(p->odr_out,sizeof(Z_IOOriginPartNotToKeep));
+
+ str = ZOOM_options_get(p->options, "itemorder-setname");
+ if (!str)
+ str = "default";
+
+ if (!*str)
+ req->u.esRequest->notToKeep->resultSetItem = 0;
+ else
+ {
+ req->u.esRequest->notToKeep->resultSetItem = (Z_IOResultSetItem *)
+ odr_malloc(p->odr_out, sizeof(Z_IOResultSetItem));
+
+ req->u.esRequest->notToKeep->resultSetItem->resultSetId =
+ nmem_strdup (p->odr_out->mem, str);
+ req->u.esRequest->notToKeep->resultSetItem->item =
+ (int *) odr_malloc(p->odr_out, sizeof(int));
+
+ str = ZOOM_options_get(p->options, "itemorder-item");
+ *req->u.esRequest->notToKeep->resultSetItem->item =
+ (str ? atoi(str) : 1);
+ }
+ req->u.esRequest->notToKeep->itemRequest = encode_ill_request(p);
+
+ return req;
+}
+
+ZOOM_API(void)
+ ZOOM_package_send (ZOOM_package p, const char *type)
+{
+ Z_APDU *apdu = 0;
+ ZOOM_connection c;
+ if (!p)
+ return;
+ c = p->connection;
+ odr_reset (p->odr_out);
+ xfree (p->buf_out);
+ p->buf_out = 0;
+ if (!strcmp(type, "itemorder"))
+ {
+ Z_External *r;
+ apdu = create_es_package (p, VAL_ITEMORDER);
+ if (apdu)
+ {
+ r = (Z_External *) odr_malloc (p->odr_out, sizeof(*r));
+
+ r->direct_reference =
+ yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
+ VAL_ITEMORDER);
+ r->descriptor = 0;
+ r->which = Z_External_itemOrder;
+ r->indirect_reference = 0;
+ r->u.itemOrder = encode_item_order (p);
+
+ apdu->u.extendedServicesRequest->taskSpecificParameters = r;
+ }
+ }
+ if (apdu)
+ {
+ if (encode_APDU(p->connection, apdu, p->odr_out) == 0)
+ {
+ char *buf;
+
+ ZOOM_task task = ZOOM_connection_add_task (c, ZOOM_TASK_PACKAGE);
+ task->u.package = p;
+ buf = odr_getbuf(p->odr_out, &p->len_out, 0);
+ p->buf_out = (char *) xmalloc (p->len_out);
+ memcpy (p->buf_out, buf, p->len_out);
+
+ (p->refcount)++;
+ if (!c->async)
+ {
+ while (ZOOM_event (1, &c))
+ ;
+ }
+ }
+ }
+}
+
+ZOOM_API(ZOOM_package)
+ ZOOM_connection_package (ZOOM_connection c, ZOOM_options options)
+{
+ ZOOM_package p = (ZOOM_package) xmalloc (sizeof(*p));
+
+ p->connection = c;
+ p->odr_out = odr_createmem (ODR_ENCODE);
+ p->options = ZOOM_options_create_with_parent2 (options, c->options);
+ p->refcount = 1;
+ p->buf_out = 0;
+ p->len_out = 0;
+ return p;
+}
+
+ZOOM_API(void)
+ ZOOM_package_destroy(ZOOM_package p)
+{
+ if (!p)
+ return;
+ (p->refcount)--;
+ if (p->refcount == 0)
+ {
+ odr_destroy (p->odr_out);
+ xfree (p->buf_out);
+
+ ZOOM_options_destroy (p->options);
+ xfree (p);
+ }
+}
+
+ZOOM_API(const char *)
+ZOOM_package_option_get (ZOOM_package p, const char *key)
+{
+ return ZOOM_options_get (p->options, key);
+}
+
+
+ZOOM_API(void)
+ZOOM_package_option_set (ZOOM_package p, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (p->options, key, val);
+}
+
+static int ZOOM_connection_exec_task (ZOOM_connection c)
+{
+ ZOOM_task task = c->tasks;
+ zoom_ret ret = zoom_complete;
+
+ if (!task)
+ {
+ yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task task=<null>");
+ return 0;
+ }
+ yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task type=%d run=%d",
+ task->which, task->running);
+ if (c->error != ZOOM_ERROR_NONE)
+ {
+ yaz_log (LOG_DEBUG, "remove tasks because of error = %d", c->error);
+ ZOOM_connection_remove_tasks (c);
+ return 0;
+ }
+ if (task->running)
+ {
+ yaz_log (LOG_DEBUG, "task already running");
+ return 0;
+ }
+ task->running = 1;
+ ret = zoom_complete;
+ if (c->cs || task->which == ZOOM_TASK_CONNECT)
+ {
+ switch (task->which)
+ {
+ case ZOOM_TASK_SEARCH:
+ if (c->proto == PROTO_HTTP)
+ ret = ZOOM_connection_srw_send_search(c);
+ else
+ ret = ZOOM_connection_send_search(c);
+ break;
+ case ZOOM_TASK_RETRIEVE:
+ if (c->proto == PROTO_HTTP)
+ ret = ZOOM_connection_srw_send_search(c);
+ else
+ ret = send_present (c);
+ break;
+ case ZOOM_TASK_CONNECT:
+ ret = do_connect(c);
+ break;
+ case ZOOM_TASK_SCAN:
+ ret = send_scan(c);
+ break;
+ case ZOOM_TASK_PACKAGE:
+ ret = send_package(c);
+ break;
+ }
+ }
+ else
+ {
+ yaz_log (LOG_DEBUG, "remove tasks because no connection exist");
+ ZOOM_connection_remove_tasks (c);
+ }
+ if (ret == zoom_complete)
+ {
+ yaz_log (LOG_DEBUG, "task removed (complete)");
+ ZOOM_connection_remove_task (c);
+ return 0;
+ }
+ yaz_log (LOG_DEBUG, "task pending");
+ return 1;
+}
+
+static zoom_ret send_sort_present (ZOOM_connection c)
+{
+ zoom_ret r = send_sort (c);
+ if (r == zoom_complete)
+ r = send_present (c);
+ return r;
+}
+
+static int es_response (ZOOM_connection c,
+ Z_ExtendedServicesResponse *res)
+{
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_PACKAGE)
+ return 0;
+ if (res->diagnostics && res->num_diagnostics > 0)
+ response_diag(c, res->diagnostics[0]);
+ if (res->taskPackage &&
+ res->taskPackage->which == Z_External_extendedService)
+ {
+ Z_TaskPackage *taskPackage = res->taskPackage->u.extendedService;
+ Odr_oct *id = taskPackage->targetReference;
+
+ if (id)
+ ZOOM_options_setl (c->tasks->u.package->options,
+ "targetReference", (char*) id->buf, id->len);
+ }
+ return 1;
+}
+
+
+static void handle_apdu (ZOOM_connection c, Z_APDU *apdu)
+{
+ Z_InitResponse *initrs;
+
+ c->mask = 0;
+ yaz_log (LOG_DEBUG, "recv APDU type=%d", apdu->which);
+ switch(apdu->which)
+ {
+ case Z_APDU_initResponse:
+ initrs = apdu->u.initResponse;
+ ZOOM_connection_option_set(c, "targetImplementationId",
+ initrs->implementationId ?
+ initrs->implementationId : "");
+ ZOOM_connection_option_set(c, "targetImplementationName",
+ initrs->implementationName ?
+ initrs->implementationName : "");
+ ZOOM_connection_option_set(c, "targetImplementationVersion",
+ initrs->implementationVersion ?
+ initrs->implementationVersion : "");
+ if (!*initrs->result)
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_INIT, 0);
+ }
+ else
+ {
+ char *cookie =
+ yaz_oi_get_string_oidval (&apdu->u.initResponse->otherInfo,
+ VAL_COOKIE, 1, 0);
+ xfree (c->cookie_in);
+ c->cookie_in = 0;
+ if (cookie)
+ c->cookie_in = xstrdup(cookie);
+ if (ODR_MASK_GET(initrs->options, Z_Options_namedResultSets) &&
+ ODR_MASK_GET(initrs->protocolVersion, Z_ProtocolVersion_3))
+ c->support_named_resultsets = 1;
+ if (c->tasks)
+ {
+ assert (c->tasks->which == ZOOM_TASK_CONNECT);
+ ZOOM_connection_remove_task (c);
+ }
+ ZOOM_connection_exec_task (c);
+ }
+ if (ODR_MASK_GET(initrs->options, Z_Options_negotiationModel))
+ {
+ NMEM tmpmem = nmem_create();
+ Z_CharSetandLanguageNegotiation *p =
+ yaz_get_charneg_record(initrs->otherInfo);
+
+ if (p)
+ {
+ char *charset=NULL, *lang=NULL;
+ int sel;
+
+ yaz_get_response_charneg(tmpmem, p, &charset, &lang, &sel);
+ yaz_log(LOG_DEBUG, "Target accepted: charset %s, "
+ "language %s, select %d",
+ charset ? charset : "none", lang ? lang : "none", sel);
+ if (charset)
+ ZOOM_connection_option_set (c, "negotiation-charset",
+ charset);
+ if (lang)
+ ZOOM_connection_option_set (c, "negotiation-lang",
+ lang);
+ nmem_destroy(tmpmem);
+ }
+ }
+ break;
+ case Z_APDU_searchResponse:
+ handle_search_response (c, apdu->u.searchResponse);
+ if (send_sort_present (c) == zoom_complete)
+ ZOOM_connection_remove_task (c);
+ break;
+ case Z_APDU_presentResponse:
+ handle_present_response (c, apdu->u.presentResponse);
+ if (send_present (c) == zoom_complete)
+ ZOOM_connection_remove_task (c);
+ break;
+ case Z_APDU_sortResponse:
+ sort_response (c, apdu->u.sortResponse);
+ if (send_present (c) == zoom_complete)
+ ZOOM_connection_remove_task (c);
+ break;
+ case Z_APDU_scanResponse:
+ scan_response (c, apdu->u.scanResponse);
+ ZOOM_connection_remove_task (c);
+ break;
+ case Z_APDU_extendedServicesResponse:
+ es_response (c, apdu->u.extendedServicesResponse);
+ ZOOM_connection_remove_task (c);
+ break;
+ case Z_APDU_close:
+ if (c->reconnect_ok)
+ {
+ do_close(c);
+ c->tasks->running = 0;
+ ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
+ }
+ else
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
+ do_close(c);
+ }
+ break;
+ default:
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ do_close(c);
+ }
+}
+
+#if HAVE_XML2
+static void handle_srw_response(ZOOM_connection c,
+ Z_SRW_searchRetrieveResponse *res)
+{
+ ZOOM_resultset resultset = 0;
+ int i;
+ NMEM nmem;
+ ZOOM_Event event;
+
+ if (!c->tasks)
+ return;
+
+ if (c->tasks->which == ZOOM_TASK_SEARCH)
+ resultset = c->tasks->u.search.resultset;
+ else if (c->tasks->which == ZOOM_TASK_RETRIEVE)
+ resultset = c->tasks->u.retrieve.resultset;
+ else
+ return ;
+
+ event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH);
+ ZOOM_connection_put_event(c, event);
+
+ resultset->size = 0;
+
+ yaz_log(LOG_DEBUG, "got SRW response OK");
+
+ if (res->numberOfRecords)
+ resultset->size = *res->numberOfRecords;
+
+ for (i = 0; i<res->num_records; i++)
+ {
+ int pos;
+
+ Z_NamePlusRecord *npr = (Z_NamePlusRecord *)
+ odr_malloc(c->odr_in, sizeof(Z_NamePlusRecord));
+
+ if (res->records[i].recordPosition &&
+ *res->records[i].recordPosition > 0)
+ pos = *res->records[i].recordPosition - 1;
+ else
+ pos = resultset->start + i;
+
+ npr->databaseName = 0;
+ npr->which = Z_NamePlusRecord_databaseRecord;
+ npr->u.databaseRecord = (Z_External *)
+ odr_malloc(c->odr_in, sizeof(Z_External));
+ npr->u.databaseRecord->descriptor = 0;
+ npr->u.databaseRecord->direct_reference =
+ yaz_oidval_to_z3950oid(c->odr_in, CLASS_RECSYN, VAL_TEXT_XML);
+ npr->u.databaseRecord->which = Z_External_octet;
+ npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
+ odr_malloc(c->odr_in, sizeof(Odr_oct));
+ npr->u.databaseRecord->u.octet_aligned->buf =
+ res->records[i].recordData_buf;
+ npr->u.databaseRecord->u.octet_aligned->len =
+ npr->u.databaseRecord->u.octet_aligned->size =
+ res->records[i].recordData_len;
+ record_cache_add (resultset, npr, pos);
+ }
+ if (res->num_diagnostics > 0)
+ {
+ set_dset_error(c, *res->diagnostics[0].code, "SRW",
+ res->diagnostics[0].details, 0);
+ }
+ nmem = odr_extract_mem(c->odr_in);
+ nmem_transfer(resultset->odr->mem, nmem);
+ nmem_destroy(nmem);
+}
+#endif
+
+#if HAVE_XML2
+static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
+{
+ int ret = -1;
+ const char *content_type = z_HTTP_header_lookup(hres->headers,
+ "Content-Type");
+ const char *connection_head = z_HTTP_header_lookup(hres->headers,
+ "Connection");
+ c->mask = 0;
+ yaz_log (LOG_DEBUG, "handle_http");
+
+ if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+ {
+ Z_SOAP *soap_package = 0;
+ ODR o = odr_createmem(ODR_DECODE);
+ Z_SOAP_Handler soap_handlers[2] = {
+ {"http://www.loc.gov/zing/srw/v1.0/", 0,
+ (Z_SOAP_fun) yaz_srw_codec},
+ {0, 0, 0}
+ };
+ ret = z_soap_codec(o, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers);
+ if (!ret && soap_package->which == Z_SOAP_generic &&
+ soap_package->u.generic->no == 0)
+ {
+ Z_SRW_PDU *sr = soap_package->u.generic->p;
+ if (sr->which == Z_SRW_searchRetrieve_response)
+ handle_srw_response(c, sr->u.response);
+ else
+ ret = -1;
+ }
+ else if (!ret && (soap_package->which == Z_SOAP_fault
+ || soap_package->which == Z_SOAP_error))
+ {
+ set_HTTP_error(c, hres->code,
+ soap_package->u.fault->fault_code,
+ soap_package->u.fault->fault_string);
+ }
+ else
+ ret = -1;
+ odr_destroy(o);
+ }
+ if (ret)
+ {
+ if (hres->code != 200)
+ set_HTTP_error(c, hres->code, 0, 0);
+ else
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ do_close (c);
+ }
+ ZOOM_connection_remove_task(c);
+ if (!strcmp(hres->version, "1.0"))
+ {
+ /* HTTP 1.0: only if Keep-Alive we stay alive.. */
+ if (!connection_head || strcmp(connection_head, "Keep-Alive"))
+ do_close(c);
+ }
+ else
+ {
+ /* HTTP 1.1: only if no close we stay alive .. */
+ if (connection_head && !strcmp(connection_head, "close"))
+ do_close(c);
+ }
+}
+#endif
+
+static int do_read (ZOOM_connection c)
+{
+ int r, more;
+ ZOOM_Event event;
+
+ event = ZOOM_Event_create (ZOOM_EVENT_RECV_DATA);
+ ZOOM_connection_put_event (c, event);
+
+
+ r = cs_get (c->cs, &c->buf_in, &c->len_in);
+ more = cs_more(c->cs);
+ yaz_log (LOG_DEBUG, "do_read len=%d more=%d", r, more);
+ if (r == 1)
+ return 0;
+ if (r <= 0)
+ {
+ if (c->reconnect_ok)
+ {
+ do_close (c);
+ c->reconnect_ok = 0;
+ yaz_log (LOG_DEBUG, "reconnect read");
+ c->tasks->running = 0;
+ ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
+ }
+ else
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
+ do_close (c);
+ }
+ }
+ else
+ {
+ Z_GDU *gdu;
+ ZOOM_Event event;
+
+ odr_reset (c->odr_in);
+ odr_setbuf (c->odr_in, c->buf_in, r, 0);
+ event = ZOOM_Event_create (ZOOM_EVENT_RECV_APDU);
+ ZOOM_connection_put_event (c, event);
+
+ if (!z_GDU (c->odr_in, &gdu, 0, 0))
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ do_close (c);
+ }
+ else if (gdu->which == Z_GDU_Z3950)
+ handle_apdu (c, gdu->u.z3950);
+ else if (gdu->which == Z_GDU_HTTP_Response)
+ {
+#if HAVE_XML2
+ handle_http (c, gdu->u.HTTP_Response);
+#else
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ do_close (c);
+#endif
+ }
+ c->reconnect_ok = 0;
+ }
+ return 1;
+}
+
+static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out)
+{
+ int r;
+ ZOOM_Event event;
+
+ event = ZOOM_Event_create(ZOOM_EVENT_SEND_DATA);
+ ZOOM_connection_put_event (c, event);
+
+ yaz_log (LOG_DEBUG, "do_write_ex len=%d", len_out);
+ if ((r=cs_put (c->cs, buf_out, len_out)) < 0)
+ {
+ if (c->reconnect_ok)
+ {
+ do_close (c);
+ c->reconnect_ok = 0;
+ yaz_log (LOG_DEBUG, "reconnect write");
+ c->tasks->running = 0;
+ ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
+ return zoom_pending;
+ }
+ if (c->state == STATE_CONNECTING)
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
+ else
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
+ do_close (c);
+ return zoom_complete;
+ }
+ else if (r == 1)
+ {
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
+ yaz_log (LOG_DEBUG, "do_write_ex 1 mask=%d", c->mask);
+ }
+ else
+ {
+ c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT;
+ yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask);
+ }
+ return zoom_pending;
+}
+
+static zoom_ret do_write(ZOOM_connection c)
+{
+ return do_write_ex (c, c->buf_out, c->len_out);
+}
+
+
+ZOOM_API(const char *)
+ZOOM_connection_option_get (ZOOM_connection c, const char *key)
+{
+ return ZOOM_options_get (c->options, key);
+}
+
+ZOOM_API(void)
+ZOOM_connection_option_set (ZOOM_connection c, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (c->options, key, val);
+}
+
+ZOOM_API(const char *)
+ZOOM_resultset_option_get (ZOOM_resultset r, const char *key)
+{
+ return ZOOM_options_get (r->options, key);
+}
+
+ZOOM_API(void)
+ZOOM_resultset_option_set (ZOOM_resultset r, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (r->options, key, val);
+}
+
+
+ZOOM_API(int)
+ZOOM_connection_errcode (ZOOM_connection c)
+{
+ return ZOOM_connection_error (c, 0, 0);
+}
+
+ZOOM_API(const char *)
+ZOOM_connection_errmsg (ZOOM_connection c)
+{
+ const char *msg;
+ ZOOM_connection_error (c, &msg, 0);
+ return msg;
+}
+
+ZOOM_API(const char *)
+ZOOM_connection_addinfo (ZOOM_connection c)
+{
+ const char *addinfo;
+ ZOOM_connection_error (c, 0, &addinfo);
+ return addinfo;
+}
+
+ZOOM_API(const char *)
+ZOOM_diag_str (int error)
+{
+ switch (error)
+ {
+ case ZOOM_ERROR_NONE:
+ return "No error";
+ case ZOOM_ERROR_CONNECT:
+ return "Connect failed";
+ case ZOOM_ERROR_MEMORY:
+ return "Out of memory";
+ case ZOOM_ERROR_ENCODE:
+ return "Encoding failed";
+ case ZOOM_ERROR_DECODE:
+ return "Decoding failed";
+ case ZOOM_ERROR_CONNECTION_LOST:
+ return "Connection lost";
+ case ZOOM_ERROR_INIT:
+ return "Init rejected";
+ case ZOOM_ERROR_INTERNAL:
+ return "Internal failure";
+ case ZOOM_ERROR_TIMEOUT:
+ return "Timeout";
+ case ZOOM_ERROR_UNSUPPORTED_PROTOCOL:
+ return "Unsupported protocol";
+ case ZOOM_ERROR_UNSUPPORTED_QUERY:
+ return "Unsupported query type";
+ default:
+ return diagbib1_str (error);
+ }
+}
+
+ZOOM_API(int)
+ZOOM_connection_error_x (ZOOM_connection c, const char **cp,
+ const char **addinfo, const char **diagset)
+{
+ int error = c->error;
+ if (cp)
+ {
+ if (!c->diagset || !strcmp(c->diagset, "ZOOM"))
+ *cp = ZOOM_diag_str(error);
+ else if (!strcmp(c->diagset, "HTTP"))
+ *cp = z_HTTP_errmsg(c->error);
+ else if (!strcmp(c->diagset, "Bib-1"))
+ *cp = ZOOM_diag_str(error);
+ else if (!strcmp(c->diagset, "SRW"))
+ *cp = yaz_diag_srw_str(c->error);
+ else
+ *cp = "Unknown error and diagnostic set";
+ }
+ if (addinfo)
+ *addinfo = c->addinfo ? c->addinfo : "";
+ if (diagset)
+ *diagset = c->diagset ? c->diagset : "";
+ return c->error;
+}
+
+ZOOM_API(int)
+ZOOM_connection_error (ZOOM_connection c, const char **cp,
+ const char **addinfo)
+{
+ return ZOOM_connection_error_x(c, cp, addinfo, 0);
+}
+
+static int ZOOM_connection_do_io(ZOOM_connection c, int mask)
+{
+ ZOOM_Event event = 0;
+ int r = cs_look(c->cs);
+ yaz_log (LOG_DEBUG, "ZOOM_connection_do_io c=%p mask=%d cs_look=%d",
+ c, mask, r);
+
+ if (r == CS_NONE)
+ {
+ event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
+ do_close (c);
+ ZOOM_connection_put_event (c, event);
+ }
+ else if (r == CS_CONNECT)
+ {
+ int ret;
+ event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
+
+ ret = cs_rcvconnect (c->cs);
+ yaz_log (LOG_DEBUG, "cs_rcvconnect returned %d", ret);
+ if (ret == 1)
+ {
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
+ ZOOM_connection_put_event (c, event);
+ }
+ else if (ret == 0)
+ {
+ ZOOM_connection_put_event (c, event);
+ if (c->proto == PROTO_Z3950)
+ ZOOM_connection_send_init(c);
+ else
+ {
+ /* no init request for SRW .. */
+ assert (c->tasks->which == ZOOM_TASK_CONNECT);
+ ZOOM_connection_remove_task (c);
+ c->mask = 0;
+ ZOOM_connection_exec_task (c);
+ }
+ c->state = STATE_ESTABLISHED;
+ }
+ else
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
+ do_close (c);
+ ZOOM_connection_put_event (c, event);
+ }
+ }
+ else
+ {
+ if (mask & ZOOM_SELECT_READ)
+ do_read (c);
+ if (c->cs && (mask & ZOOM_SELECT_WRITE))
+ do_write (c);
+ }
+ return 1;
+}
+
+ZOOM_API(int)
+ZOOM_connection_last_event(ZOOM_connection cs)
+{
+ if (!cs)
+ return ZOOM_EVENT_NONE;
+ return cs->last_event;
+}
+
+ZOOM_API(int)
+ZOOM_event (int no, ZOOM_connection *cs)
+{
+ int timeout = 5000;
+#if HAVE_SYS_POLL_H
+ struct pollfd pollfds[1024];
+ ZOOM_connection poll_cs[1024];
+#else
+ struct timeval tv;
+ fd_set input, output, except;
+#endif
+ int i, r, nfds;
+ int max_fd = 0;
+
+ for (i = 0; i<no; i++)
+ {
+ ZOOM_connection c = cs[i];
+ ZOOM_Event event;
+ if (c && (event = ZOOM_connection_get_event(c)))
+ {
+ ZOOM_Event_destroy (event);
+ return i+1;
+ }
+ }
+ for (i = 0; i<no; i++)
+ {
+ ZOOM_connection c = cs[i];
+ ZOOM_Event event;
+ if (c && ZOOM_connection_exec_task (c))
+ {
+ if ((event = ZOOM_connection_get_event(c)))
+ {
+ ZOOM_Event_destroy (event);
+ return i+1;
+ }
+ }
+ }
+#if HAVE_SYS_POLL_H
+
+#else
+ FD_ZERO (&input);
+ FD_ZERO (&output);
+ FD_ZERO (&except);
+#endif
+ nfds = 0;
+ for (i = 0; i<no; i++)
+ {
+ ZOOM_connection c = cs[i];
+ int fd, mask;
+ int this_timeout;
+
+ if (!c)
+ continue;
+ fd = z3950_connection_socket(c);
+ mask = z3950_connection_mask(c);
+
+ if (fd == -1)
+ continue;
+ if (max_fd < fd)
+ max_fd = fd;
+
+ this_timeout = ZOOM_options_get_int (c->options, "timeout", -1);
+ if (this_timeout != -1 && this_timeout < timeout)
+ timeout = this_timeout;
+#if HAVE_SYS_POLL_H
+ if (mask)
+ {
+ short poll_events = 0;
+
+ if (mask & ZOOM_SELECT_READ)
+ poll_events += POLLIN;
+ if (mask & ZOOM_SELECT_WRITE)
+ poll_events += POLLOUT;
+ if (mask & ZOOM_SELECT_EXCEPT)
+ poll_events += POLLERR;
+ pollfds[nfds].fd = fd;
+ pollfds[nfds].events = poll_events;
+ pollfds[nfds].revents = 0;
+ poll_cs[nfds] = c;
+ nfds++;
+ }
+#else
+ if (mask & ZOOM_SELECT_READ)
+ {
+ FD_SET (fd, &input);
+ nfds++;
+ }
+ if (mask & ZOOM_SELECT_WRITE)
+ {
+ FD_SET (fd, &output);
+ nfds++;
+ }
+ if (mask & ZOOM_SELECT_EXCEPT)
+ {
+ FD_SET (fd, &except);
+ nfds++;
+ }
+#endif
+ }
+ if (timeout >= 5000)
+ timeout = 30;
+
+ if (!nfds)
+ return 0;
+
+#if HAVE_SYS_POLL_H
+ r = poll (pollfds, nfds, timeout * 1000);
+ for (i = 0; i<nfds; i++)
+ {
+ ZOOM_connection c = poll_cs[i];
+ if (r && c->mask)
+ {
+ int mask = 0;
+ if (pollfds[i].revents & POLLIN)
+ mask += ZOOM_SELECT_READ;
+ if (pollfds[i].revents & POLLOUT)
+ mask += ZOOM_SELECT_WRITE;
+ if (pollfds[i].revents & POLLERR)
+ mask += ZOOM_SELECT_EXCEPT;
+ if (mask)
+ ZOOM_connection_do_io(c, mask);
+ }
+ else if (r == 0 && c->mask)
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT);
+ /* timeout and this connection was waiting */
+ set_ZOOM_error(c, ZOOM_ERROR_TIMEOUT, 0);
+ do_close (c);
+ ZOOM_connection_put_event(c, event);
+ }
+ }
+#else
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
+ yaz_log (LOG_DEBUG, "select start");
+ r = select (max_fd+1, &input, &output, &except, &tv);
+ yaz_log (LOG_DEBUG, "select stop, returned r=%d", r);
+ for (i = 0; i<no; i++)
+ {
+ ZOOM_connection c = cs[i];
+ int fd, mask;
+
+ if (!c)
+ continue;
+ fd = z3950_connection_socket(c);
+ mask = 0;
+ if (r && c->mask)
+ {
+ /* no timeout and real socket */
+ if (FD_ISSET(fd, &input))
+ mask += ZOOM_SELECT_READ;
+ if (FD_ISSET(fd, &output))
+ mask += ZOOM_SELECT_WRITE;
+ if (FD_ISSET(fd, &except))
+ mask += ZOOM_SELECT_EXCEPT;
+ if (mask)
+ ZOOM_connection_do_io(c, mask);
+ }
+ if (r == 0 && c->mask)
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT);
+ /* timeout and this connection was waiting */
+ set_ZOOM_error(c, ZOOM_ERROR_TIMEOUT, 0);
+ do_close (c);
+ yaz_log (LOG_DEBUG, "timeout");
+ ZOOM_connection_put_event(c, event);
+ }
+ }
+#endif
+ for (i = 0; i<no; i++)
+ {
+ ZOOM_connection c = cs[i];
+ ZOOM_Event event;
+ if (c && (event = ZOOM_connection_get_event(c)))
+ {
+ ZOOM_Event_destroy (event);
+ return i+1;
+ }
+ }
+ return 0;
+}
--- /dev/null
+/*
+ * $Id: zoom-opt.c,v 1.1 2003-10-27 12:21:36 adam Exp $
+ *
+ * ZOOM layer for C, options handling
+ */
+#include <assert.h>
+#include "zoom-p.h"
+
+#include <yaz/xmalloc.h>
+
+ZOOM_API(ZOOM_options)
+ZOOM_options_create_with_parent (ZOOM_options parent)
+{
+ return ZOOM_options_create_with_parent2(parent, 0);
+}
+
+ZOOM_API(ZOOM_options)
+ZOOM_options_create (void)
+{
+ return ZOOM_options_create_with_parent (0);
+}
+
+
+ZOOM_API(ZOOM_options)
+ZOOM_options_create_with_parent2 (ZOOM_options parent1, ZOOM_options parent2)
+{
+ ZOOM_options opt = (ZOOM_options) xmalloc (sizeof(*opt));
+
+ opt->refcount = 1;
+ opt->callback_func = 0;
+ opt->callback_handle = 0;
+ opt->entries = 0;
+ opt->parent1= parent1;
+ if (parent1)
+ (parent1->refcount)++;
+ opt->parent2= parent2;
+ if (parent2)
+ (parent2->refcount)++;
+ return opt;
+}
+
+
+void ZOOM_options_addref (ZOOM_options opt)
+{
+ (opt->refcount)++;
+}
+
+ZOOM_API(ZOOM_options_callback)
+ZOOM_options_set_callback (
+ ZOOM_options opt,
+ ZOOM_options_callback callback_func,
+ void *callback_handle)
+{
+ ZOOM_options_callback callback_old;
+
+ assert (opt);
+ callback_old = opt->callback_func;
+ opt->callback_func = callback_func;
+ opt->callback_handle = callback_handle;
+ return callback_old;
+}
+
+ZOOM_API(void)
+ZOOM_options_destroy (ZOOM_options opt)
+{
+ if (!opt)
+ return;
+ (opt->refcount)--;
+ if (opt->refcount == 0)
+ {
+ struct ZOOM_options_entry *e;
+
+ ZOOM_options_destroy (opt->parent1);
+ ZOOM_options_destroy (opt->parent2);
+ e = opt->entries;
+ while (e)
+ {
+ struct ZOOM_options_entry *e0 = e;
+ xfree (e->name);
+ xfree (e->value);
+ e = e->next;
+ xfree (e0);
+ }
+ xfree (opt);
+ }
+}
+
+ZOOM_API(void)
+ZOOM_options_setl (ZOOM_options opt, const char *name, const char *value,
+ int len)
+{
+ struct ZOOM_options_entry **e;
+
+ e = &opt->entries;
+ while (*e)
+ {
+ if (!strcmp((*e)->name, name))
+ {
+ xfree ((*e)->value);
+ (*e)->value = 0;
+ if (value)
+ {
+ (*e)->value = (char *) xmalloc (len+1);
+ memcpy ((*e)->value, value, len);
+ (*e)->value[len] = '\0';
+ }
+ return;
+ }
+ e = &(*e)->next;
+ }
+ *e = (struct ZOOM_options_entry *) xmalloc (sizeof(**e));
+ (*e)->name = xstrdup (name);
+ (*e)->value = 0;
+ if (value)
+ {
+ (*e)->value = (char *) xmalloc (len+1);
+ memcpy ((*e)->value, value, len);
+ (*e)->value[len] = '\0';
+ }
+ (*e)->next = 0;
+}
+
+ZOOM_API(void)
+ZOOM_options_set (ZOOM_options opt, const char *name, const char *value)
+{
+ ZOOM_options_setl (opt, name, value, value ? strlen(value): 0);
+}
+
+ZOOM_API(const char *)
+ZOOM_options_get (ZOOM_options opt, const char *name)
+{
+ const char *v = 0;
+ if (!opt)
+ return 0;
+ if (opt->callback_func)
+ v = (*opt->callback_func)(opt->callback_handle, name);
+ if (!v)
+ {
+ struct ZOOM_options_entry *e;
+ for (e = opt->entries; e; e = e->next)
+ if (!strcmp(e->name, name))
+ {
+ v = e->value;
+ break;
+ }
+ }
+ if (!v)
+ v = ZOOM_options_get(opt->parent1, name);
+ if (!v)
+ v = ZOOM_options_get(opt->parent2, name);
+ return v;
+}
+
+ZOOM_API(int)
+ZOOM_options_get_bool (ZOOM_options opt, const char *name, int defa)
+{
+ const char *v = ZOOM_options_get (opt, name);
+
+ if (!v)
+ return defa;
+ if (!strcmp (v, "1") || !strcmp(v, "T"))
+ return 1;
+ return 0;
+}
+
+ZOOM_API(int)
+ZOOM_options_get_int (ZOOM_options opt, const char *name, int defa)
+{
+ const char *v = ZOOM_options_get (opt, name);
+
+ if (!v || !*v)
+ return defa;
+ return atoi(v);
+}
+
+ZOOM_API(void)
+ZOOM_options_set_int(ZOOM_options opt, const char *name, int value)
+{
+ char s[40];
+
+ sprintf (s, "%d", value);
+ ZOOM_options_set (opt, name, s);
+}
--- /dev/null
+/*
+ * Private C header for ZOOM C.
+ * $Id: zoom-p.h,v 1.1 2003-10-27 12:21:36 adam Exp $
+ */
+
+#if HAVE_XSLT
+#include <yaz/srw.h>
+#endif
+
+#include <yaz/proto.h>
+#include <yaz/comstack.h>
+#include <yaz/wrbuf.h>
+#include <yaz/zoom.h>
+#include <yaz/sortspec.h>
+typedef struct ZOOM_Event_p *ZOOM_Event;
+
+struct ZOOM_query_p {
+ Z_Query *z_query;
+ Z_SortKeySpecList *sort_spec;
+ int refcount;
+ ODR odr;
+ char *query_string;
+};
+
+#define STATE_IDLE 0
+#define STATE_CONNECTING 1
+#define STATE_ESTABLISHED 2
+
+#define ZOOM_SELECT_READ 1
+#define ZOOM_SELECT_WRITE 2
+#define ZOOM_SELECT_EXCEPT 4
+
+struct ZOOM_connection_p {
+ enum oid_proto proto;
+ COMSTACK cs;
+ char *host_port;
+ char *path;
+ int error;
+ char *addinfo;
+ const char *diagset;
+ int state;
+ int mask;
+ int reconnect_ok;
+ ODR odr_in;
+ ODR odr_out;
+ char *buf_in;
+ int len_in;
+ char *buf_out;
+ int len_out;
+ char *proxy;
+ char *charset;
+ char *lang;
+ char *cookie_out;
+ char *cookie_in;
+ char *client_IP;
+ int async;
+ int support_named_resultsets;
+ int last_event;
+ ZOOM_task tasks;
+ ZOOM_options options;
+ ZOOM_resultset resultsets;
+ ZOOM_Event m_queue_front;
+ ZOOM_Event m_queue_back;
+};
+
+struct ZOOM_options_entry {
+ char *name;
+ char *value;
+ struct ZOOM_options_entry *next;
+};
+
+struct ZOOM_options_p {
+ int refcount;
+ void *callback_handle;
+ ZOOM_options_callback callback_func;
+ struct ZOOM_options_entry *entries;
+ ZOOM_options parent1;
+ ZOOM_options parent2;
+};
+
+typedef struct ZOOM_record_cache_p *ZOOM_record_cache;
+
+struct ZOOM_resultset_p {
+ Z_SortKeySpecList *r_sort_spec;
+ ZOOM_query query;
+ int refcount;
+ int size;
+ int start;
+ int count;
+ int step;
+ int piggyback;
+ char *setname;
+ char *schema;
+ ODR odr;
+ ZOOM_record_cache record_cache;
+ ZOOM_options options;
+ ZOOM_connection connection;
+ ZOOM_resultset next;
+};
+
+struct ZOOM_record_p {
+ ODR odr;
+ WRBUF wrbuf_marc;
+ WRBUF wrbuf_iconv;
+ WRBUF wrbuf_opac;
+ Z_NamePlusRecord *npr;
+};
+
+struct ZOOM_record_cache_p {
+ struct ZOOM_record_p rec;
+ char *elementSetName;
+ char *syntax;
+ char *schema;
+ int pos;
+ ZOOM_record_cache next;
+};
+
+struct ZOOM_scanset_p {
+ int refcount;
+ ODR odr;
+ ZOOM_options options;
+ ZOOM_connection connection;
+ Z_AttributesPlusTerm *termListAndStartPoint;
+ Z_AttributeSetId *attributeSet;
+ Z_ScanResponse *scan_response;
+};
+
+struct ZOOM_package_p {
+ int refcount;
+ ODR odr_out;
+ ZOOM_options options;
+ ZOOM_connection connection;
+ char *buf_out;
+ int len_out;
+};
+
+struct ZOOM_task_p {
+ int running;
+ int which;
+ union {
+#define ZOOM_TASK_SEARCH 1
+ struct {
+ ZOOM_resultset resultset;
+ } search;
+#define ZOOM_TASK_RETRIEVE 2
+ struct {
+ int start;
+ ZOOM_resultset resultset;
+ int count;
+ } retrieve;
+#define ZOOM_TASK_CONNECT 3
+#define ZOOM_TASK_SCAN 4
+ struct {
+ ZOOM_scanset scan;
+ } scan;
+#define ZOOM_TASK_PACKAGE 5
+ ZOOM_package package;
+ } u;
+ ZOOM_task next;
+};
+
+struct ZOOM_Event_p {
+ int kind;
+ ZOOM_Event next;
+ ZOOM_Event prev;
+};
+
+void ZOOM_options_addref (ZOOM_options opt);
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-srw_*
-*.lo
-*.la
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
+++ /dev/null
-Makefile
-Makefile.in
--- /dev/null
+## Copyright (C) 1994-2003, Index Data
+## All rights reserved.
+## $Id: Makefile.am,v 1.1 2003-10-27 12:21:38 adam Exp $
+
+check_PROGRAMS = tsticonv tstnmem tstmatchstr tstwrbuf tstodr tstccl
+
+TESTS = $(check_PROGRAMS)
+
+EXTRA_DIST = tstodr.asn tstodrcodec.c tstodrcodec.h
+
+YAZCOMP = $(top_srcdir)/util/yaz-asncomp
+YAZCOMPLINE = $(YAZCOMP) -d z.tcl -i yaz -I../include $(YCFLAGS)
+
+AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS)
+
+# Rule for generating codecs for our small ASN.1 spec
+tstodrcodec.c tstodrcodec.h: tstodr.asn $(YAZCOMP)
+ cd $(srcdir); $(YAZCOMP) tstodr.asn
+
+# Tests..
+tsticonv_LDADD = ../src/libyaz.la
+tsticonv_SOURCES = tsticonv.c
+
+tstnmem_LDADD = ../src/libyaz.la
+tstnmem_SOURCES = tstnmem.c
+
+tstmatchstr_LDADD = ../src/libyaz.la
+tstmatchstr_SOURCES = tstmatchstr.c
+
+tstwrbuf_LDADD = ../src/libyaz.la
+tstwrbuf_SOURCES = tstwrbuf.c
+
+tstodr_LDADD = ../src/libyaz.la
+tstodr_SOURCES = tstodrcodec.c tstodrcodec.h tstodr.c
+
+tstccl_LDADD = ../src/libyaz.la
+tstccl_SOURCES = tstccl.c
+
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tstccl.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ */
+
+/* CCL test */
+
+#include <yaz/ccl.h>
+
+struct ccl_tst {
+ char *query;
+ char *result;
+};
+
+static struct ccl_tst query_str[] = {
+ { "x1", "@attr 4=2 @attr 1=1016 x1 "},
+ { "(((((x1)))))", "@attr 4=2 @attr 1=1016 x1 "},
+ {"x1 and x2", "@and @attr 4=2 @attr 1=1016 x1 @attr 4=2 @attr 1=1016 x2 "},
+ { "ti=x3", "@attr 4=2 @attr 1=4 x3 "},
+ { "dc.title=x4", "@attr 1=/my/title x4 "},
+ { "x1 and", 0},
+ { "tix=x5", 0},
+ {0, 0}
+};
+
+void tst1(void)
+{
+ CCL_parser parser = ccl_parser_create ();
+ CCL_bibset bibset = ccl_qual_mk();
+ int i;
+
+ ccl_qual_fitem(bibset, "u=4 s=pw t=l,r", "ti");
+ ccl_qual_fitem(bibset, "1=1016 s=al,pw", "term");
+ ccl_qual_fitem(bibset, "1=/my/title", "dc.title");
+
+ parser->bibset = bibset;
+
+ for (i = 0; query_str[i].query; i++)
+ {
+ struct ccl_token *token_list =
+ ccl_parser_tokenize(parser, query_str[i].query);
+ struct ccl_rpn_node *rpn = ccl_parser_find(parser, token_list);
+ ccl_token_del (token_list);
+ if (rpn)
+ {
+ WRBUF wrbuf = wrbuf_alloc();
+ ccl_pquery(wrbuf, rpn);
+
+ if (!query_str[i].result)
+ {
+ printf ("Failed %s\n", query_str[i].query);
+ printf (" got:%s:\n", wrbuf_buf(wrbuf));
+ printf (" expected failure\n");
+ exit(3);
+ }
+ else if (strcmp(wrbuf_buf(wrbuf), query_str[i].result))
+ {
+ printf ("Failed %s\n", query_str[i].query);
+ printf (" got:%s:\n", wrbuf_buf(wrbuf));
+ printf (" expected:%s:\n", query_str[i].result);
+ exit(2);
+ }
+ ccl_rpn_delete(rpn);
+ wrbuf_free(wrbuf, 1);
+ }
+ else if (query_str[i].result)
+ {
+ printf ("Failed %s\n", query_str[i].query);
+ printf (" got failure\n");
+ printf (" expected:%s:\n", query_str[i].result);
+ exit(4);
+ }
+ }
+ ccl_parser_destroy (parser);
+ ccl_qual_rm(&bibset);
+}
+
+int main(int argc, char **argv)
+{
+ tst1();
+ exit(0);
+}
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tsticonv.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/yaz-util.h>
+
+/* some test strings in ISO-8859-1 format */
+const char *buf[] = {
+ "ax" ,
+ "\330",
+ "eneb\346r",
+ "\xfc",
+ "\xfb",
+ "\xfbr",
+ 0 };
+
+/* some test strings in MARC-8 format */
+const char *marc8_strings[] = {
+ "ax",
+ "\xa2", /* latin capital letter o with stroke */
+ "eneb\xb5r", /* latin small letter ae */
+ "\xe8\x75", /* latin small letter u with umlaut */
+ "\xe3\x75", /* latin small letter u with circumflex */
+ "\xe3\x75r", /* latin small letter u with circumflex */
+ 0
+};
+
+static void marc8_tst()
+{
+ int i;
+ yaz_iconv_t cd;
+
+ cd = yaz_iconv_open("ISO-8859-1", "MARC8");
+ for (i = 0; buf[i]; i++)
+ {
+ size_t r;
+ char *inbuf= (char*) marc8_strings[i];
+ size_t inbytesleft = strlen(inbuf);
+ char outbuf0[24];
+ char *outbuf = outbuf0;
+ size_t outbytesleft = sizeof(outbuf0);
+
+ r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (r == (size_t) (-1))
+ {
+ int e = yaz_iconv_error(cd);
+
+ printf ("tsticonv 6 i=%d e=%d\n", i, e);
+ exit(6);
+ }
+ if ((outbuf - outbuf0) != strlen(buf[i])
+ || memcmp(outbuf0, buf[i], strlen(buf[i])))
+ {
+ printf ("tsticonv 7 i=%d\n", i);
+ printf ("buf=%s out=%s\n", buf[i], outbuf0);
+ exit(7);
+ }
+ }
+ yaz_iconv_close(cd);
+}
+
+static void dconvert(int mandatory, const char *tmpcode)
+{
+ int i;
+ yaz_iconv_t cd;
+ for (i = 0; buf[i]; i++)
+ {
+ size_t r;
+ char *inbuf = (char*) buf[i];
+ size_t inbytesleft = strlen(inbuf);
+ char outbuf0[24];
+ char outbuf1[10];
+ char *outbuf = outbuf0;
+ size_t outbytesleft = sizeof(outbuf0);
+
+ cd = yaz_iconv_open(tmpcode, "ISO-8859-1");
+ if (!cd)
+ {
+ if (!mandatory)
+ return;
+ printf ("tsticonv 1\n");
+ exit(1);
+ }
+ r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (r == (size_t)(-1))
+ {
+ int e = yaz_iconv_error(cd);
+
+ printf ("tsticonv 2 e=%d\n", e);
+ exit(2);
+ }
+ yaz_iconv_close(cd);
+
+ cd = yaz_iconv_open("ISO-8859-1", tmpcode);
+ if (!cd)
+ {
+ if (!mandatory)
+ return;
+ printf ("tsticonv 3\n");
+ exit(3);
+ }
+ inbuf = outbuf0;
+ inbytesleft = sizeof(outbuf0) - outbytesleft;
+
+ outbuf = outbuf1;
+ outbytesleft = sizeof(outbuf1);
+ r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (r == (size_t)(-1)) {
+ int e = yaz_iconv_error(cd);
+
+ printf ("tsticonv 4 e=%d\n", e);
+ exit(4);
+ }
+ if (strlen(buf[i]) == (sizeof(outbuf1) - outbytesleft) &&
+ memcmp(outbuf1, buf[i], strlen(buf[i])))
+ {
+ printf ("tsticonv 5\n");
+ exit(5);
+ }
+ yaz_iconv_close(cd);
+ }
+}
+
+int main (int argc, char **argv)
+{
+ dconvert(1, "UTF-8");
+ dconvert(1, "ISO-8859-1");
+ dconvert(1, "UCS4");
+ dconvert(0, "CP865");
+ marc8_tst();
+ exit (0);
+}
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tstmatchstr.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ */
+
+#include <stdio.h>
+
+#include <yaz/yaz-iconv.h>
+
+struct {
+ char *s1;
+ char *s2;
+ int res;
+} comp_strings[] = {
+ { "x", "x", 0 },
+ { "x", "X", 0 },
+ { "a", "b", 1 },
+ { "b", "a", 1 },
+ { "aa","a", 1 },
+ { "a-", "a", 1 },
+ { "A-b", "ab", 0},
+ { "A--b", "ab", 1},
+ { "A--b", "a-b", 1},
+ { "A--b", "a--b", 0},
+ { "a123", "a?", 0},
+ {"a123", "a1.3", 0},
+ {"a123", "..?", 0},
+ {"a123", "a1.", 1},
+ {"a123", "a...", 0},
+ {0, 0, 0} };
+
+int main (int argc, char **argv)
+{
+ int i;
+ for (i = 0; comp_strings[i].s1; i++)
+ {
+ int got = yaz_matchstr(comp_strings[i].s1,comp_strings[i].s2);
+ if (got > 0)
+ got = 1;
+ else if (got < 0)
+ got = -1;
+ if (got != comp_strings[i].res)
+ {
+ printf ("tststr %d got=%d res=%d\n", i,
+ got, comp_strings[i].res);
+ exit(1);
+ }
+ }
+ exit(0);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tstnmem.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/nmem.h>
+
+int main (int argc, char **argv)
+{
+ void *cp;
+ NMEM n;
+ int j;
+
+ nmem_init();
+ n = nmem_create();
+ if (!n)
+ exit (1);
+ for (j = 1; j<500; j++)
+ {
+ cp = nmem_malloc(n, j);
+ if (!cp)
+ exit(2);
+ }
+
+ for (j = 2000; j<20000; j+= 2000)
+ {
+ cp = nmem_malloc(n, j);
+ if (!cp)
+ exit(3);
+ }
+ nmem_destroy(n);
+ nmem_exit();
+ exit(0);
+}
--- /dev/null
+-- Small ASN.1 spec for tstodr test
+-- $Id: tstodr.asn,v 1.1 2003-10-27 12:21:38 adam Exp $
+tstodrcodec
+{tstodrcodec} DEFINITIONS ::=
+BEGIN
+MySequence ::= SEQUENCE {
+ first [1] IMPLICIT INTEGER,
+ second [2] IMPLICIT OCTET STRING,
+ third [3] IMPLICIT BOOLEAN,
+ fourth [4] IMPLICIT NULL,
+ fifth [5] IMPLICIT INTEGER {
+ enum1(0),
+ enum2(1)
+ }
+}
+END
--- /dev/null
+/*
+ * Copyright (c) 1995-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tstodr.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ *
+ */
+#include <stdio.h>
+#include <yaz/odr.h>
+#include "tstodrcodec.h"
+
+void tst_MySequence1(ODR encode, ODR decode)
+{
+ char *ber_buf;
+ int ber_len;
+ Yc_MySequence *s = odr_malloc(encode, sizeof(*s));
+ Yc_MySequence *t;
+
+ s->first = odr_intdup(encode, 12345);
+ s->second = odr_malloc(encode, sizeof(*s->second));
+ s->second->buf = "hello";
+ s->second->len = 5;
+ s->second->size = 0;
+ s->third = odr_intdup(encode, 1);
+ s->fourth = odr_nullval();
+ s->fifth = odr_intdup(encode, YC_MySequence_enum1);
+
+ if (!yc_MySequence(encode, &s, 0, 0))
+ exit(1);
+
+ ber_buf = odr_getbuf(encode, &ber_len, 0);
+
+ odr_setbuf(decode, ber_buf, ber_len, 0);
+
+ if (!yc_MySequence(decode, &t, 0, 0))
+ exit(2);
+ if (!t->first || *t->first != 12345)
+ exit(3);
+ if (!t->second || !t->second->buf || t->second->len != 5)
+ exit(4);
+ if (memcmp(t->second->buf, "hello", t->second->len))
+ exit(5);
+ if (!t->third || *t->third != 1)
+ exit(6);
+ if (!t->fourth)
+ exit(7);
+ if (!t->fifth || *t->fifth != YC_MySequence_enum1)
+ exit(8);
+}
+
+void tst_MySequence2(ODR encode, ODR decode)
+{
+ char *ber_buf;
+ int ber_len;
+ Yc_MySequence *s = odr_malloc(encode, sizeof(*s));
+ Yc_MySequence *t;
+
+ s->first = 0; /* deliberately miss this .. */
+ s->second = odr_malloc(encode, sizeof(*s->second));
+ s->second->buf = "hello";
+ s->second->len = 5;
+ s->second->size = 0;
+ s->third = odr_intdup(encode, 1);
+ s->fourth = odr_nullval();
+ s->fifth = odr_intdup(encode, YC_MySequence_enum1);
+
+ if (yc_MySequence(encode, &s, 0, 0)) /* should fail */
+ exit(9);
+ if (odr_geterror(encode) != OREQUIRED)
+ exit(10);
+ if (strcmp(odr_getelement(encode), "first"))
+ exit(11);
+ odr_reset(encode);
+
+ if (odr_geterror(encode) != ONONE)
+ exit(12);
+ if (strcmp(odr_getelement(encode), ""))
+ exit(13);
+}
+
+void tst_MySequence3(ODR encode, ODR decode)
+{
+ char buf[40];
+ int i;
+ Yc_MySequence *t;
+
+ srand(123);
+ for (i = 0; i<1000; i++)
+ {
+ int j;
+ for (j = 0; j<sizeof(buf); j++)
+ buf[j] = rand();
+
+ for (j = 1; j<sizeof(buf); j++)
+ {
+ odr_setbuf(decode, buf, j, 0);
+ yc_MySequence(decode, &t, 0, 0);
+ odr_reset(decode);
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ ODR odr_encode = odr_createmem(ODR_ENCODE);
+ ODR odr_decode = odr_createmem(ODR_DECODE);
+
+ tst_MySequence1(odr_encode, odr_decode);
+ tst_MySequence2(odr_encode, odr_decode);
+ tst_MySequence3(odr_encode, odr_decode);
+
+ odr_destroy(odr_encode);
+ odr_destroy(odr_decode);
+ exit(0);
+}
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: tstwrbuf.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ */
+
+#include <stdio.h>
+
+#include <yaz/wrbuf.h>
+
+int main (int argc, char **argv)
+{
+ int step;
+ WRBUF wr = wrbuf_alloc();
+
+ wrbuf_free(wr, 1);
+
+ wr = wrbuf_alloc();
+
+ for (step = 1; step < 65; step++)
+ {
+ int i, j, k;
+ int len;
+ char buf[64];
+ char *cp;
+ for (j = 1; j<step; j++)
+ {
+ for (i = 0; i<j; i++)
+ buf[i] = i+1;
+ buf[i] = '\0';
+ wrbuf_puts(wr, buf);
+ }
+
+ cp = wrbuf_buf(wr);
+ len = wrbuf_len(wr);
+ if (len != step * (step-1) / 2)
+ {
+ printf ("tstwrbuf 1 %d len=%d\n", step, len);
+ exit(1);
+ }
+ k = 0;
+ for (j = 1; j<step; j++)
+ for (i = 0; i<j; i++)
+ {
+ if (cp[k] != i+1)
+ {
+ printf ("tstwrbuf 2 %d k=%d\n", step, k);
+ exit(1);
+ }
+ k++;
+ }
+ wrbuf_rewind(wr);
+ }
+ wrbuf_free(wr, 1);
+ exit(0);
+}
+
## Copyright (C) 1994-2003, Index Data
## All rights reserved.
-## $Id: Makefile.am,v 1.22 2003-06-11 11:09:22 adam Exp $
-
-noinst_LTLIBRARIES = libutil.la
-
-check_PROGRAMS = tsticonv tstnmem tstmatchstr tstwrbuf
+## $Id: Makefile.am,v 1.23 2003-10-27 12:21:38 adam Exp $
TESTS = $(check_PROGRAMS)
-bin_SCRIPTS = yaz-asncomp
+bin_SCRIPTS = yaz-asncomp yaz-config
-EXTRA_DIST = yaz-asncomp cvs-date.tcl \
- charconv.tcl charconv.sgm charconv_cjk.xml
+EXTRA_DIST = yaz-asncomp
AM_CPPFLAGS=-I$(top_srcdir)/include
-noinst_PROGRAMS = marcdump yaziconv
+bin_PROGRAMS = yaz-marcdump yaz-iconv
+noinst_PROGRAMS = cclsh cql2pqf cql2xcql srwtst
# MARC dumper utility
-marcdump_LDADD = libutil.la
-marcdump_SOURCES = marcdump.c
+yaz_marcdump_LDADD = ../src/libyaz.la
+yaz_marcdump_SOURCES = marcdump.c
# YAZ Iconv utility
-yaziconv_LDADD = libutil.la
-yaziconv_SOURCES = yaziconv.c
-
-# Tests..
-tsticonv_LDADD = libutil.la
-tsticonv_SOURCES = tsticonv.c
+yaz_iconv_LDADD = ../src/libyaz.la
+yaz_iconv_SOURCES = yaziconv.c
-tstnmem_LDADD = libutil.la
-tstnmem_SOURCES = tstnmem.c
+srwtst_SOURCES=srwtst.c
+srwtst_LDADD = ../src/libyaz.la
-tstmatchstr_LDADD = libutil.la
-tstmatchstr_SOURCES = tstmatchstr.c
+cclsh_SOURCES=cclsh.c
+cclsh_LDADD = ../src/libyaz.la $(READLINE_LIBS)
-tstwrbuf_LDADD = libutil.la
-tstwrbuf_SOURCES = tstwrbuf.c
+cql2pqf_SOURCES = cql2pqf.c
+cql2pqf_LDADD = ../src/libyaz.la
-# MARC8 conversion is generated from charconv.sgm
-marc8.c: charconv.sgm charconv.tcl
- cd $(srcdir); ./charconv.tcl -p marc8 -s 50 charconv.sgm -o marc8.c
+cql2xcql_SOURCES = cql2xcql.c
+cql2xcql_LDADD = ../src/libyaz.la
-libutil_la_SOURCES=version.c options.c log.c marcdisp.c oid.c wrbuf.c \
- nmemsdup.c xmalloc.c readconf.c tpath.c nmem.c matchstr.c atoin.c \
- siconv.c marc8.c
+++ /dev/null
-/*
- * Copyright (c) 1997-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: atoin.c,v 1.6 2003-01-06 08:20:28 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <ctype.h>
-#include <yaz/yaz-util.h>
-
-int atoi_n (const char *buf, int len)
-{
- int val = 0;
-
- while (--len >= 0)
- {
- if (isdigit (*buf))
- val = val*10 + (*buf - '0');
- buf++;
- }
- return val;
-}
-
--- /dev/null
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ * University College Dublin
+ * Danmarks Teknologiske Videnscenter
+ * An Chomhairle Leabharlanna
+ * Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ *
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL shell.
+ * Europagate 1995
+ *
+ * $Id: cclsh.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ *
+ * Old Europagate Log:
+ *
+ * Revision 1.11 1995/05/16 09:39:27 adam
+ * LICENSE.
+ *
+ * Revision 1.10 1995/05/11 14:03:57 adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.9 1995/02/23 08:32:00 adam
+ * Changed header.
+ *
+ * Revision 1.7 1995/02/15 17:42:16 adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.6 1995/02/14 19:55:13 adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.5 1995/02/14 16:20:57 adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.4 1995/02/14 14:12:42 adam
+ * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
+ *
+ * Revision 1.3 1995/02/14 10:25:57 adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2 1995/02/13 15:15:07 adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1 1995/02/13 12:35:21 adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/ccl.h>
+
+
+#if HAVE_READLINE_READLINE_H
+#include <readline/readline.h>
+#endif
+#if HAVE_READLINE_HISTORY_H
+#include <readline/history.h>
+#endif
+
+
+static int debug = 0;
+static char *prog;
+
+void usage(const char *prog)
+{
+ fprintf (stderr, "%s: [-d] [-b configfile]\n", prog);
+ exit (1);
+}
+
+int main (int argc, char **argv)
+{
+ CCL_bibset bibset;
+ FILE *bib_inf;
+ char *bib_fname;
+
+ prog = *argv;
+ bibset = ccl_qual_mk ();
+ while (--argc > 0)
+ {
+ if (**++argv == '-')
+ {
+ switch (argv[0][1])
+ {
+ case 'd':
+ debug = 1;
+ break;
+ case 'b':
+ if (argv[0][2])
+ bib_fname = argv[0]+2;
+ else if (argc > 0)
+ {
+ --argc;
+ bib_fname = *++argv;
+ }
+ else
+ {
+ fprintf (stderr, "%s: missing bib filename\n", prog);
+ exit (1);
+ }
+ bib_inf = fopen (bib_fname, "r");
+ if (!bib_inf)
+ {
+ fprintf (stderr, "%s: cannot open %s\n", prog,
+ bib_fname);
+ exit (1);
+ }
+ ccl_qual_file (bibset, bib_inf);
+ fclose (bib_inf);
+ break;
+ default:
+ usage(prog);
+ }
+ }
+ else
+ {
+ fprintf (stderr, "%s: no filenames, please\n", prog);
+ exit (1);
+ }
+ }
+ while (1)
+ {
+ char buf[1000];
+ int i, error, pos;
+ struct ccl_rpn_node *rpn;
+
+#if HAVE_READLINE_READLINE_H
+ char* line_in;
+ line_in=readline("CCLSH>");
+ if (!line_in)
+ break;
+#if HAVE_READLINE_HISTORY_H
+ if (*line_in)
+ add_history(line_in);
+#endif
+ if (strlen(line_in) > 999) {
+ fprintf(stderr,"Input line to long\n");
+ break;
+ }
+ strcpy(buf,line_in);
+ free (line_in);
+#else
+ printf ("CCLSH>"); fflush (stdout);
+ if (!fgets (buf, 999, stdin))
+ break;
+#endif
+
+ for (i = 0; i<1; i++)
+ {
+ CCL_parser cclp = ccl_parser_create ();
+ struct ccl_token *list;
+
+ cclp->bibset = bibset;
+
+ list = ccl_parser_tokenize (cclp, buf);
+ rpn = ccl_parser_find (cclp, list);
+
+ error = cclp->error_code;
+ if (error)
+ pos = cclp->error_pos - buf;
+
+ if (error)
+ {
+ printf ("%*s^ - ", 6+pos, " ");
+ printf ("%s\n", ccl_err_msg (error));
+ }
+ else
+ {
+ if (rpn && i == 0)
+ {
+ ccl_pr_tree (rpn, stdout);
+ printf ("\n");
+ }
+ }
+ if (debug)
+ {
+ struct ccl_token *lp;
+ for (lp = list; lp; lp = lp->next)
+ printf ("%d %.*s\n", lp->kind, (int) (lp->len), lp->name);
+ }
+ ccl_token_del (list);
+ ccl_parser_destroy (cclp);
+ if (rpn)
+ ccl_rpn_delete(rpn);
+ }
+ }
+ printf ("\n");
+ return 0;
+}
+++ /dev/null
-<!-- ============================================================= -->
-<!-- MODULE: Character to Entity Specification -->
-<!-- VERSION: 3.0 (Morgan Cundiff and Randll Barry) -->
-<!-- DATE: June 18, 2001 -->
-<!-- -->
-<!-- MULBERRY INTERNAL VERSION CONTROL: -->
-<!-- $Id: charconv.sgm,v 1.1 2002-12-16 13:26:06 adam Exp $ -->
-<!-- ============================================================= -->
-
-<!-- ============================================================= -->
-<!-- SYSTEM: MARC <-> SGML <-> XML Conversion -->
-<!-- -->
-<!-- PURPOSE: Define relationships between MARC Extended Latin -->
-<!-- character set, character numbers, SGML entities -->
-<!-- and XML entities. -->
-<!-- -->
-<!-- CONTAINS: SGML Document conforming to the Character-Entity -->
-<!-- Map File DTD -->
-<!-- -->
-<!-- MODULES REQUIRED: -->
-<!-- None -->
-<!-- -->
-<!-- CREATED FOR: -->
-<!-- MARC Standards Office -->
-<!-- -->
-<!-- ORIGINAL CREATION DATE: -->
-<!-- October 1997 -->
-<!-- -->
-<!-- CREATED BY: -->
-<!-- Mulberry Technologies, Inc. (TKG) -->
-<!-- 17 West Jefferson Street, Suite 207 -->
-<!-- Rockville, MD 20850 USA -->
-<!-- Phone: +1 301/315-9631 -->
-<!-- Fax: +1 301/315-8285 -->
-<!-- e-mail: info@mulberrytech.com -->
-<!-- WWW: http://www.mulberrytech.com -->
-<!-- ============================================================= -->
-<entitymap>
-<character hex="E2 41" dec="226 065"><isoentity>Aacute</isoentity><desc>latin capital letter a with acute</desc><unientity>00C1</unientity></character>
-<character hex="E2 61" dec="226 097"><isoentity>aacute</isoentity><desc>latin small letter a with acute</desc><unientity>00E1</unientity></character>
-<character hex="E2 E6 41" dec="226 230 065"><isoentity>Abreveac</isoentity><desc>latin capital letter a with breve and acute</desc><unientity>1EAE</unientity></character>
-<character hex="E2 E6 61" dec="226 230 096"><isoentity>abreveac</isoentity><desc>latin small letter a with breve and acute</desc><unientity>1EAF</unientity></character>
-<character hex="E6 F2 41" dec="230 242 065"><isoentity>Abrevedb</isoentity><desc>latin capital letter a with breve and dot below</desc><unientity>1EB6</unientity></character>
-<character hex="E6 F2 61" dec="230 242 097"><isoentity>abrevedb</isoentity><desc>latin small letter a with breve and dot below</desc><unientity>1EB7</unientity></character>
-<character hex="E1 E6 41" dec="225 230 065"><isoentity>Abrevegr</isoentity><desc>latin capital letter a with breve and grave</desc><unientity>1EB0</unientity></character>
-<character hex="E1 E6 61" dec="225 230 097"><isoentity>abrevegr</isoentity><desc>latin small letter a with breve and grave</desc><unientity>1EB1</unientity></character>
-<character hex="E0 E6 41" dec="224 230 065"><isoentity>Abreveha</isoentity><desc>latin capital letter a with breve and hook above</desc><unientity>1EB2</unientity></character>
-<character hex="E0 E6 61" dec="224 230 097"><isoentity>abreveha</isoentity><desc>latin small letter a with breve and hook above</desc><unientity>1EB3</unientity></character>
-<character hex="E4 E6 41" dec="228 230 065"><isoentity>Abreveti</isoentity><desc>latin capital letter a with breve and tilde</desc><unientity>1EB4</unientity></character>
-<character hex="E4 E6 61" dec="228 230 097"><isoentity>abreveti</isoentity><desc>latin small letter a with breve and tilde</desc><unientity>1EB5</unientity></character>
-<character hex="E6 41" dec="230 065"><isoentity>Abreve</isoentity><desc>latin capital letter a with breve</desc><unientity>0102</unientity></character>
-<character hex="E6 61" dec="230 097"><isoentity>abreve</isoentity><desc>latin small letter a with breve</desc><unientity>0103</unientity></character>
-<character hex="E9 41" dec="233 065"><isoentity>Acaron</isoentity><desc>latin capital letter a with caron</desc><unientity>01CD</unientity></character>
-<character hex="E9 61" dec="233 097"><isoentity>acaron</isoentity><desc>latin small letter a with caron</desc><unientity>01CE</unientity></character>
-<character hex="E3 E2 41" dec="227 226 065"><isoentity>Acircac</isoentity><desc>latin capital letter a with circumflex and acute</desc><unientity>1EA4</unientity></character>
-<character hex="E3 E2 61" dec="227 226 097"><isoentity>acircac</isoentity><desc>latin small letter a with circumflex and acute</desc><unientity>1EA5</unientity></character>
-<character hex="E3 F2 41" dec="227 242 065"><isoentity>Acircdb</isoentity><desc>latin capital letter a with circumflex and dot below</desc><unientity>1EAC</unientity></character>
-<character hex="E3 F2 61" dec="227 242 097"><isoentity>acircdb</isoentity><desc>latin small letter a with circumflex and dot below</desc><unientity>1EAD</unientity></character>
-<character hex="E3 E1 41" dec="227 225 065"><isoentity>acircgr</isoentity><desc>latin capital letter a with circumflex and grave</desc><unientity>1EA6</unientity></character>
-<character hex="E3 E1 61" dec="227 225 097"><isoentity>acircgr</isoentity><desc>latin small letter a with circumflex and grave</desc><unientity>1EA7</unientity></character>
-<character hex="E3 E0 41" dec="227 224 064"><isoentity>Acircha</isoentity><desc>latin capital letter a with circumflex and hook above</desc><unientity>1EA8</unientity></character>
-<character hex="E3 E0 61" dec="227 224 097"><isoentity>acircha</isoentity><desc>latin small letter a with circumflex and hook above</desc><unientity>1EA9</unientity></character>
-<character hex="E4 E3 41" dec="228 227 065"><isoentity>Acircti</isoentity><desc>latin capital letter a with circumflex and tilde</desc><unientity>1EAA</unientity></character>
-<character hex="E4 E3 61" dec="228 227 097"><isoentity>acircti</isoentity><desc>latin small letter a with circumflex and tilde</desc><unientity>1EAB</unientity></character>
-<character hex="E3 41" dec="227 065"><isoentity>Acirc</isoentity><desc>latin capital letter a with circumflex</desc><unientity>00C2</unientity></character>
-<character hex="E3 61" dec="227 097"><isoentity>acirc</isoentity><desc>latin small letter a with circumflex</desc><unientity>00E2</unientity></character>
-<character hex="E2" dec="226"><isoentity>acute</isoentity><desc>combining acute accent</desc><unientity>0301</unientity></character>
-<character hex="E5 E7 41" dec="229 231 065"><isoentity>Adotama</isoentity><desc>latin capital letter a with dot above and macron</desc><unientity>01E0</unientity></character>
-<character hex="E5 E7 61" dec="229 231 097"><isoentity>adotama</isoentity><desc>latin small letter a with dot above and macron</desc><unientity>01E1</unientity></character>
-<character hex="F2 41" dec="242 065"><isoentity>Adotb</isoentity><desc>latin capital letter a with dot below</desc><unientity>1EA0</unientity></character>
-<character hex="F2 61" dec="242 097"><isoentity>adotb</isoentity><desc>latin small letter a with dot below</desc><unientity>1EA1</unientity></character>
-<character hex="E7 41" dec="231 065"><isoentity>Adot</isoentity><desc>latin capital letter a with dot above</desc><unientity>0226</unientity></character>
-<character hex="E7 61" dec="231 097"><isoentity>adot</isoentity><desc>latin small letter a with dot above</desc><unientity>0227</unientity></character>
-<character hex="E2 A5" dec="226 165"><isoentity>Aeacute</isoentity><desc>latin capital letter ae with acute</desc><unientity>01FC</unientity></character>
-<character hex="E2 B5" dec="226 181"><isoentity>aeacute</isoentity><desc>latin small letter ae with acute</desc><unientity>01FD</unientity></character>
-<character hex="A5" dec="165"><isoentity>AElig</isoentity><desc>latin capital letter ae</desc><unientity>00C6</unientity></character>
-<character hex="B5" dec="181"><isoentity>aelig</isoentity><desc>latin small letter ae</desc><unientity>00E6</unientity></character>
-<character hex="E5 A5" dec="229 065"><isoentity>Aemacr</isoentity><desc>latin capital letter ae with macron</desc><unientity>01E2</unientity></character>
-<character hex="E5 B5" dec="229 097"><isoentity>aemacr</isoentity><desc>latin small letter ae with macron</desc><unientity>01E3</unientity></character>
-<character hex="E1 41" dec="225 065"><isoentity>Agrave</isoentity><desc>latin capital letter a with grave</desc><unientity>00C0</unientity></character>
-<character hex="E1 61" dec="225 097"><isoentity>agrave</isoentity><desc>latin small letter a with grave</desc><unientity>00E0</unientity></character>
-<character hex="E0 41" dec="224 065"><isoentity>Ahooka</isoentity><desc>latin capital letter a with hook above</desc><unientity>1EA2</unientity></character>
-<character hex="E0 61" dec="224 097"><isoentity>ahooka</isoentity><desc>latin small letter a with hook above</desc><unientity>1EA3</unientity></character>
-<character hex="1B 67 61 1B 73" dec="027 103 097 027 115"><isoentity>alpha</isoentity><desc>greek small letter alpha</desc><unientity>03B1</unientity></character>
-<character hex="E5 41" dec="229 065"><isoentity>Amacr</isoentity><desc>latin capital letter a with macron</desc><unientity>0100</unientity></character>
-<character hex="E5 61" dec="229 097"><isoentity>amacr</isoentity><desc>latin small letter a with macron</desc><unientity>0101</unientity></character>
-<character hex="F1 41" dec="241 065"><isoentity>Aogon</isoentity><desc>latin capital letter a with ogonek</desc><unientity>0104</unientity></character>
-<character hex="F1 61" dec="241 097"><isoentity>aogon</isoentity><desc>latin small letter a with ogonek</desc><unientity>0105</unientity></character>
-<character hex="E2 EA 41" dec="226 234 065"><isoentity>Aringac</isoentity><desc>latin capital letter a with ring above and acute</desc><unientity>01FA</unientity></character>
-<character hex="E2 EA 61" dec="226 234 096"><isoentity>aringac</isoentity><desc>latin small letter a with ring above and acute</desc><unientity>01FB</unientity></character>
-<character hex="EA 41" dec="234 065"><isoentity>Aring</isoentity><desc>latin capital letter a with ring</desc><unientity>00C5</unientity></character>
-<character hex="EA 61" dec="234 097"><isoentity>aring</isoentity><desc>latin small letter a with ring</desc><unientity>00E5</unientity></character>
-<character hex="E4 41" dec="228 065"><isoentity>Atilde</isoentity><desc>latin capital letter a with tilde</desc><unientity>00C3</unientity></character>
-<character hex="E4 61" dec="228 097"><isoentity>atilde</isoentity><desc>latin small letter a with tilde</desc><unientity>00E3</unientity></character>
-<character hex="E5 E8 41" dec="229 232 065"><isoentity>Aumlma</isoentity><desc>latin capital letter a with diaeresis and macron</desc><unientity>01DE</unientity></character>
-<character hex="E5 E8 61" dec="229 232 097"><isoentity>aumlma</isoentity><desc>latin small letter a with diaeresis and macron</desc><unientity>01DF</unientity></character>
-<character hex="E8 41" dec="232 065"><isoentity>Auml</isoentity><desc>latin capital letter a with umlaut</desc><unientity>00C4</unientity></character>
-<character hex="E8 61" dec="232 097"><isoentity>auml</isoentity><desc>latin small letter a with umlaut</desc><unientity>00E4</unientity></character>
-<character hex="E7 42" dec="231 066"><isoentity>Bdota</isoentity><desc>latin capital letter b with dot above</desc><unientity>1E02</unientity></character>
-<character hex="E7 62" dec="231 098"><isoentity>bdota</isoentity><desc>latin small letter b with dot above</desc><unientity>1E03</unientity></character>
-<character hex="F2 42" dec="242 066"><isoentity>Bdotb</isoentity><desc>latin capital letter b with dot below</desc><unientity>1E04</unientity></character>
-<character hex="F2 62" dec="242 098"><isoentity>bdotb</isoentity><desc>latin small letter b with dot below</desc><unientity>1E05</unientity></character>
-<character hex="1B 67 62 1B 73" dec="027 103 098 027 115"><isoentity>beta</isoentity><desc>greek small letter beta</desc><unientity>03B2</unientity></character>
-<character hex="F6 42" dec="246 066"><isoentity>Bmacrb</isoentity><desc>latin capital letter b with line below</desc><unientity>1E06</unientity></character>
-<character hex="F6 62" dec="246 098"><isoentity>bmacrb</isoentity><desc>latin small letter b with line below</desc><unientity>1E07</unientity></character>
-<character hex="F9" dec="249"><isoentity>breveb</isoentity><desc>combining breve below</desc><unientity>032E</unientity></character>
-<character hex="E6" dec="230"><isoentity>breve</isoentity><desc>combining breve</desc><unientity>0306</unientity></character>
-<character hex="E2 43" dec="226 067"><isoentity>Cacute</isoentity><desc>latin capital letter c with acute</desc><unientity>0106</unientity></character>
-<character hex="E2 63" dec="226 099"><isoentity>cacute</isoentity><desc>latin small letter c with acute</desc><unientity>0107</unientity></character>
-<character hex="EF" dec="239"><isoentity>candra</isoentity><desc>combining candrabindu</desc><unientity>0310</unientity></character>
-<character hex="E9" dec="233"><isoentity>caron</isoentity><desc>combining caron</desc><unientity>030C</unientity></character>
-<character hex="E9 43" dec="233 067"><isoentity>Ccaron</isoentity><desc>latin capital letter c with caron</desc><unientity>010C</unientity></character>
-<character hex="E9 63" dec="233 099"><isoentity>ccaron</isoentity><desc>latin small letter c with caron</desc><unientity>010D</unientity></character>
-<character hex="E2 F0 43" dec="226 240 067"><isoentity>Ccedilac</isoentity><desc>latin capital letter c with cedilla and acute</desc><unientity>1E08</unientity></character>
-<character hex="E2 F0 63" dec="226 240 099"><isoentity>ccedilac</isoentity><desc>latin small letter c with cedilla and acute</desc><unientity>1E09</unientity></character>
-<character hex="F0 43" dec="240 067"><isoentity>Ccedil</isoentity><desc>latin capital letter c with cedilla</desc><unientity>00C7</unientity></character>
-<character hex="F0 63" dec="240 099"><isoentity>ccedil</isoentity><desc>latin small letter c with cedilla</desc><unientity>00E7</unientity></character>
-<character hex="E3 43" dec="227 067"><isoentity>Ccirc</isoentity><desc>latin capital letter c with circumflex</desc><unientity>0108</unientity></character>
-<character hex="E3 63" dec="227 099"><isoentity>ccirc</isoentity><desc>latin small letter c with circumflex</desc><unientity>0109</unientity></character>
-<character hex="E7 43" dec="231 067"><isoentity>Cdot</isoentity><desc>latin capital letter c with dot above</desc><unientity>010A</unientity></character>
-<character hex="E7 63" dec="231 099"><isoentity>cdot</isoentity><desc>latin small letter c with dot above</desc><unientity>010B</unientity></character>
-<character hex="F0" dec="240"><isoentity>cedil</isoentity><desc>combining cedilla</desc><unientity>0327</unientity></character>
-<character hex="E3" dec="227"><isoentity>circ</isoentity><desc>combining circumflex</desc><unientity>0302</unientity></character>
-<character hex="FE" dec="254"><isoentity>commaa</isoentity><desc>combining comma above</desc><unientity>0313</unientity></character>
-<character hex="F7" dec="247"><isoentity>commab</isoentity><desc>combining comma below</desc><unientity>0326</unientity></character>
-<character hex="C2" dec="194"><isoentity>copysr</isoentity><desc>sound recording copyright</desc><unientity>2117</unientity></character>
-<character hex="C3" dec="195"><isoentity>copy</isoentity><desc>copyright sign</desc><unientity>00A9</unientity></character>
-<character hex="EE" dec="238"><isoentity>dblac</isoentity><desc>combining double acute accent</desc><unientity>030B</unientity></character>
-<character hex="F3" dec="243"><isoentity>dbldotb</isoentity><desc>combining double dot below</desc><unientity>0324</unientity></character>
-<character hex="F5" dec="245"><isoentity>dblunder</isoentity><desc>combining double low line</desc><unientity>0333</unientity></character>
-<character hex="E9 44" dec="233 068"><isoentity>Dcaron</isoentity><desc>latin capital letter d with caron</desc><unientity>010E</unientity></character>
-<character hex="E9 64" dec="233 100"><isoentity>dcaron</isoentity><desc>latin small letter d with caron</desc><unientity>010F</unientity></character>
-<character hex="F7 44" dec="247 068"><isoentity>Dcommab</isoentity><desc>latin capital letter d with comma below</desc><unientity>1E10</unientity></character>
-<character hex="F7 64" dec="247 100"><isoentity>dcommab</isoentity><desc>latin small letter d with comma below</desc><unientity>1E11</unientity></character>
-<character hex="E7 44" dec="231 068"><isoentity>Ddota</isoentity><desc>latin capital letter d with dot above</desc><unientity>1E0A</unientity></character>
-<character hex="E7 64" dec="231 100"><isoentity>ddota</isoentity><desc>latin small letter d with dot above</desc><unientity>1E0B</unientity></character>
-<character hex="F2 44" dec="242 068"><isoentity>Ddotb</isoentity><desc>latin capital letter d with dot below</desc><unientity>1E0C</unientity></character>
-<character hex="F2 64" dec="242 100"><isoentity>ddotb</isoentity><desc>latin small letter d with dot below</desc><unientity>1E0D</unientity></character>
-<character hex="C0" dec="192"><isoentity>deg</isoentity><desc>degree sign</desc><unientity>00B0</unientity></character>
-<character hex="F6 44" dec="246 068"><isoentity>Dmacrb</isoentity><desc>latin capital letter d with line below</desc><unientity>1E0E</unientity></character>
-<character hex="F6 64" dec="246 100"><isoentity>dmacrb</isoentity><desc>latin small letter d with line below</desc><unientity>1E0F</unientity></character>
-<character hex="F2" dec="242"><isoentity>dotb</isoentity><desc>combining dot below</desc><unientity>0323</unientity></character>
-<character hex="E7" dec="231"><isoentity>dot</isoentity><desc>combining dot above</desc><unientity>0307</unientity></character>
-<character hex="A3" dec="163"><isoentity>Dstrok</isoentity><desc>latin capital letter d with stroke</desc><unientity>0110</unientity></character>
-<character hex="B3" dec="179"><isoentity>dstrok</isoentity><desc>latin small letter d with stroke</desc><unientity>0111</unientity></character>
-<character hex="E2 45" dec="226 069"><isoentity>Eacute</isoentity><desc>latin capital letter e with acute</desc><unientity>00C9</unientity></character>
-<character hex="E2 65" dec="226 101"><isoentity>eacute</isoentity><desc>latin small letter e with acute</desc><unientity>00E9</unientity></character>
-<character hex="E6 45" dec="230 069"><isoentity>Ebreve</isoentity><desc>latin capital letter e with breve</desc><unientity>0114</unientity></character>
-<character hex="E6 65" dec="230 101"><isoentity>ebreve</isoentity><desc>latin small letter e with breve</desc><unientity>0115</unientity></character>
-<character hex="E9 45" dec="233 069"><isoentity>Ecaron</isoentity><desc>latin capital letter e with caron</desc><unientity>011A</unientity></character>
-<character hex="E9 65" dec="233 101"><isoentity>ecaron</isoentity><desc>latin small letter e with caron</desc><unientity>011B</unientity></character>
-<character hex="E6 F0 45" dec="230 240 069"><isoentity>Ecedilbr</isoentity><desc>latin capital letter e with cedilla and breve</desc><unientity>1E1C</unientity></character>
-<character hex="E6 F0 65" dec="230 240 101"><isoentity>ecedilbr</isoentity><desc>latin small letter e with cedilla and breve</desc><unientity>1E1D</unientity></character>
-<character hex="F0 45" dec="240 069"><isoentity>Ecedil</isoentity><desc>latin capital letter e with cedilla</desc><unientity>0228</unientity></character>
-<character hex="F0 65" dec="240 101"><isoentity>ecedil</isoentity><desc>latin small letter e with cedilla</desc><unientity>0229</unientity></character>
-<character hex="E3 E2 45" dec="227 226 069"><isoentity>Ecircac</isoentity><desc>latin capital letter e with circumflex and acute</desc><unientity>1EBE</unientity></character>
-<character hex="E3 E2 65" dec="227 226 101"><isoentity>ecircac</isoentity><desc>latin small letter e with circumflex and acute</desc><unientity>1EBF</unientity></character>
-<character hex="E3 F2 45" dec="227 242 069"><isoentity>Ecircdb</isoentity><desc>latin capital letter e with circumflex and dot below</desc><unientity>1EC6</unientity></character>
-<character hex="E3 F2 65" dec="227 242 101"><isoentity>ecircdb</isoentity><desc>latin small letter e with circumflex and dot below</desc><unientity>1EC7</unientity></character>
-<character hex="E1 E3 45" dec="225 227 069"><isoentity>Ecircgr</isoentity><desc>latin capital letter e with circumflex and grave</desc><unientity>1EC0</unientity></character>
-<character hex="E1 E3 65" dec="225 227 101"><isoentity>ecircgr</isoentity><desc>latin small letter e with circumflex and grave</desc><unientity>1EC1</unientity></character>
-<character hex="E3 E0 45" dec="227 224 069"><isoentity>Ecircha</isoentity><desc>latin capital letter e with circumflex and hook above</desc><unientity>1EC2</unientity></character>
-<character hex="E3 E0 65" dec="227 224 101"><isoentity>ecircha</isoentity><desc>latin small letter e with circumflex and hook above</desc><unientity>1EC3</unientity></character>
-<character hex="E4 E3 45" dec="228 227 069"><isoentity>Ecircti</isoentity><desc>latin capital letter e with circumflex and tilde</desc><unientity>1EC4</unientity></character>
-<character hex="E3 45" dec="227 069"><isoentity>Ecirc</isoentity><desc>latin capital letter e with circumflex</desc><unientity>00CA</unientity></character>
-<character hex="E3 65" dec="227 101"><isoentity>ecirc</isoentity><desc>latin small letter e with circumflex</desc><unientity>00EA</unientity></character>
-<character hex="F2 45" dec="242 069"><isoentity>Edotb</isoentity><desc>latin capital letter e with dot below</desc><unientity>1EB8</unientity></character>
-<character hex="F2 65" dec="242 101"><isoentity>edotb</isoentity><desc>latin small letter e with dot below</desc><unientity>1EB9</unientity></character>
-<character hex="E7 45" dec="231 069"><isoentity>Edot</isoentity><desc>latin capital letter e with dot above</desc><unientity>0116</unientity></character>
-<character hex="E7 65" dec="231 101"><isoentity>edot</isoentity><desc>latin small letter e with dot above</desc><unientity>0117</unientity></character>
-<character hex="E1 45" dec="225 069"><isoentity>Egrave</isoentity><desc>latin capital letter e with grave</desc><unientity>00C8</unientity></character>
-<character hex="E1 65" dec="225 101"><isoentity>egrave</isoentity><desc>latin small letter e with grave</desc><unientity>00E8</unientity></character>
-<character hex="E0 45" dec="224 069"><isoentity>Ehooka</isoentity><desc>latin capital letter e with hook above</desc><unientity>1EBA</unientity></character>
-<character hex="E0 65" dec="224 101"><isoentity>ehooka</isoentity><desc>latin small letter e with hook above</desc><unientity>1EBB</unientity></character>
-<character hex="E2 E5 45" dec="226 229 069"><isoentity>Emacrac</isoentity><desc>latin capital letter e with macron and acute</desc><unientity>1E16</unientity></character>
-<character hex="E2 E5 65" dec="226 229 101"><isoentity>emacrac</isoentity><desc>latin small letter e with macron and acute</desc><unientity>1E17</unientity></character>
-<character hex="E1 E5 45" dec="225 229 069"><isoentity>Emacrgr</isoentity><desc>latin capital letter e with macron and grave</desc><unientity>1E14</unientity></character>
-<character hex="E1 E5 65" dec="225 229 101"><isoentity>emacrgr</isoentity><desc>latin small letter e with macron and grave</desc><unientity>1E15</unientity></character>
-<character hex="E5 45" dec="229 069"><isoentity>Emacr</isoentity><desc>latin capital letter e with macron</desc><unientity>0112</unientity></character>
-<character hex="E5 65" dec="229 101"><isoentity>emacr</isoentity><desc>latin small letter e with macron</desc><unientity>0113</unientity></character>
-<character hex="F1 45" dec="241 069"><isoentity>Eogon</isoentity><desc>latin capital letter e with ogon</desc><unientity>0118</unientity></character>
-<character hex="F1 65" dec="241 101"><isoentity>eogon</isoentity><desc>latin small letter e with ogon</desc><unientity>0119</unientity></character>
-<character hex="BA" dec="186"><isoentity>eth</isoentity><desc>latin small letter eth</desc><unientity>00F0</unientity></character>
-<character hex="E4 45" dec="228 069"><isoentity>Etilde</isoentity><desc>latin capital letter e with tilde</desc><unientity>1EBC</unientity></character>
-<character hex="E4 65" dec="228 101"><isoentity>etilde</isoentity><desc>latin small letter e with tilde</desc><unientity>1EBD</unientity></character>
-<character hex="E8 45" dec="232 069"><isoentity>Euml</isoentity><desc>latin capital letter e with umlaut</desc><unientity>00CB</unientity></character>
-<character hex="E8 65" dec="232 101"><isoentity>euml</isoentity><desc>latin small letter e with umlaut</desc><unientity>00EB</unientity></character>
-<character hex="E7 46" dec="231 070"><isoentity>Fdot</isoentity><desc>latin capital letter f with dot above</desc><unientity>1E1E</unientity></character>
-<character hex="E7 66" dec="231 102"><isoentity>fdot</isoentity><desc>latin small letter f with dot above</desc><unientity>1E1F</unientity></character>
-<character hex="A9" dec="169"><isoentity>flat</isoentity><desc>musical flat sign</desc><unientity>266D</unientity></character>
-<character hex="E2 47" dec="226 071"><isoentity>Gacute</isoentity><desc>latin capital letter g with acute</desc><unientity>01F4</unientity></character>
-<character hex="E2 67" dec="226 103"><isoentity>gacute</isoentity><desc>latin small letter g with acute</desc><unientity>01F5</unientity></character>
-<character hex="1B 67 63 1B 73" dec="027 103 099 027 115"><isoentity>gamma</isoentity><desc>greek small letter gamma</desc><unientity>03B3</unientity></character>
-<character hex="E6 47" dec="230 071"><isoentity>Gbreve</isoentity><desc>latin capital letter g with breve</desc><unientity>011E</unientity></character>
-<character hex="E6 67" dec="230 103"><isoentity>gbreve</isoentity><desc>latin small letter g with breve</desc><unientity>011F</unientity></character>
-<character hex="E9 47" dec="233 071"><isoentity>Gcaron</isoentity><desc>latin capital letter g with caron</desc><unientity>01E6</unientity></character>
-<character hex="E9 67" dec="233 103"><isoentity>gcaron</isoentity><desc>latin small letter g with caron</desc><unientity>01E7</unientity></character>
-<character hex="F0 47" dec="240 071"><isoentity>Gcedil</isoentity><desc>latin capital letter g with cedilla</desc><unientity>0122</unientity></character>
-<character hex="F0 67" dec="240 103"><isoentity>gcedil</isoentity><desc>latin small letter g with cedilla</desc><unientity>0123</unientity></character>
-<character hex="E3 47" dec="227 071"><isoentity>Gcirc</isoentity><desc>latin capital letter g with circumflex</desc><unientity>011C</unientity></character>
-<character hex="E3 67" dec="227 103"><isoentity>gcirc</isoentity><desc>latin small letter g with circumflex</desc><unientity>011D</unientity></character>
-<character hex="E7 47" dec="231 071"><isoentity>Gdot</isoentity><desc>latin capital letter g with dot above</desc><unientity>0120</unientity></character>
-<character hex="E7 67" dec="231 103"><isoentity>gdot</isoentity><desc>latin small letter g with dot above</desc><unientity>0121</unientity></character>
-<character hex="E5 47" dec="229 071"><isoentity>Gmacr</isoentity><desc>latin capital letter g with macron</desc><unientity>1E20</unientity></character>
-<character hex="E5 67" dec="229 103"><isoentity>gmacr</isoentity><desc>latin small letter g with macron</desc><unientity>1E21</unientity></character>
-<character hex="E1" dec="225"><isoentity>grave</isoentity><desc>combining grave accent</desc><unientity>0300</unientity></character>
-<character hex="F5 47" dec="245 071"><isoentity>Gstrok</isoentity><desc>latin capital letter g with stroke</desc><unientity>01E4</unientity></character>
-<character hex="F5 67" dec="245 103"><isoentity>gstrok</isoentity><desc>latin small letter g with stroke</desc><unientity>01E5</unientity></character>
-<character hex="B7" dec="183"><isoentity>hardsign</isoentity><desc>modifier letter double prime</desc><unientity>02BA</unientity></character>
-<character hex="F9 48" dec="249 072"><isoentity>Hbreveb</isoentity><desc>latin capital letter h with breve below</desc><unientity>1E2A</unientity></character>
-<character hex="F9 68" dec="249 104"><isoentity>hbreveb</isoentity><desc>latin small letter h with breve below</desc><unientity>1E2B</unientity></character>
-<character hex="E9 48" dec="233 072"><isoentity>Hcaron</isoentity><desc>latin capital letter h with caron</desc><unientity>021E</unientity></character>
-<character hex="E9 68" dec="233 104"><isoentity>hcaron</isoentity><desc>latin small letter h with caron</desc><unientity>021F</unientity></character>
-<character hex="F0 48" dec="240 072"><isoentity>Hcedil</isoentity><desc>latin capital letter h with cedilla</desc><unientity>1E28</unientity></character>
-<character hex="F0 68" dec="240 104"><isoentity>hcedil</isoentity><desc>latin small letter h with cedilla</desc><unientity>1E29</unientity></character>
-<character hex="E3 48" dec="227 072"><isoentity>Hcirc</isoentity><desc>latin capital letter h with circumflex</desc><unientity>0124</unientity></character>
-<character hex="E3 68" dec="227 104"><isoentity>hcirc</isoentity><desc>latin small letter h with circumflex</desc><unientity>0125</unientity></character>
-<character hex="F2 48" dec="242 072"><isoentity>Hdotb</isoentity><desc>latin capital letter h with dot below</desc><unientity>1E24</unientity></character>
-<character hex="F2 68" dec="242 104"><isoentity>hdotb</isoentity><desc>latin small letter h with dot below</desc><unientity>1E25</unientity></character>
-<character hex="E7 48" dec="231 072"><isoentity>Hdot</isoentity><desc>latin capital letter h with dot above</desc><unientity>1E22</unientity></character>
-<character hex="E7 68" dec="231 104"><isoentity>hdot</isoentity><desc>latin small letter h with dot above</desc><unientity>1E23</unientity></character>
-<character hex="F6 68" dec="246 104"><isoentity>hlowline</isoentity><desc>latin small letter h with low line</desc><unientity>1E96</unientity></character>
-<character hex="E0" dec="224"><isoentity>hooka</isoentity><desc>combining hook above</desc><unientity>0309</unientity></character>
-<character hex="F5 48" dec="245 072"><isoentity>Hstroke</isoentity><desc>latin capital letter h with stroke</desc><unientity>0126</unientity></character>
-<character hex="F5 68" dec="245 104"><isoentity>hstroke</isoentity><desc>latin small letter h with stroke</desc><unientity>0127</unientity></character>
-<character hex="E8 48" dec="232 072"><isoentity>Huml</isoentity><desc>latin capital letter h with diaeresis</desc><unientity>1E26</unientity></character>
-<character hex="E8 68" dec="232 104"><isoentity>huml</isoentity><desc>latin small letter h with diaeresis</desc><unientity>1E27</unientity></character>
-<character hex="E2 49" dec="226 073"><isoentity>Iacute</isoentity><desc>latin capital letter i with acute</desc><unientity>00CD</unientity></character>
-<character hex="E2 69" dec="226 105"><isoentity>iacute</isoentity><desc>latin small letter i with acute</desc><unientity>00ED</unientity></character>
-<character hex="E6 49" dec="230 073"><isoentity>Ibreve</isoentity><desc>latin capital letter i with breve</desc><unientity>012C</unientity></character>
-<character hex="E6 69" dec="230 105"><isoentity>ibreve</isoentity><desc>latin small letter i with breve</desc><unientity>012D</unientity></character>
-<character hex="E9 49" dec="233 073"><isoentity>Icaron</isoentity><desc>latin capital letter i with caron</desc><unientity>01CF</unientity></character>
-<character hex="E9 69" dec="233 105"><isoentity>icaron</isoentity><desc>latin small letter i with caron</desc><unientity>01D0</unientity></character>
-<character hex="E3 49" dec="227 073"><isoentity>Icirc</isoentity><desc>latin capital letter i with circumflex</desc><unientity>00CE</unientity></character>
-<character hex="E3 69" dec="227 105"><isoentity>icirc</isoentity><desc>latin small letter i with circumflex</desc><unientity>00EE</unientity></character>
-<character hex="F2 49" dec="242 073"><isoentity>Idotb</isoentity><desc>latin capital letter i with dot below</desc><unientity>1ECA</unientity></character>
-<character hex="F2 69" dec="242 105"><isoentity>idotb</isoentity><desc>latin small letter i with dot below</desc><unientity>1ECB</unientity></character>
-<character hex="E7 49" dec="231 073"><isoentity>Idot</isoentity><desc>latin capital letter i with dot above</desc><unientity>0130</unientity></character>
-<character hex="C6" dec="198"><isoentity>iexcl</isoentity><desc>inverted exclamation mark</desc><unientity>00A1</unientity></character>
-<character hex="E1 49" dec="225 073"><isoentity>Igrave</isoentity><desc>latin capital letter i with grave</desc><unientity>00CC</unientity></character>
-<character hex="E1 69" dec="225 105"><isoentity>igrave</isoentity><desc>latin small letter i with grave</desc><unientity>00EC</unientity></character>
-<character hex="E0 49" dec="224 073"><isoentity>Ihooka</isoentity><desc>latin capital letter i with hook above</desc><unientity>1EC8</unientity></character>
-<character hex="E0 69" dec="224 105"><isoentity>ihooka</isoentity><desc>latin small letter i with hook above</desc><unientity>1EC9</unientity></character>
-<character hex="E5 49" dec="229 073"><isoentity>Imacr</isoentity><desc>latin capital letter i with macron</desc><unientity>012A</unientity></character>
-<character hex="E5 69" dec="229 105"><isoentity>imacr</isoentity><desc>latin small letter i with macron</desc><unientity>012B</unientity></character>
-<character hex="B8" dec="184"><isoentity>inodot</isoentity><desc>latin small letter dotless i</desc><unientity>0131</unientity></character>
-<character hex="F1 49" dec="241 073"><isoentity>Iogon</isoentity><desc>latin capital letter i with ogon</desc><unientity>012E</unientity></character>
-<character hex="F1 69" dec="241 105"><isoentity>iogon</isoentity><desc>latin small letter i with ogon</desc><unientity>012F</unientity></character>
-<character hex="C5" dec="197"><isoentity>iquest</isoentity><desc>inverted question mark</desc><unientity>00BF</unientity></character>
-<character hex="E4 49" dec="228 073"><isoentity>Itilde</isoentity><desc>latin capital letter i with tilde</desc><unientity>0128</unientity></character>
-<character hex="E4 69" dec="228 105"><isoentity>itilde</isoentity><desc>latin small letter i with tilde</desc><unientity>0129</unientity></character>
-<character hex="E2 E8 49" dec="226 232 073"><isoentity>Iumlac</isoentity><desc>latin capital letter i with diaeresis and acute</desc><unientity>1E2E</unientity></character>
-<character hex="E2 E8 69" dec="226 232 105"><isoentity>iumlac</isoentity><desc>latin small letter i with diaeresis and acute</desc><unientity>1E2F</unientity></character>
-<character hex="E8 49" dec="232 073"><isoentity>Iuml</isoentity><desc>latin capital letter i with umlaut</desc><unientity>00CF</unientity></character>
-<character hex="E8 69" dec="232 105"><isoentity>iuml</isoentity><desc>latin small letter i with umlaut</desc><unientity>00EF</unientity></character>
-<character hex="E9 6A" dec="233 106"><isoentity>jcaron</isoentity><desc>latin small letter j with caron</desc><unientity>01F0</unientity></character>
-<character hex="E3 4A" dec="227 074"><isoentity>Jcirc</isoentity><desc>latin capital letter j with circumflex</desc><unientity>0134</unientity></character>
-<character hex="E3 6A" dec="227 106"><isoentity>jcirc</isoentity><desc>latin small letter j with circumflex</desc><unientity>0135</unientity></character>
-<character hex="E2 4B" dec="226 075"><isoentity>Kacute</isoentity><desc>latin capital letter k with acute</desc><unientity>1E30</unientity></character>
-<character hex="E2 6B" dec="226 107"><isoentity>kacute</isoentity><desc>latin small letter k with acute</desc><unientity>1E31</unientity></character>
-<character hex="F0 4B" dec="240 075"><isoentity>Kcedil</isoentity><desc>latin capital letter k with cedilla</desc><unientity>0136</unientity></character>
-<character hex="F0 6B" dec="240 107"><isoentity>kcedil</isoentity><desc>latin small letter k with cedilla</desc><unientity>0137</unientity></character>
-<character hex="E3 4B" dec="227 075"><isoentity>Kcirc</isoentity><desc>latin capital letter k with circumflex</desc><unientity>01E8</unientity></character>
-<character hex="E3 6B" dec="227 107"><isoentity>kcirc</isoentity><desc>latin small letter k with circumflex</desc><unientity>01E9</unientity></character>
-<character hex="F2 4B" dec="242 075"><isoentity>Kdotb</isoentity><desc>latin capital letter k with dot below</desc><unientity>1E32</unientity></character>
-<character hex="F2 6B" dec="242 107"><isoentity>kdotb</isoentity><desc>latin small letter k with dot below</desc><unientity>1E33</unientity></character>
-<character hex="F6 4B" dec="246 075"><isoentity>Kmacrb</isoentity><desc>latin capital letter k with line below</desc><unientity>1E34</unientity></character>
-<character hex="F6 6B" dec="246 107"><isoentity>kmacrb</isoentity><desc>latin small letter k with line below</desc><unientity>1E35</unientity></character>
-<character hex="E2 4C" dec="226 076"><isoentity>Lacute</isoentity><desc>latin capital letter l with acute</desc><unientity>0139</unientity></character>
-<character hex="E2 6C" dec="226 108"><isoentity>lacute</isoentity><desc>latin small letter l with acute</desc><unientity>013A</unientity></character>
-<character hex="E9 4C" dec="233 076"><isoentity>Lcaron</isoentity><desc>latin capital letter l with caron</desc><unientity>013D</unientity></character>
-<character hex="E9 6C" dec="233 108"><isoentity>lcaron</isoentity><desc>latin small letter l with caron</desc><unientity>013E</unientity></character>
-<character hex="F0 4C" dec="240 076"><isoentity>Lcedil</isoentity><desc>latin capital letter l with cedilla</desc><unientity>013B</unientity></character>
-<character hex="F0 6C" dec="240 108"><isoentity>lcedil</isoentity><desc>latin small letter l with cedilla</desc><unientity>013C</unientity></character>
-<character hex="E3 4C" dec="227 076"><isoentity>Lcirc</isoentity><desc>latin capital letter l with circumflex</desc><unientity>1E3C</unientity></character>
-<character hex="E3 6C" dec="227 108"><isoentity>lcirc</isoentity><desc>latin small letter l with circumflex</desc><unientity>1E3D</unientity></character>
-<character hex="FA" dec="250"><isoentity>ldbltil</isoentity><desc>combining double tilde left half</desc><unientity>FE22</unientity></character>
-<character hex="E5 F2 4C" dec="229 242 079"><isoentity>Ldotbma</isoentity><desc>latin capital letter l with dot below and macron</desc><unientity>1E38</unientity></character>
-<character hex="E5 F2 6C" dec="229 242 111"><isoentity>ldotbma</isoentity><desc>latin small letter l with dot below and macron</desc><unientity>1E39</unientity></character>
-<character hex="F2 4C" dec="242 076"><isoentity>Ldotb</isoentity><desc>latin capital letter l with dot below</desc><unientity>1E36</unientity></character>
-<character hex="F2 6C" dec="242 108"><isoentity>ldotb</isoentity><desc>latin small letter l with dot below</desc><unientity>1E37</unientity></character>
-<character hex="EB" dec="235"><isoentity>llig</isoentity><desc>combining ligature left half</desc><unientity>FE20</unientity></character>
-<character hex="F6 4C" dec="246 076"><isoentity>Lmacrb</isoentity><desc>latin capital letter l with line below</desc><unientity>1E3A</unientity></character>
-<character hex="F6 6C" dec="246 108"><isoentity>lmacrb</isoentity><desc>latin small letter l with line below</desc><unientity>1E3B</unientity></character>
-<character hex="4C A8" dec="076 168"><isoentity>Lmidot</isoentity><desc>latin capital letter l with middle dot</desc><unientity>013F</unientity></character>
-<character hex="6C A8" dec="108 168"><isoentity>lmidot</isoentity><desc>latin small letter l with middle dot</desc><unientity>0140</unientity></character>
-<character hex="A1" dec="161"><isoentity>Lstrok</isoentity><desc>latin capital letter l with stroke</desc><unientity>0141</unientity></character>
-<character hex="B1" dec="177"><isoentity>lstrok</isoentity><desc>latin small letter l with stroke</desc><unientity>0142</unientity></character>
-<character hex="E5" dec="229"><isoentity>macr</isoentity><desc>combining macron</desc><unientity>0304</unientity></character>
-<character hex="E2 4D" dec="226 077"><isoentity>Macute</isoentity><desc>latin capital letter m with acute</desc><unientity>1E3E</unientity></character>
-<character hex="E2 6D" dec="226 109"><isoentity>macute</isoentity><desc>latin small letter m with acute</desc><unientity>1E3F</unientity></character>
-<character hex="F2 4D" dec="242 077"><isoentity>Mdotb</isoentity><desc>latin capital letter m with dot below</desc><unientity>1E42</unientity></character>
-<character hex="F2 6D" dec="242 109"><isoentity>mdotb</isoentity><desc>latin small letter m with dot below</desc><unientity>1E43</unientity></character>
-<character hex="E7 4D" dec="231 077"><isoentity>Mdot</isoentity><desc>latin capital letter m with dot above</desc><unientity>1E40</unientity></character>
-<character hex="E7 6D" dec="231 109"><isoentity>mdot</isoentity><desc>latin small letter m with dot above</desc><unientity>1E41</unientity></character>
-<character hex="A8" dec="168"><isoentity>middot</isoentity><desc>middle dot</desc><unientity>00B7</unientity></character>
-<character hex="B0" dec="176"><isoentity>mllhring</isoentity><desc>modifier letter left half ring</desc><unientity>02BF</unientity></character>
-<character hex="AE" dec="174"><isoentity>mlrhring</isoentity><desc>modifier letter right half ring</desc><unientity>02BE</unientity></character>
-<character hex="E2 4E" dec="226 078"><isoentity>Nacute</isoentity><desc>latin capital letter n with acute</desc><unientity>0143</unientity></character>
-<character hex="E2 6E" dec="226 110"><isoentity>nacute</isoentity><desc>latin small letter n with acute</desc><unientity>0144</unientity></character>
-<character hex="ED 6E" dec="237 110"><isoentity>napos</isoentity><desc>latin small letter n with apostrophe</desc><unientity>0149</unientity></character>
-<character hex="E9 4E" dec="233 078"><isoentity>Ncaron</isoentity><desc>latin capital letter n with caron</desc><unientity>0147</unientity></character>
-<character hex="E9 6E" dec="233 110"><isoentity>ncaron</isoentity><desc>latin small letter n with caron</desc><unientity>0148</unientity></character>
-<character hex="F0 4E" dec="240 078"><isoentity>Ncedil</isoentity><desc>latin capital letter n with cedilla</desc><unientity>0145</unientity></character>
-<character hex="F0 6E" dec="240 110"><isoentity>ncedil</isoentity><desc>latin small letter n with cedilla</desc><unientity>0146</unientity></character>
-<character hex="F2 4E" dec="242 078"><isoentity>Ndotb</isoentity><desc>latin capital letter n with dot below</desc><unientity>1E46</unientity></character>
-<character hex="F2 6E" dec="242 110"><isoentity>ndotb</isoentity><desc>latin small letter n with dot below</desc><unientity>1E47</unientity></character>
-<character hex="E7 4E" dec="231 078"><isoentity>Ndot</isoentity><desc>latin capital letter n with dot above</desc><unientity>1E44</unientity></character>
-<character hex="E7 6E" dec="231 110"><isoentity>ndot</isoentity><desc>latin small letter n with dot above</desc><unientity>1E45</unientity></character>
-<character hex="E1 4E" dec="225 078"><isoentity>Ngrave</isoentity><desc>latin capital letter n with grave</desc><unientity>01F8</unientity></character>
-<character hex="E1 6E" dec="225 110"><isoentity>ngrave</isoentity><desc>latin small letter n with grave</desc><unientity>01F9</unientity></character>
-<character hex="F6 4E" dec="246 078"><isoentity>Nmacrb</isoentity><desc>latin capital letter n with line below</desc><unientity>1E48</unientity></character>
-<character hex="F6 6E" dec="246 110"><isoentity>nmacrb</isoentity><desc>latin small letter n with line below</desc><unientity>1E49</unientity></character>
-<character hex="E4 4E" dec="228 078"><isoentity>Ntilde</isoentity><desc>latin capital letter n with tilde</desc><unientity>00D1</unientity></character>
-<character hex="E4 6E" dec="228 110"><isoentity>ntilde</isoentity><desc>latin small letter n with tilde</desc><unientity>00F1</unientity></character>
-<character hex="E2 4F" dec="226 079"><isoentity>Oacute</isoentity><desc>latin capital letter o with acute</desc><unientity>00D3</unientity></character>
-<character hex="E2 6F" dec="226 111"><isoentity>oacute</isoentity><desc>latin small letter o with acute</desc><unientity>00F3</unientity></character>
-<character hex="E6 4F" dec="230 079"><isoentity>Obreve</isoentity><desc>latin capital letter o with breve</desc><unientity>014E</unientity></character>
-<character hex="E6 6F" dec="230 111"><isoentity>obreve</isoentity><desc>latin small letter o with breve</desc><unientity>014F</unientity></character>
-<character hex="E9 4F" dec="233 079"><isoentity>Ocaron</isoentity><desc>latin capital letter o with caron</desc><unientity>01D1</unientity></character>
-<character hex="E9 6F" dec="233 111"><isoentity>ocaron</isoentity><desc>latin small letter o with caron</desc><unientity>01D2</unientity></character>
-<character hex="E3 E2 4F" dec="227 226 079"><isoentity>Ocircac</isoentity><desc>latin capital letter o with circumflex and acute</desc><unientity>1ED0</unientity></character>
-<character hex="E3 E2 6F" dec="227 226 111"><isoentity>ocircac</isoentity><desc>latin small letter o with circumflex and acute</desc><unientity>1ED1</unientity></character>
-<character hex="E3 F2 4F" dec="227 242 079"><isoentity>Ocircdb</isoentity><desc>latin capital letter o with circumflex and dot below</desc><unientity>1ED8</unientity></character>
-<character hex="E3 F2 6F" dec="227 242 111"><isoentity>ocircdb</isoentity><desc>latin small letter o with circumflex and dot below</desc><unientity>1ED9</unientity></character>
-<character hex="E1 E3 4F" dec="225 227 079"><isoentity>Ocircgr</isoentity><desc>latin capital letter o with circumflex and grave</desc><unientity>1ED2</unientity></character>
-<character hex="E1 E3 6F" dec="225 227 111"><isoentity>ocircgr</isoentity><desc>latin small letter o with circumflex and grave</desc><unientity>1ED3</unientity></character>
-<character hex="E3 E0 4F" dec="227 224 079"><isoentity>Ocircha</isoentity><desc>latin capital letter o with circumflex and hook above</desc><unientity>1ED4</unientity></character>
-<character hex="E3 E0 6F" dec="227 224 111"><isoentity>ocircha</isoentity><desc>latin small letter o with circumflex and hook above</desc><unientity>1ED5</unientity></character>
-<character hex="E4 E3 4F" dec="228 227 079"><isoentity>Ocircti</isoentity><desc>latin capital letter o with circumflex and tilde</desc><unientity>1ED6</unientity></character>
-<character hex="E4 E3 6F" dec="228 227 111"><isoentity>ocircti</isoentity><desc>latin small letter o with circumflex and tilde</desc><unientity>1ED7</unientity></character>
-<character hex="E3 4F" dec="227 079"><isoentity>Ocirc</isoentity><desc>latin capital letter o with circumflex</desc><unientity>00D4</unientity></character>
-<character hex="E3 6F" dec="227 111"><isoentity>ocirc</isoentity><desc>latin small letter o with circumflex</desc><unientity>00F4</unientity></character>
-<character hex="EE 4F" dec="238 079"><isoentity>Odblac</isoentity><desc>latin capital letter o with double acute</desc><unientity>0150</unientity></character>
-<character hex="EE 6F" dec="238 111"><isoentity>odblac</isoentity><desc>latin small letter o with double acute</desc><unientity>0151</unientity></character>
-<character hex="E5 E7 4F" dec="229 231 079"><isoentity>Odotama</isoentity><desc>latin capital letter o with dot above and macron</desc><unientity>0230</unientity></character>
-<character hex="E5 E7 6F" dec="229 231 111"><isoentity>odotama</isoentity><desc>latin small letter o with dot above and macron</desc><unientity>0231</unientity></character>
-<character hex="E7 4F" dec="231 079"><isoentity>Odota</isoentity><desc>latin capital letter o with dot above</desc><unientity>022E</unientity></character>
-<character hex="E7 6F" dec="231 111"><isoentity>odota</isoentity><desc>latin small letter o with dot above</desc><unientity>022F</unientity></character>
-<character hex="F2 4F" dec="242 079"><isoentity>Odotb</isoentity><desc>latin capital letter o with dot below</desc><unientity>1ECC</unientity></character>
-<character hex="F2 6F" dec="242 111"><isoentity>odotb</isoentity><desc>latin small letter o with dot below</desc><unientity>1ECD</unientity></character>
-<character hex="A6" dec="166"><isoentity>OElig</isoentity><desc>latin capital letter oe</desc><unientity>0152</unientity></character>
-<character hex="B6" dec="182"><isoentity>oelig</isoentity><desc>latin small letter oe</desc><unientity>0153</unientity></character>
-<character hex="F1" dec="241"><isoentity>ogon</isoentity><desc>combining ogonek</desc><unientity>0328</unientity></character>
-<character hex="E1 4F" dec="225 079"><isoentity>Ograve</isoentity><desc>latin capital letter o with grave</desc><unientity>00D2</unientity></character>
-<character hex="E1 6F" dec="225 111"><isoentity>ograve</isoentity><desc>latin small letter o with grave</desc><unientity>00F2</unientity></character>
-<character hex="E0 4F" dec="224 079"><isoentity>Ohooka</isoentity><desc>latin capital letter o with hook above</desc><unientity>1ECE</unientity></character>
-<character hex="E0 6F" dec="224 111"><isoentity>ohooka</isoentity><desc>latin small letter o with hook above</desc><unientity>1ECF</unientity></character>
-<character hex="E2 AC" dec="226 172"><isoentity>Ohornac</isoentity><desc>latin capital letter o with horn and acute</desc><unientity>1EDA</unientity></character>
-<character hex="E2 AD" dec="226 173"><isoentity>Ohornac</isoentity><desc>latin capital letter u with horn and acute</desc><unientity>1EE8</unientity></character>
-<character hex="E2 BC" dec="226 188"><isoentity>ohornac</isoentity><desc>latin small letter o with horn and acute</desc><unientity>1EDB</unientity></character>
-<character hex="F2 AC" dec="242 172"><isoentity>Ohorndb</isoentity><desc>latin capital letter o with horn and dot below</desc><unientity>1EE2</unientity></character>
-<character hex="F2 BC" dec="242 188"><isoentity>ohorndb</isoentity><desc>latin small letter o with horn and dot below</desc><unientity>1EE3</unientity></character>
-<character hex="E1 AC" dec="225 172"><isoentity>Ohorngr</isoentity><desc>latin capital letter o with horn and grave</desc><unientity>1EDC</unientity></character>
-<character hex="E1 BC" dec="225 188"><isoentity>ohorngr</isoentity><desc>latin small letter o with horn and grave</desc><unientity>1EDD</unientity></character>
-<character hex="E0 AC" dec="224 172"><isoentity>Ohornha</isoentity><desc>latin capital letter o with horn and hook above</desc><unientity>1EDE</unientity></character>
-<character hex="E0 BC" dec="224 188"><isoentity>ohornha</isoentity><desc>latin small letter o with horn and hook above</desc><unientity>1EDF</unientity></character>
-<character hex="E4 AC" dec="228 172"><isoentity>Ohornti</isoentity><desc>latin capital letter o with horn and tilde</desc><unientity>1EE0</unientity></character>
-<character hex="E4 BC" dec="228 188"><isoentity>ohornti</isoentity><desc>latin small letter o with horn and tilde</desc><unientity>1EE1</unientity></character>
-<character hex="AC" dec="172"><isoentity>Ohorn</isoentity><desc>latin capital letter o with horn</desc><unientity>01A0</unientity></character>
-<character hex="BC" dec="188"><isoentity>ohorn</isoentity><desc>latin small letter o with horn</desc><unientity>01A1</unientity></character>
-<character hex="E2 E5 4F" dec="226 229 079"><isoentity>Omacrac</isoentity><desc>latin capital letter o with macron and acute</desc><unientity>1E52</unientity></character>
-<character hex="E2 E5 6F" dec="226 229 111"><isoentity>omacrac</isoentity><desc>latin small letter o with macron and acute</desc><unientity>1E53</unientity></character>
-<character hex="E1 E5 4F" dec="225 229 079"><isoentity>Omacrgr</isoentity><desc>latin capital letter o with macron and grave</desc><unientity>1E50</unientity></character>
-<character hex="E1 E5 6F" dec="225 229 111"><isoentity>omacrgr</isoentity><desc>latin small letter o with macron and grave</desc><unientity>1E51</unientity></character>
-<character hex="E5 4F" dec="229 079"><isoentity>Omacr</isoentity><desc>latin capital letter o with macron</desc><unientity>014C</unientity></character>
-<character hex="E5 6F" dec="229 111"><isoentity>omacr</isoentity><desc>latin small letter o with macron</desc><unientity>014D</unientity></character>
-<character hex="E5 F1 4F" dec="229 241 079"><isoentity>Oogonma</isoentity><desc>latin capital letter o with ogonek and macron</desc><unientity>01EC</unientity></character>
-<character hex="E5 F1 6F" dec="229 241 111"><isoentity>oogonma</isoentity><desc>latin small letter o with ogonek and macron</desc><unientity>01ED</unientity></character>
-<character hex="F1 4F" dec="241 111"><isoentity>Oogon</isoentity><desc>latin capital letter o with ogonek</desc><unientity>01EA</unientity></character>
-<character hex="F1 6F" dec="241 111"><isoentity>oogon</isoentity><desc>latin small letter o with ogonek</desc><unientity>01EB</unientity></character>
-<character hex="E2 A2" dec="226 162"><isoentity>Oslasha</isoentity><desc>latin capital letter o with stroke and acute</desc><unientity>01FE</unientity></character>
-<character hex="E2 B2" dec="226 178"><isoentity>oslasha</isoentity><desc>latin small letter o with stroke and acute</desc><unientity>01FF</unientity></character>
-<character hex="A2" dec="162"><isoentity>Oslash</isoentity><desc>latin capital letter o with stroke</desc><unientity>00D8</unientity></character>
-<character hex="B2" dec="178"><isoentity>oslash</isoentity><desc>latin small letter o with stroke</desc><unientity>00F8</unientity></character>
-<character hex="E2 E4 4F" dec="226 228 079"><isoentity>Otildeac</isoentity><desc>latin capital letter o with tilde and acute</desc><unientity>1E4C</unientity></character>
-<character hex="E2 E4 6F" dec="226 228 111"><isoentity>otildeac</isoentity><desc>latin small letter o with tilde and acute</desc><unientity>1E4D</unientity></character>
-<character hex="E5 E4 4F" dec="229 228 079"><isoentity>Otildema</isoentity><desc>latin capital letter o with tilde and macron</desc><unientity>022C</unientity></character>
-<character hex="E5 E4 6F" dec="229 228 111"><isoentity>otildema</isoentity><desc>latin small letter o with tilde and macron</desc><unientity>022D</unientity></character>
-<character hex="E8 E4 4F" dec="232 228 079"><isoentity>Otildeum</isoentity><desc>latin capital letter o with tilde and diaeresis</desc><unientity>1E4E</unientity></character>
-<character hex="E8 E4 6F" dec="232 228 111"><isoentity>otildeum</isoentity><desc>latin small letter o with tilde and diaeresis</desc><unientity>1E4F</unientity></character>
-<character hex="E4 4F" dec="228 079"><isoentity>Otilde</isoentity><desc>latin capital letter o with tilde</desc><unientity>00D5</unientity></character>
-<character hex="E4 6F" dec="228 111"><isoentity>otilde</isoentity><desc>latin small letter o with tilde</desc><unientity>00F5</unientity></character>
-<character hex="E5 E8 4F" dec="229 232 079"><isoentity>Oumlma</isoentity><desc>latin capital letter o with diaeresis and macron</desc><unientity>022A</unientity></character>
-<character hex="E5 E8 6F" dec="229 232 111"><isoentity>oumlma</isoentity><desc>latin small letter o with diaeresis and macron</desc><unientity>022B</unientity></character>
-<character hex="E8 4F" dec="232 079"><isoentity>Ouml</isoentity><desc>latin capital letter o with umlaut</desc><unientity>00D6</unientity></character>
-<character hex="E8 6F" dec="232 111"><isoentity>ouml</isoentity><desc>latin small letter o with umlaut</desc><unientity>00F6</unientity></character>
-<character hex="E2 50" dec="226 080"><isoentity>Pacute</isoentity><desc>latin capital letter p with acute</desc><unientity>1E54</unientity></character>
-<character hex="E2 70" dec="226 112"><isoentity>pacute</isoentity><desc>latin small letter p with acute</desc><unientity>1E55</unientity></character>
-<character hex="E7 50" dec="231 080"><isoentity>Pdota</isoentity><desc>latin capital letter p with dot above</desc><unientity>1E56</unientity></character>
-<character hex="E7 70" dec="231 112"><isoentity>pdota</isoentity><desc>latin small letter p with dot above</desc><unientity>1E57</unientity></character>
-<character hex="AB" dec="171"><isoentity>plusmn</isoentity><desc>plus-minus sign</desc><unientity>00B1</unientity></character>
-<character hex="B9" dec="185"><isoentity>pound</isoentity><desc>pound sign</desc><unientity>00A3</unientity></character>
-<character hex="E2 52" dec="226 082"><isoentity>Racute</isoentity><desc>latin capital letter r with acute</desc><unientity>0154</unientity></character>
-<character hex="E2 72" dec="226 114"><isoentity>racute</isoentity><desc>latin small letter r with acute</desc><unientity>0155</unientity></character>
-<character hex="E9 52" dec="233 082"><isoentity>Rcaron</isoentity><desc>latin capital letter r with caron</desc><unientity>0158</unientity></character>
-<character hex="E9 72" dec="233 114"><isoentity>rcaron</isoentity><desc>latin small letter r with caron</desc><unientity>0159</unientity></character>
-<character hex="F8" dec="248"><isoentity>rcedil</isoentity><desc>combining left half ring below</desc><unientity>031C</unientity></character>
-<character hex="F8 52" dec="240 082"><isoentity>Rcedil</isoentity><desc>latin capital letter r with cedilla</desc><unientity>0156</unientity></character>
-<character hex="F0 72" dec="240 114"><isoentity>rcedil</isoentity><desc>latin small letter r with cedilla</desc><unientity>0157</unientity></character>
-<character hex="ED" dec="237"><isoentity>rcommaa</isoentity><desc>combining comma above right</desc><unientity>0315</unientity></character>
-<character hex="FB" dec="251"><isoentity>rdbltil</isoentity><desc>combining double tilde right half</desc><unientity>FE23</unientity></character>
-<character hex="E7 52" dec="231 082"><isoentity>Rdota</isoentity><desc>latin capital letter r with dot above</desc><unientity>1E58</unientity></character>
-<character hex="E7 72" dec="231 114"><isoentity>rdota</isoentity><desc>latin small letter r with dot above</desc><unientity>1E59</unientity></character>
-<character hex="F2 52" dec="242 082"><isoentity>Rdotb</isoentity><desc>latin capital letter r with dot below</desc><unientity>1E5A</unientity></character>
-<character hex="F2 72" dec="242 114"><isoentity>rdotb</isoentity><desc>latin small letter r with dot below</desc><unientity>1E5B</unientity></character>
-<character hex="AA" dec="170"><isoentity>reg</isoentity><desc>registered sign</desc><unientity>00AE</unientity></character>
-<character hex="F4" dec="244"><isoentity>ringb</isoentity><desc>combining ring below</desc><unientity>0325</unientity></character>
-<character hex="EA" dec="234"><isoentity>ring</isoentity><desc>combining ring above</desc><unientity>030A</unientity></character>
-<character hex="EC" dec="236"><isoentity>rlig</isoentity><desc>combining ligature right half</desc><unientity>FE21</unientity></character>
-<character hex="F6 52" dec="246 082"><isoentity>Rmacrb</isoentity><desc>latin capital letter r with line below</desc><unientity>1E5E</unientity></character>
-<character hex="F6 72" dec="246 114"><isoentity>rmacrb</isoentity><desc>latin small letter r with line below</desc><unientity>1E5F</unientity></character>
-<character hex="E7 E2 53" dec="231 226 083"><isoentity>Sacuteda</isoentity><desc>latin capital letter s with acute and dot above</desc><unientity>1E64</unientity></character>
-<character hex="E7 E2 73" dec="231 226 115"><isoentity>sacuteda</isoentity><desc>latin small letter s with acute and dot above</desc><unientity>1E65</unientity></character>
-<character hex="E2 53" dec="226 083"><isoentity>Sacute</isoentity><desc>latin capital letter s with acute</desc><unientity>015A</unientity></character>
-<character hex="E2 73" dec="226 115"><isoentity>sacute</isoentity><desc>latin small letter s with acute</desc><unientity>015B</unientity></character>
-<character hex="E7 E9 53" dec="231 233 083"><isoentity>Scaronda</isoentity><desc>latin capital letter s with caron and dot above</desc><unientity>1E66</unientity></character>
-<character hex="E7 E9 73" dec="231 233 115"><isoentity>scaronda</isoentity><desc>latin small letter s with caron and dot above</desc><unientity>1E67</unientity></character>
-<character hex="E9 53" dec="233 083"><isoentity>Scaron</isoentity><desc>latin capital letter s with caron</desc><unientity>0160</unientity></character>
-<character hex="E9 73" dec="233 115"><isoentity>scaron</isoentity><desc>latin small letter s with caron</desc><unientity>0161</unientity></character>
-<character hex="F0 53" dec="240 083"><isoentity>Scedil</isoentity><desc>latin capital letter s with cedil</desc><unientity>015E</unientity></character>
-<character hex="F0 73" dec="240 115"><isoentity>scedil</isoentity><desc>latin small letter s with cedil</desc><unientity>015F</unientity></character>
-<character hex="E3 53" dec="227 083"><isoentity>Scirc</isoentity><desc>latin capital letter s with circumflex</desc><unientity>015C</unientity></character>
-<character hex="E3 73" dec="227 115"><isoentity>scirc</isoentity><desc>latin small letter s with circumflex</desc><unientity>015D</unientity></character>
-<character hex="F7 53" dec="247 083"><isoentity>scommab</isoentity><desc>latin capital letter s with comma below</desc><unientity>0218</unientity></character>
-<character hex="F7 73" dec="247 115"><isoentity>scommab</isoentity><desc>latin small letter s with comma below</desc><unientity>0219</unientity></character>
-<character hex="C1" dec="193"><isoentity>scriptl</isoentity><desc>script small l</desc><unientity>2113</unientity></character>
-<character hex="E7 53" dec="231 083"><isoentity>Sdota</isoentity><desc>latin capital letter s with dot above</desc><unientity>1E60</unientity></character>
-<character hex="E7 73" dec="231 115"><isoentity>sdota</isoentity><desc>latin small letter s with dot above</desc><unientity>1E61</unientity></character>
-<character hex="E7 F2 53" dec="231 242 083"><isoentity>Sdotbda</isoentity><desc>latin capital letter s with dot below and dot above</desc><unientity>1E68</unientity></character>
-<character hex="E7 F2 73" dec="231 242 115"><isoentity>sdotbda</isoentity><desc>latin small letter s with dot below and dot above</desc><unientity>1E69</unientity></character>
-<character hex="F2 53" dec="242 083"><isoentity>Sdotb</isoentity><desc>latin capital letter s with dot below</desc><unientity>1E62</unientity></character>
-<character hex="F2 73" dec="242 115"><isoentity>sdotb</isoentity><desc>latin small letter s with dot below</desc><unientity>1E63</unientity></character>
-<character hex="C4" dec="196"><isoentity>sharp</isoentity><desc>sharp</desc><unientity>266F</unientity></character>
-<character hex="A7" dec="167"><isoentity>softsign</isoentity><desc>modifier letter prime</desc><unientity>02B9</unientity></character>
-<character hex="1B 62 30 1B 73" dec="027 098 048 027 115"><isoentity>sub0</isoentity><desc>subscript zero</desc><unientity>2080</unientity></character>
-<character hex="1B 62 31 1B 73" dec="027 098 049 027 115"><isoentity>sub1</isoentity><desc>subscript one</desc><unientity>2081</unientity></character>
-<character hex="1B 62 32 1B 73" dec="027 098 050 027 115"><isoentity>sub2</isoentity><desc>subscript two</desc><unientity>2082</unientity></character>
-<character hex="1B 62 33 1B 73" dec="027 098 051 027 115"><isoentity>sub3</isoentity><desc>subscript three</desc><unientity>2083</unientity></character>
-<character hex="1B 62 34 1B 73" dec="027 098 052 027 115"><isoentity>sub4</isoentity><desc>subscript four</desc><unientity>2084</unientity></character>
-<character hex="1B 62 35 1B 73" dec="027 098 053 027 115"><isoentity>sub5</isoentity><desc>subscript five</desc><unientity>2085</unientity></character>
-<character hex="1B 62 36 1B 73" dec="027 098 054 027 115"><isoentity>sub6</isoentity><desc>subscript six</desc><unientity>2086</unientity></character>
-<character hex="1B 62 37 1B 73" dec="027 098 055 027 115"><isoentity>sub7</isoentity><desc>subscript seven</desc><unientity>2087</unientity></character>
-<character hex="1B 62 38 1B 73" dec="027 098 056 027 115"><isoentity>sub8</isoentity><desc>subscript eight</desc><unientity>2088</unientity></character>
-<character hex="1B 62 39 1B 73" dec="027 098 057 027 115"><isoentity>sub9</isoentity><desc>subscript nine</desc><unientity>2089</unientity></character>
-<character hex="1B 62 28 1B 73" dec="027 098 040 027 115"><isoentity>sublpar</isoentity><desc>subscript left parenthesis</desc><unientity>208D</unientity></character>
-<character hex="1B 62 2D 1B 73" dec="027 098 045 027 115"><isoentity>subminus</isoentity><desc>subscript minus</desc><unientity>208B</unientity></character>
-<character hex="1B 62 2B 1B 73" dec="027 098 043 027 115"><isoentity>subplus</isoentity><desc>subscript plus sign</desc><unientity>208A</unientity></character>
-<character hex="1B 62 29 1B 73" dec="027 098 041 027 115"><isoentity>subrpar</isoentity><desc>subscript right parenthesis</desc><unientity>208E</unientity></character>
-<character hex="1B 70 30 1B 73" dec="027 112 048 027 115"><isoentity>sup0</isoentity><desc>superscript zero</desc><unientity>2070</unientity></character>
-<character hex="1B 70 31 1B 73" dec="027 112 049 027 115"><isoentity>sup1</isoentity><desc>superscript one</desc><unientity>00B9</unientity></character>
-<character hex="1B 70 32 1B 73" dec="027 112 050 027 115"><isoentity>sup2</isoentity><desc>superscript two</desc><unientity>00B2</unientity></character>
-<character hex="1B 70 33 1B 73" dec="027 112 051 027 115"><isoentity>sup3</isoentity><desc>superscript three</desc><unientity>00B3</unientity></character>
-<character hex="1B 70 34 1B 73" dec="027 112 052 027 115"><isoentity>sup4</isoentity><desc>superscript four</desc><unientity>2074</unientity></character>
-<character hex="1B 70 35 1B 73" dec="027 112 053 027 115"><isoentity>sup5</isoentity><desc>superscript five</desc><unientity>2075</unientity></character>
-<character hex="1B 70 36 1B 73" dec="027 112 054 027 115"><isoentity>sup6</isoentity><desc>superscript six</desc><unientity>2076</unientity></character>
-<character hex="1B 70 37 1B 73" dec="027 112 055 027 115"><isoentity>sup7</isoentity><desc>superscript seven</desc><unientity>2077</unientity></character>
-<character hex="1B 70 38 1B 73" dec="027 112 056 027 115"><isoentity>sup8</isoentity><desc>superscript eight</desc><unientity>2078</unientity></character>
-<character hex="1B 70 39 1B 73" dec="027 112 056 027 115"><isoentity>sup9</isoentity><desc>superscript nine</desc><unientity>2079</unientity></character>
-<character hex="1B 70 28 1B 73" dec="027 112 040 027 115"><isoentity>suplpar</isoentity><desc>superscript left parenthesis</desc><unientity>207D</unientity></character>
-<character hex="1B 70 2D 1B 73" dec="027 112 045 027 115"><isoentity>supminus</isoentity><desc>superscript minus</desc><unientity>207B</unientity></character>
-<character hex="1B 70 2B 1B 73" dec="027 112 043 027 115"><isoentity>supplus</isoentity><desc>superscript plus sign</desc><unientity>207A</unientity></character>
-<character hex="1B 70 29 1B 73" dec="027 112 041 027 115"><isoentity>suprpar</isoentity><desc>superscript right parenthesis</desc><unientity>207E</unientity></character>
-<character hex="E9 54" dec="233 084"><isoentity>Tcaron</isoentity><desc>latin capital letter t with caron</desc><unientity>0164</unientity></character>
-<character hex="E9 74" dec="233 116"><isoentity>tcaron</isoentity><desc>latin small letter t with caron</desc><unientity>0165</unientity></character>
-<character hex="F0 54" dec="240 084"><isoentity>Tcedil</isoentity><desc>latin capital letter t with cedilla</desc><unientity>0162</unientity></character>
-<character hex="F0 74" dec="240 116"><isoentity>tcedil</isoentity><desc>latin small letter t with cedilla</desc><unientity>0163</unientity></character>
-<character hex="E4 E3 65" dec="228 227 101"><isoentity>tcircti</isoentity><desc>latin small letter e with circumflex and tilde</desc><unientity>1EC5</unientity></character>
-<character hex="F7 54" dec="247 084"><isoentity>Tcommab</isoentity><desc>latin capital letter t with comma below</desc><unientity>021A</unientity></character>
-<character hex="F7 74" dec="247 116"><isoentity>tcommab</isoentity><desc>latin small letter t with comma below</desc><unientity>021B</unientity></character>
-<character hex="F2 54" dec="242 084"><isoentity>Tdotb</isoentity><desc>latin capital letter t with dot below</desc><unientity>1E6C</unientity></character>
-<character hex="F2 74" dec="242 116"><isoentity>tdotb</isoentity><desc>latin small letter t with dot below</desc><unientity>1E6D</unientity></character>
-<character hex="E7 54" dec="231 084"><isoentity>Tdot</isoentity><desc>latin capital letter t with dot above</desc><unientity>1E6A</unientity></character>
-<character hex="E7 74" dec="231 116"><isoentity>tdot</isoentity><desc>latin small letter t with dot above</desc><unientity>1E6B</unientity></character>
-<character hex="A4" dec="164"><isoentity>THORN</isoentity><desc>latin capital letter thorn</desc><unientity>00DE</unientity></character>
-<character hex="B4" dec="180"><isoentity>thorn</isoentity><desc>latin small letter thorn</desc><unientity>00FE</unientity></character>
-<character hex="E4" dec="228"><isoentity>tilde</isoentity><desc>combining tilde</desc><unientity>0303</unientity></character>
-<character hex="F6 54" dec="246 084"><isoentity>Tmacrb</isoentity><desc>latin capital letter t with line below</desc><unientity>1E6E</unientity></character>
-<character hex="F6 74" dec="246 116"><isoentity>tmacrb</isoentity><desc>latin small letter t with line below</desc><unientity>1E6F</unientity></character>
-<character hex="E8 74" dec="232 116"><isoentity>tuml</isoentity><desc>latin small letter t with diaeresis</desc><unientity>1E97</unientity></character>
-<character hex="E2 55" dec="226 085"><isoentity>Uacute</isoentity><desc>latin capital letter u with acute</desc><unientity>00DA</unientity></character>
-<character hex="E2 75" dec="226 117"><isoentity>uacute</isoentity><desc>latin small letter u with acute</desc><unientity>00FA</unientity></character>
-<character hex="E6 55" dec="230 085"><isoentity>Ubreve</isoentity><desc>latin capital letter u with breve</desc><unientity>016C</unientity></character>
-<character hex="E6 75" dec="230 117"><isoentity>ubreve</isoentity><desc>latin small letter u with breve</desc><unientity>016D</unientity></character>
-<character hex="E9 55" dec="233 085"><isoentity>ucaron</isoentity><desc>latin capital letter u with caron</desc><unientity>01D3</unientity></character>
-<character hex="E9 75" dec="233 117"><isoentity>ucaron</isoentity><desc>latin small letter u with caron</desc><unientity>01D4</unientity></character>
-<character hex="E3 55" dec="227 085"><isoentity>Ucirc</isoentity><desc>latin capital letter u with circumflex</desc><unientity>00DB</unientity></character>
-<character hex="E3 75" dec="227 117"><isoentity>ucirc</isoentity><desc>latin small letter u with circumflex</desc><unientity>00FB</unientity></character>
-<character hex="EE 55" dec="238 085"><isoentity>Udblac</isoentity><desc>latin capital letter u with double acute</desc><unientity>0170</unientity></character>
-<character hex="EE 75" dec="238 117"><isoentity>udblac</isoentity><desc>latin small letter u with double acute</desc><unientity>0171</unientity></character>
-<character hex="F3 75" dec="243 117"><isoentity>udbldb</isoentity><desc>latin small letter u with double dot below</desc><unientity>1E73</unientity></character>
-<character hex="F3 55" dec="243 084"><isoentity>Udlbdb</isoentity><desc>latin capital letter u with double dot below</desc><unientity>1E72</unientity></character>
-<character hex="F2 55" dec="242 085"><isoentity>Udotb</isoentity><desc>latin capital letter u with dot below</desc><unientity>1EE4</unientity></character>
-<character hex="F2 75" dec="242 117"><isoentity>udotb</isoentity><desc>latin small letter u with dot below</desc><unientity>1EE5</unientity></character>
-<character hex="E1 55" dec="225 085"><isoentity>Ugrave</isoentity><desc>latin capital letter u with grave</desc><unientity>00D9</unientity></character>
-<character hex="E1 75" dec="225 117"><isoentity>ugrave</isoentity><desc>latin small letter u with grave</desc><unientity>00F9</unientity></character>
-<character hex="E0 55" dec="224 085"><isoentity>uhooka</isoentity><desc>latin capital letter u with hook above</desc><unientity>1EE6</unientity></character>
-<character hex="E0 75" dec="224 117"><isoentity>uhooka</isoentity><desc>latin small letter u with hook above</desc><unientity>1EE7</unientity></character>
-<character hex="E2 BD" dec="226 189"><isoentity>uhornac</isoentity><desc>latin small letter u with horn and acute</desc><unientity>1EE9</unientity></character>
-<character hex="F2 AD" dec="242 173"><isoentity>Uhorndb</isoentity><desc>latin capital letter u with horn and dot below</desc><unientity>1EF0</unientity></character>
-<character hex="F2 BD" dec="242 189"><isoentity>uhorndb</isoentity><desc>latin small letter u with horn and dot below</desc><unientity>1EF1</unientity></character>
-<character hex="E1 AD" dec="225 173"><isoentity>Uhorngr</isoentity><desc>latin capital letter u with horn and grave</desc><unientity>1EEA</unientity></character>
-<character hex="E1 BD" dec="225 189"><isoentity>uhorngr</isoentity><desc>latin small letter u with horn and grave</desc><unientity>1EEB</unientity></character>
-<character hex="E0 AD" dec="224 173"><isoentity>Uhornha</isoentity><desc>latin capital letter u with horn and hook above</desc><unientity>1EEC</unientity></character>
-<character hex="E0 BD" dec="224 189"><isoentity>uhornha</isoentity><desc>latin small letter u with horn and hook above</desc><unientity>1EED</unientity></character>
-<character hex="E4 AD" dec="228 173"><isoentity>Uhornti</isoentity><desc>latin capital letter u with horn and tilde</desc><unientity>1EEE</unientity></character>
-<character hex="E4 BD" dec="228 189"><isoentity>uhornti</isoentity><desc>latin small letter u with horn and tilde</desc><unientity>1EEF</unientity></character>
-<character hex="AD" dec="173"><isoentity>Uhorn</isoentity><desc>latin capital letter u with horn</desc><unientity>01AF</unientity></character>
-<character hex="BD" dec="189"><isoentity>uhorn</isoentity><desc>latin small letter u with horn</desc><unientity>01B0</unientity></character>
-<character hex="E8 E5 55" dec="232 229 085"><isoentity>Umacrum</isoentity><desc>latin capital letter u with macron and diaeresis</desc><unientity>1E7A</unientity></character>
-<character hex="E8 E5 75" dec="232 229 117"><isoentity>umacrum</isoentity><desc>latin small letter u with macron and diaeresis</desc><unientity>1E7B</unientity></character>
-<character hex="E5 55" dec="229 085"><isoentity>Umacr</isoentity><desc>latin capital letter u with macron</desc><unientity>016A</unientity></character>
-<character hex="E5 75" dec="229 117"><isoentity>umacr</isoentity><desc>latin small letter u with macron</desc><unientity>016B</unientity></character>
-<character hex="E8" dec="232"><isoentity>uml</isoentity><desc>combining diaeresis</desc><unientity>0308</unientity></character>
-<character hex="F6" dec="246"><isoentity>under</isoentity><desc>combining low line</desc><unientity>0332</unientity></character>
-<character hex="F1 55" dec="241 085"><isoentity>Uogon</isoentity><desc>latin capital letter u with ogon</desc><unientity>0172</unientity></character>
-<character hex="F1 75" dec="241 117"><isoentity>uogon</isoentity><desc>latin small letter u with ogon</desc><unientity>0173</unientity></character>
-<character hex="EA 55" dec="234 085"><isoentity>Uring</isoentity><desc>latin capital letter u with ring</desc><unientity>016E</unientity></character>
-<character hex="EA 75" dec="234 117"><isoentity>uring</isoentity><desc>latin small letter u with ring</desc><unientity>016F</unientity></character>
-<character hex="E2 E4 55" dec="226 228 085"><isoentity>utildeac</isoentity><desc>latin capital letter u with tilde and acute</desc><unientity>1E78</unientity></character>
-<character hex="E2 E4 75" dec="226 228 117"><isoentity>utildeac</isoentity><desc>latin small letter u with tilde and acute</desc><unientity>1E79</unientity></character>
-<character hex="E4 55" dec="228 085"><isoentity>Utilde</isoentity><desc>latin capital letter u with tilde</desc><unientity>0168</unientity></character>
-<character hex="E4 75" dec="228 117"><isoentity>utilde</isoentity><desc>latin small letter u with tilde</desc><unientity>0169</unientity></character>
-<character hex="E2 E8 55" dec="226 232 085"><isoentity>Uumlac</isoentity><desc>latin capital letter u with diaeresis and acute</desc><unientity>01D7</unientity></character>
-<character hex="E2 E8 75" dec="226 232 117"><isoentity>uumlac</isoentity><desc>latin small letter u with diaeresis and acute</desc><unientity>01D8</unientity></character>
-<character hex="E9 E8 55" dec="233 232 085"><isoentity>Uumlca</isoentity><desc>latin capital letter u with diaeresis and caron</desc><unientity>01D9</unientity></character>
-<character hex="E9 E8 75" dec="233 232 117"><isoentity>uumlca</isoentity><desc>latin small letter u with diaresis and caron</desc><unientity>01DA</unientity></character>
-<character hex="E1 E8 55" dec="225 230 085"><isoentity>Uumlgr</isoentity><desc>latin capital letter u with diaeresis and grave</desc><unientity>01DB</unientity></character>
-<character hex="E1 E8 75" dec="225 230 117"><isoentity>uumlgr</isoentity><desc>latin small letter u with diaeresis and grave</desc><unientity>01DC</unientity></character>
-<character hex="E5 E8 55" dec="229 232 085"><isoentity>Uumlma</isoentity><desc>latin capital letter u with diaeresis and macron</desc><unientity>01D5</unientity></character>
-<character hex="E5 E8 75" dec="229 232 117"><isoentity>uumlma</isoentity><desc>latin small letter u with diaeresis and macron</desc><unientity>01D6</unientity></character>
-<character hex="E8 55" dec="232 085"><isoentity>Uuml</isoentity><desc>latin capital letter u with umlaut</desc><unientity>00DC</unientity></character>
-<character hex="E8 75" dec="232 117"><isoentity>uuml</isoentity><desc>latin small letter u with umlaut</desc><unientity>00FC</unientity></character>
-<character hex="F2 56" dec="242 086"><isoentity>Vdotb</isoentity><desc>latin capital letter v with dot below</desc><unientity>1E7E</unientity></character>
-<character hex="F2 76" dec="242 118"><isoentity>vdotb</isoentity><desc>latin small letter v with dot below</desc><unientity>1E7F</unientity></character>
-<character hex="E4 56" dec="228 086"><isoentity>Vtilde</isoentity><desc>latin capital letter v with tilde</desc><unientity>1E7C</unientity></character>
-<character hex="E4 76" dec="228 118"><isoentity>vtilde</isoentity><desc>latin small letter v with tilde</desc><unientity>1E7D</unientity></character>
-<character hex="E2 57" dec="226 087"><isoentity>Wacute</isoentity><desc>latin capital letter w with acute</desc><unientity>1E82</unientity></character>
-<character hex="E2 77" dec="226 119"><isoentity>wacute</isoentity><desc>latin small letter w with acute</desc><unientity>1E83</unientity></character>
-<character hex="E3 57" dec="227 087"><isoentity>Wcirc</isoentity><desc>latin capital letter w with circumflex</desc><unientity>0174</unientity></character>
-<character hex="E3 77" dec="227 119"><isoentity>wcirc</isoentity><desc>latin small letter w with circumflex</desc><unientity>0175</unientity></character>
-<character hex="F2 57" dec="242 087"><isoentity>wdotb</isoentity><desc>latin capital letter w with dot below</desc><unientity>1E88</unientity></character>
-<character hex="F2 77" dec="242 119"><isoentity>wdotb</isoentity><desc>latin small letter w with dot below</desc><unientity>1E89</unientity></character>
-<character hex="E7 57" dec="231 087"><isoentity>Wdot</isoentity><desc>latin capital letter w with dot above</desc><unientity>1E86</unientity></character>
-<character hex="E7 77" dec="231 119"><isoentity>wdot</isoentity><desc>latin small letter w with dot above</desc><unientity>1E87</unientity></character>
-<character hex="E1 57" dec="225 087"><isoentity>Wgrave</isoentity><desc>latin capital letter w with grave</desc><unientity>1E80</unientity></character>
-<character hex="E1 77" dec="225 119"><isoentity>wgrave</isoentity><desc>latin small letter w with grave</desc><unientity>1E81</unientity></character>
-<character hex="EA 77" dec="234 119"><isoentity>wring</isoentity><desc>latin small letter w with ring</desc><unientity>1E98</unientity></character>
-<character hex="E8 57" dec="232 087"><isoentity>Wuml</isoentity><desc>latin capital letter w with diaeresis</desc><unientity>1E84</unientity></character>
-<character hex="E8 77" dec="232 119"><isoentity>wuml</isoentity><desc>latin small letter w with diaeresis</desc><unientity>1E85</unientity></character>
-<character hex="E7 58" dec="231 088"><isoentity>Xdot</isoentity><desc>latin capital letter x with dot</desc><unientity>1E8A</unientity></character>
-<character hex="E7 78" dec="231 120"><isoentity>xdot</isoentity><desc>latin small letter x with dot</desc><unientity>1E8B</unientity></character>
-<character hex="E8 58" dec="232 088"><isoentity>Xuml</isoentity><desc>latin capital letter x with diaeresis</desc><unientity>1E8C</unientity></character>
-<character hex="E8 78" dec="232 120"><isoentity>xuml</isoentity><desc>latin small letter x with diaeresis</desc><unientity>1E8D</unientity></character>
-<character hex="E2 59" dec="226 089"><isoentity>Yacute</isoentity><desc>latin capital letter y with acute</desc><unientity>00DD</unientity></character>
-<character hex="E2 79" dec="226 121"><isoentity>yacute</isoentity><desc>latin small letter y with acute</desc><unientity>00FD</unientity></character>
-<character hex="E3 59" dec="227 089"><isoentity>Ycirc</isoentity><desc>latin capital letter y with circumflex</desc><unientity>0176</unientity></character>
-<character hex="E3 79" dec="227 121"><isoentity>ycirc</isoentity><desc>latin small letter y with circumflex</desc><unientity>0177</unientity></character>
-<character hex="F2 59" dec="242 089"><isoentity>Ydotb</isoentity><desc>latin capital letter y with dot below</desc><unientity>1EF4</unientity></character>
-<character hex="F2 79" dec="242 121"><isoentity>ydotb</isoentity><desc>latin small letter y with dot below</desc><unientity>1EF5</unientity></character>
-<character hex="E7 59" dec="231 089"><isoentity>Ydot</isoentity><desc>latin capital letter y with dot</desc><unientity>1E8E</unientity></character>
-<character hex="E7 79" dec="231 121"><isoentity>ydot</isoentity><desc>latin small letter y with dot</desc><unientity>1E8F</unientity></character>
-<character hex="E1 59" dec="225 089"><isoentity>Ygrave</isoentity><desc>latin capital letter y with grave</desc><unientity>1EF2</unientity></character>
-<character hex="E1 79" dec="225 121"><isoentity>ygrave</isoentity><desc>latin small letter y with grave</desc><unientity>1EF3</unientity></character>
-<character hex="E0 59" dec="224 089"><isoentity>Yhooka</isoentity><desc>latin capital letter y with hook above</desc><unientity>1EF6</unientity></character>
-<character hex="E0 79" dec="224 121"><isoentity>yhooka</isoentity><desc>latin small letter y with hook above</desc><unientity>1EF7</unientity></character>
-<character hex="E5 59" dec="229 089"><isoentity>Ymacr</isoentity><desc>latin capital letter y with macron</desc><unientity>0232</unientity></character>
-<character hex="E5 79" dec="229 121"><isoentity>ymacr</isoentity><desc>latin small letter y with macron</desc><unientity>0233</unientity></character>
-<character hex="EA 79" dec="234 121"><isoentity>yring</isoentity><desc>latin small letter y with ring</desc><unientity>1E99</unientity></character>
-<character hex="E4 59" dec="228 089"><isoentity>Ytilde</isoentity><desc>latin capital letter y with tilde</desc><unientity>1EF8</unientity></character>
-<character hex="E4 79" dec="228 121"><isoentity>ytilde</isoentity><desc>latin small letter y with tilde</desc><unientity>1EF9</unientity></character>
-<character hex="E8 59" dec="232 089"><isoentity>Yuml</isoentity><desc>latin capital letter y with umlaut</desc><unientity>0178</unientity></character>
-<character hex="E8 79" dec="232 121"><isoentity>yuml</isoentity><desc>latin small letter y with umlaut</desc><unientity>00FF</unientity></character>
-<character hex="E2 5A" dec="226 090"><isoentity>Zacute</isoentity><desc>latin capital letter z with acute</desc><unientity>0179</unientity></character>
-<character hex="E2 7A" dec="226 122"><isoentity>zacute</isoentity><desc>latin small letter z with acute</desc><unientity>017A</unientity></character>
-<character hex="E9 5A" dec="233 090"><isoentity>Zcaron</isoentity><desc>latin capital letter z with caron</desc><unientity>017D</unientity></character>
-<character hex="E9 7A" dec="233 122"><isoentity>zcaron</isoentity><desc>latin small letter z with caron</desc><unientity>017E</unientity></character>
-<character hex="E3 5A" dec="227 090"><isoentity>Zcirc</isoentity><desc>latin capital letter z with circumflex</desc><unientity>1E90</unientity></character>
-<character hex="E3 7A" dec="227 122"><isoentity>zcirc</isoentity><desc>latin small letter z with circumflex</desc><unientity>1E91</unientity></character>
-<character hex="F2 5A" dec="242 090"><isoentity>Zdotb</isoentity><desc>latin capital letter z with dot below</desc><unientity>1E92</unientity></character>
-<character hex="F2 7A" dec="242 122"><isoentity>zdotb</isoentity><desc>latin small letter z with dot below</desc><unientity>1E93</unientity></character>
-<character hex="E7 5A" dec="231 090"><isoentity>Zdot</isoentity><desc>latin capital letter z with dot above</desc><unientity>017B</unientity></character>
-<character hex="E7 7A" dec="231 122"><isoentity>zdot</isoentity><desc>latin small letter z with dot above</desc><unientity>017C</unientity></character>
-<character hex="F6 5A" dec="246 090"><isoentity>Zlowline</isoentity><desc>latin capital letter z with low line</desc><unientity>1E94</unientity></character>
-<character hex="F6 7A" dec="246 122"><isoentity>zlowline</isoentity><desc>latin small letter z with low line</desc><unientity>1E95</unientity></character>
- </entitymap>
+++ /dev/null
-#!/bin/sh
-# the next line restats using tclsh \
-exec tclsh "$0" "$@"
-#
-# $Id: charconv.tcl,v 1.3 2003-06-02 22:17:20 adam Exp $
-
-proc usage {} {
- puts {charconv.tcl: [-p prefix] [-s split] [-o ofile] file ... }
- exit 1
-}
-
-proc ins_trie {from to} {
- global trie
- if {![info exists trie(no)]} {
- set trie(no) 1
- set trie(size) 0
- }
- incr trie(size)
- ins_trie_r [split $from] $to 0
-}
-
-proc split_trie {this} {
- global trie
- set trie($this,type) d
- foreach e $trie($this,content) {
- set from [lindex $e 0]
- set to [lindex $e 1]
-
- set ch [lindex $from 0]
- set rest [lrange $from 1 end]
-
- if {[llength $rest]} {
- if {![info exist trie($this,ptr,$ch)]} {
- set trie($this,ptr,$ch) $trie(no)
- incr trie(no)
- }
- ins_trie_r $rest $to $trie($this,ptr,$ch)
- } else {
- set trie($this,to,$ch) $to
- }
- }
- set trie($this,content) missing
-}
-
-proc ins_trie_r {from to this} {
- global trie
-
- if {![info exist trie($this,type)]} {
- set trie($this,type) f
- }
- if {$trie($this,type) == "f"} {
- lappend trie($this,content) [list $from $to]
-
- # split ?
- if {[llength $trie($this,content)] > $trie(split)} {
- split_trie $this
- return [ins_trie_r $from $to $this]
- }
- } else {
- set ch [lindex $from 0]
- set rest [lrange $from 1 end]
-
- if {[llength $rest]} {
- if {![info exist trie($this,ptr,$ch)]} {
- set trie($this,ptr,$ch) $trie(no)
- incr trie(no)
- }
- ins_trie_r $rest $to $trie($this,ptr,$ch)
- } else {
- set trie($this,to,$ch) $to
- }
- }
-}
-
-proc dump_trie {ofile} {
- global trie
-
- set f [open $ofile w]
-
- puts $f "/* TRIE: size $trie(size) */"
- puts $f "\#include <string.h>"
- puts $f {
- struct yaz_iconv_trie_flat {
- char *from;
- int to;
- };
- struct yaz_iconv_trie_dir {
- struct yaz_iconv_trie *ptr;
- int to;
- };
-
- struct yaz_iconv_trie {
- struct yaz_iconv_trie_flat *flat;
- struct yaz_iconv_trie_dir *dir;
- };
- }
-
- set this $trie(no)
- while { [incr this -1] >= 0 } {
- puts $f "/* PAGE $this */"
- if {$trie($this,type) == "f"} {
- puts $f "struct yaz_iconv_trie_flat $trie(prefix)page${this}_flat\[\] = \{"
- foreach m $trie($this,content) {
- puts -nonewline $f " \{\""
- foreach d [lindex $m 0] {
- puts -nonewline $f "\\x$d"
- }
- puts -nonewline $f "\", 0x[lindex $m 1]"
- puts $f "\},"
- }
- puts $f " \{0, 0\}"
- puts $f "\};"
- puts $f "struct yaz_iconv_trie $trie(prefix)page${this} = \{"
- puts $f " $trie(prefix)page${this}_flat, 0"
- puts $f "\};"
- } else {
- puts $f "struct yaz_iconv_trie_dir $trie(prefix)page${this}_dir\[256\] = \{"
- for {set i 0} {$i < 256} {incr i} {
- puts -nonewline $f " \{"
- set ch [format %02X $i]
- set null 1
- if {[info exist trie($this,ptr,$ch)]} {
- puts -nonewline $f "&$trie(prefix)page$trie($this,ptr,$ch), "
- set null 0
- } else {
- puts -nonewline $f "0, "
- }
- if {[info exist trie($this,to,$ch)]} {
- puts -nonewline $f "0x$trie($this,to,$ch)\}"
- set null 0
- } else {
- puts -nonewline $f "0\}"
- }
- if {!$null} {
- puts -nonewline $f " /* $ch */"
- }
- if {$i < 255} {
- puts $f ","
- } else {
- puts $f ""
- }
- }
- puts $f "\};"
- puts $f "struct yaz_iconv_trie $trie(prefix)page${this} = \{"
- puts $f " 0, $trie(prefix)page${this}_dir"
- puts $f "\};"
- }
- }
- puts $f {
- static unsigned long lookup(struct yaz_iconv_trie *t, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
- {
- if (!t || inbytesleft < 1)
- return 0;
- if (t->dir)
- {
- size_t ch = inp[0] & 0xff;
- unsigned long code =
- lookup(t->dir[ch].ptr, inp+1, inbytesleft-1, no_read);
- if (code)
- {
- (*no_read)++;
- return code;
- }
- if (t->dir[ch].to)
- {
- code = t->dir[ch].to;
- *no_read = 1;
- return code;
- }
- }
- else
- {
- struct yaz_iconv_trie_flat *flat = t->flat;
- while (flat->from)
- {
- size_t len = strlen(flat->from);
- if (len <= inbytesleft)
- {
- if (memcmp(flat->from, inp, len) == 0)
- {
- *no_read = len;
- return flat->to;
- }
- }
- flat++;
- }
- }
- return 0;
- }
-
- }
- puts $f "unsigned long yaz_$trie(prefix)_conv
- (unsigned char *inp, size_t inbytesleft, size_t *no_read)
- {
- unsigned long code;
-
- code = lookup(&$trie(prefix)page0, inp, inbytesleft, no_read);
- if (!code)
- {
- *no_read = 1;
- code = *inp;
- }
- return code;
- }
- "
- close $f
-}
-
-proc readfile {fname} {
- set lineno 0
- set f [open $fname r]
- while {1} {
- incr lineno
- set cnt [gets $f line]
- if {$cnt < 0} {
- break
- }
- set hex {}
- set uni {}
- regexp {<character hex="([^\"]*)".*<unientity>([0-9A-Z]*)</unientity>} $line s hex uni
- # puts "$lineno hex=$hex uni=$uni $line"
- if {[string length $uni]} {
- ins_trie $hex $uni
- }
- }
- close $f
-}
-
-set verbose 0
-set ifile {}
-set ofile out.c
-set trie(split) 40
-set trie(prefix) {}
-# Parse command line
-set l [llength $argv]
-set i 0
-while {$i < $l} {
- set arg [lindex $argv $i]
- switch -glob -- $arg {
- -v {
- incr verbose
- }
- -s {
- if {[string length $arg]} {
- set arg [lindex $argv [incr i]]
- }
- set trie(split) $arg
- }
- -p {
- if {[string length $arg]} {
- set arg [lindex $argv [incr i]]
- }
- set trie(prefix) $arg
- }
- -o {
- if {[string length $arg]} {
- set arg [lindex $argv [incr i]]
- }
- set ofile $arg
- }
- default {
- lappend ifiles $arg
- }
- }
- incr i
-}
-if {![info exists ifiles]} {
- puts "charconv.tcl: missing input file(s)"
- usage
-}
-foreach ifile $ifiles {
- readfile $ifile
-}
-dump_trie $ofile
+++ /dev/null
-<entitymap>
-<character hex="21 23 20"><unientity>3000</unientity><desc>CJK space in some implementations</desc></character>
-<character hex="21 23 21"><unientity>3000</unientity><desc>CJK space per ANSI Z39.64</desc></character>
-<character hex="21 23 28"><unientity>FF08</unientity><desc>Ideographic left parenthesis</desc></character>
-<character hex="21 23 29"><unientity>FF09</unientity><desc>Ideographic right parenthesis</desc></character>
-<character hex="21 23 2D"><unientity>FF0D</unientity><desc>Ideographic hyphen minus</desc></character>
-<character hex="21 2A 21"><unientity>E8D0</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 22"><unientity>E8D1</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 23"><unientity>E8D2</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 24"><unientity>E8D3</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 25"><unientity>E8D4</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 26"><unientity>E8D5</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 28"><unientity>E8D6</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 29"><unientity>E8D7</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2A"><unientity>E8D8</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2B"><unientity>E8D9</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2C"><unientity>E8DA</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2D"><unientity>E8DB</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2E"><unientity>E8DC</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 2F"><unientity>E8DD</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 30"><unientity>E8DE</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 32"><unientity>E8DF</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 33"><unientity>E8E0</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 34"><unientity>E8E1</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 35"><unientity>E8E2</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 36"><unientity>E8E3</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 37"><unientity>E8E4</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 38"><unientity>E8E5</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 39"><unientity>E8E6</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3A"><unientity>E8E7</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3B"><unientity>E8E8</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3C"><unientity>E8E9</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3D"><unientity>E8EA</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3E"><unientity>E8EB</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 3F"><unientity>E8EC</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 40"><unientity>E8ED</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 41"><unientity>E8EE</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 42"><unientity>E8EF</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 43"><unientity>E8F0</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 44"><unientity>E8F1</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 45"><unientity>E8F2</unientity><desc>EACC component character</desc></character>
-<character hex="21 2A 46"><unientity>3013</unientity><desc>Ideographic geta symbol</desc></character>
-<character hex="21 2B 25"><unientity>300C</unientity><desc>Ideographic left corner bracket</desc></character>
-<character hex="21 2B 26"><unientity>300D</unientity><desc>Ideographic right corner bracket</desc></character>
-<character hex="21 2B 31"><unientity>FF3B</unientity><desc>Ideographic left square bracket</desc></character>
-<character hex="21 2B 32"><unientity>FF3D</unientity><desc>Ideographic right square bracket</desc></character>
-<character hex="21 2B 33"><unientity>3002</unientity><desc>Ideographic full stop</desc></character>
-<character hex="21 2B 34"><unientity>FF0E</unientity><desc>Ideographic variant full stop</desc></character>
-<character hex="21 2B 35"><unientity>3001</unientity><desc>Ideographic comma</desc></character>
-<character hex="21 2B 38"><unientity>FF0C</unientity><desc>Ideographic variant comma</desc></character>
-<character hex="21 2B 39"><unientity>FF1B</unientity><desc>Ideographic semicolon</desc></character>
-<character hex="21 2B 3A"><unientity>FF1A</unientity><desc>Ideographic colon</desc></character>
-<character hex="21 2B 3B"><unientity>FF1F</unientity><desc>Ideographic question mark</desc></character>
-<character hex="21 2B 3D"><unientity>FF01</unientity><desc>Ideographic exclamation point</desc></character>
-<character hex="21 2B 59"><unientity>FF0F</unientity><desc>Ideographic solidus</desc></character>
-<character hex="21 2F 30"><unientity>3007</unientity><desc>Ideographic number zero</desc></character>
-<character hex="21 30 21"><unientity>4E00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 22"><unientity>4E01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 23"><unientity>4E03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 24"><unientity>4E09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 25"><unientity>4E0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 26"><unientity>4E0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 27"><unientity>4E08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 29"><unientity>4E10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2A"><unientity>4E0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2B"><unientity>4E14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2C"><unientity>4E19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2D"><unientity>4E16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2E"><unientity>4E15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 2F"><unientity>4E18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 30"><unientity>4E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 31"><unientity>4E1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 32"><unientity>4E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 34"><unientity>4E2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 35"><unientity>4E32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 36"><unientity>51E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 37"><unientity>4E38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 38"><unientity>4E39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 39"><unientity>4E3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 3A"><unientity>4E43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 3B"><unientity>4E45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 3D"><unientity>4E4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 3E"><unientity>5C39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 3F"><unientity>4E4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 40"><unientity>4E4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 41"><unientity>4E4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 42"><unientity>4E52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 43"><unientity>4E53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 44"><unientity>4E56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 45"><unientity>4E58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 46"><unientity>4E59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 47"><unientity>4E5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 48"><unientity>4E5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 49"><unientity>4E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 4B"><unientity>4E73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 4C"><unientity>4E7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 4D"><unientity>4E82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 50"><unientity>4E8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 51"><unientity>4E8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 52"><unientity>4E8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 53"><unientity>4E95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 54"><unientity>4E94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 55"><unientity>4E92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 57"><unientity>E930</unientity><unientityalt>4E99</unientityalt><desc>Variant of 4B3057 which maps to 4E99</desc></character>
-<character hex="21 30 58"><unientity>4E9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 59"><unientity>4E9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5A"><unientity>4E9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5B"><unientity>4EA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5C"><unientity>4EA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5D"><unientity>4EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5E"><unientity>4EA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 5F"><unientity>4EA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 60"><unientity>4EAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 61"><unientity>4EAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 62"><unientity>4EAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 63"><unientity>4EAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 64"><unientity>4EBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 65"><unientity>4ECA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 66"><unientity>4EC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 68"><unientity>4EC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 69"><unientity>4EC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 6B"><unientity>4ECD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 6C"><unientity>4EC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 6D"><unientity>4ECB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 6E"><unientity>4EE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 6F"><unientity>4ED8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 70"><unientity>4ED5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 71"><unientity>4ED6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 72"><unientity>4EDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 73"><unientity>4EE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 74"><unientity>4ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 75"><unientity>4ED7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 76"><unientity>4ED9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 77"><unientity>4EE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 78"><unientity>4EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 79"><unientity>4F09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 7C"><unientity>4EFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 7D"><unientity>4F0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 30 7E"><unientity>4F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 21"><unientity>4F11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 22"><unientity>4F10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 23"><unientity>4F0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 24"><unientity>4EF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 25"><unientity>4F01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 26"><unientity>4EF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 27"><unientity>4EF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 28"><unientity>4EF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2A"><unientity>4F4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2B"><unientity>4F4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2C"><unientity>4F34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2D"><unientity>4F47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2E"><unientity>4F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 2F"><unientity>4F3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 30"><unientity>4F5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 32"><unientity>4F5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 33"><unientity>4F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 34"><unientity>4F30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 35"><unientity>4F50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 36"><unientity>4F51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 37"><unientity>4F3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 38"><unientity>4F48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 39"><unientity>4F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3A"><unientity>4F38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3B"><unientity>4F43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3C"><unientity>4F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3D"><unientity>4F3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3E"><unientity>4F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 3F"><unientity>4F5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 40"><unientity>4F60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 41"><unientity>4F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 42"><unientity>4F4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 43"><unientity>4F5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 44"><unientity>4F36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 45"><unientity>4F9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 46"><unientity>4F6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 47"><unientity>4F75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 48"><unientity>4F8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 49"><unientity>4F73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4A"><unientity>4F7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4B"><unientity>4F9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4C"><unientity>4F86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4D"><unientity>4F6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4E"><unientity>4F8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 4F"><unientity>4F96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 51"><unientity>4F83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 52"><unientity>4F7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 53"><unientity>4F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 54"><unientity>4F69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 55"><unientity>4F8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 56"><unientity>4F7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 57"><unientity>4FE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 58"><unientity>4FD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 59"><unientity>4FB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5A"><unientity>4FAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5B"><unientity>4FBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5C"><unientity>4FDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5D"><unientity>4FE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5E"><unientity>4FCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 5F"><unientity>4FB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 60"><unientity>4FDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 61"><unientity>4FDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 62"><unientity>4FC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 63"><unientity>4FD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 64"><unientity>4FDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 65"><unientity>4FCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 66"><unientity>4FAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 67"><unientity>4FD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 68"><unientity>4FC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 69"><unientity>4FC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 6A"><unientity>4FCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 6B"><unientity>4FD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 6C"><unientity>5009</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 6E"><unientity>500D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 6F"><unientity>4FEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 70"><unientity>5026</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 71"><unientity>500C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 72"><unientity>5025</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 73"><unientity>5011</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 74"><unientity>4FF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 75"><unientity>5028</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 76"><unientity>5014</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 77"><unientity>5016</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 78"><unientity>5029</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 79"><unientity>5006</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 7B"><unientity>5012</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 7C"><unientity>503C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 7D"><unientity>501A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 31 7E"><unientity>4FFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 21"><unientity>5018</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 22"><unientity>4FF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 23"><unientity>5021</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 24"><unientity>500B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 25"><unientity>5019</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 26"><unientity>5000</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 27"><unientity>4FEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 28"><unientity>4FF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 29"><unientity>502D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2A"><unientity>5003</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2B"><unientity>4FFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2C"><unientity>502A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2D"><unientity>502B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2E"><unientity>505C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 2F"><unientity>504F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 30"><unientity>5065</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 31"><unientity>5047</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 32"><unientity>505A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 33"><unientity>5049</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 34"><unientity>5043</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 35"><unientity>5074</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 36"><unientity>5076</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 37"><unientity>504E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 38"><unientity>5075</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 39"><unientity>504C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3A"><unientity>5055</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3B"><unientity>500F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3C"><unientity>5077</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3D"><unientity>508D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3E"><unientity>50A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 3F"><unientity>5085</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 40"><unientity>5099</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 41"><unientity>5091</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 42"><unientity>5080</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 43"><unientity>5096</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 44"><unientity>5098</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 45"><unientity>50AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 46"><unientity>50B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 47"><unientity>50B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 48"><unientity>50B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 49"><unientity>50C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4A"><unientity>50BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4B"><unientity>50AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4C"><unientity>50B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4D"><unientity>50AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4E"><unientity>50E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 4F"><unientity>50EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 50"><unientity>50F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 51"><unientity>50E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 52"><unientity>50D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 53"><unientity>50ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 54"><unientity>50DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 55"><unientity>50D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 56"><unientity>507D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 57"><unientity>50CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 58"><unientity>50D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 59"><unientity>5100</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5A"><unientity>5104</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5B"><unientity>50FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5C"><unientity>50F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5D"><unientity>50F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5E"><unientity>5102</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 5F"><unientity>510D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 60"><unientity>5108</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 61"><unientity>5109</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 62"><unientity>5110</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 63"><unientity>5118</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 64"><unientity>5112</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 65"><unientity>5114</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 66"><unientity>512A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 67"><unientity>511F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 68"><unientity>5121</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 69"><unientity>5132</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6A"><unientity>5137</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6B"><unientity>513C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6C"><unientity>5140</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6D"><unientity>5143</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6E"><unientity>5141</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 6F"><unientity>5145</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 70"><unientity>5144</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 71"><unientity>5146</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 72"><unientity>5149</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 73"><unientity>5147</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 74"><unientity>5148</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 75"><unientity>514C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 77"><unientity>514D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 78"><unientity>5155</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 79"><unientity>5154</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 7A"><unientity>5152</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 7B"><unientity>5157</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 7C"><unientity>515C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 7D"><unientity>5162</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 32 7E"><unientity>5165</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 21"><unientity>5167</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 22"><unientity>5168</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 23"><unientity>5169</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 24"><unientity>516B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 25"><unientity>516D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 26"><unientity>516E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 27"><unientity>516C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 28"><unientity>5171</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 29"><unientity>5175</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2A"><unientity>5176</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2B"><unientity>5177</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2C"><unientity>5178</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2D"><unientity>517C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2E"><unientity>5180</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 2F"><unientity>5189</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 30"><unientity>518C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 31"><unientity>518D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 32"><unientity>5192</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 33"><unientity>5191</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 34"><unientity>5195</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 35"><unientity>6700</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 36"><unientity>5197</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 37"><unientity>51A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 39"><unientity>51A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 3C"><unientity>51B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 3D"><unientity>51B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 3E"><unientity>51B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 40"><unientity>51CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 41"><unientity>51CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 44"><unientity>51DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 45"><unientity>51DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 47"><unientity>51F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 48"><unientity>51F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 49"><unientity>51F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 4B"><unientity>51FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 4C"><unientity>51F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 4D"><unientity>51F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 4E"><unientity>51FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 4F"><unientity>5200</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 50"><unientity>5201</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 51"><unientity>5203</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 52"><unientity>5207</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 53"><unientity>5206</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 54"><unientity>5208</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 55"><unientity>520A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 56"><unientity>5211</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 57"><unientity>5217</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 59"><unientity>520E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5A"><unientity>5224</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5B"><unientity>5225</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5C"><unientity>5220</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5D"><unientity>5228</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5E"><unientity>5229</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 5F"><unientity>5238</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 60"><unientity>523B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 61"><unientity>5237</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 62"><unientity>5230</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 63"><unientity>523A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 66"><unientity>5241</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 67"><unientity>5239</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 68"><unientity>5243</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 69"><unientity>524D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6A"><unientity>524C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6B"><unientity>524B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6C"><unientity>524A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6D"><unientity>5247</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6E"><unientity>525C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 6F"><unientity>5256</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 70"><unientity>525B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 71"><unientity>5254</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 72"><unientity>525D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 73"><unientity>526A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 74"><unientity>526F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 75"><unientity>5272</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 76"><unientity>5274</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 77"><unientity>5269</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 78"><unientity>5275</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 7A"><unientity>527D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 7B"><unientity>527F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 7C"><unientity>5283</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 7D"><unientity>5288</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 33 7E"><unientity>5287</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 21"><unientity>528D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 22"><unientity>5289</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 23"><unientity>5291</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 24"><unientity>529B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 25"><unientity>529F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 26"><unientity>52A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 27"><unientity>52A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 28"><unientity>52AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 29"><unientity>52A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2A"><unientity>52AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2B"><unientity>52AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2C"><unientity>52BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2D"><unientity>52C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2E"><unientity>52C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 2F"><unientity>52C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 30"><unientity>52C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 31"><unientity>52D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 32"><unientity>52D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 33"><unientity>52D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 34"><unientity>52D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 35"><unientity>52DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 36"><unientity>52DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 37"><unientity>52DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 38"><unientity>52E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 39"><unientity>52E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 3A"><unientity>52DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 3C"><unientity>52F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 3D"><unientity>52F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 3E"><unientity>52FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 40"><unientity>52FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 41"><unientity>5305</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 42"><unientity>5306</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 43"><unientity>5308</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 44"><unientity>530D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 45"><unientity>5310</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 46"><unientity>530F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 47"><unientity>5315</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 48"><unientity>5316</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 49"><unientity>5317</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4A"><unientity>5319</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4B"><unientity>53F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4C"><unientity>531D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4D"><unientity>5321</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4E"><unientity>5320</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 4F"><unientity>5323</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 50"><unientity>532A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 51"><unientity>532F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 52"><unientity>5331</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 53"><unientity>5339</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 54"><unientity>533E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 55"><unientity>5340</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 56"><unientity>533F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 57"><unientity>5341</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 58"><unientity>5343</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 59"><unientity>5345</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 5A"><unientity>5348</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 5B"><unientity>5347</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 5C"><unientity>534A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 5D"><unientity>E931</unientity><unientityalt>5349</unientityalt><desc>Variant of 2D345D which maps to 5349</desc></character>
-<character hex="21 34 5F"><unientity>5352</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 60"><unientity>5354</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 61"><unientity>5353</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 62"><unientity>5351</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 63"><unientity>5357</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 64"><unientity>535A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 66"><unientity>535E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 67"><unientity>5361</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 69"><unientity>5366</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6A"><unientity>536F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6B"><unientity>536E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6C"><unientity>5370</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6D"><unientity>5371</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6E"><unientity>537D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 6F"><unientity>5375</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 71"><unientity>5378</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 73"><unientity>537B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 74"><unientity>537F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 75"><unientity>5384</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 76"><unientity>539A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 77"><unientity>539D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 78"><unientity>539F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 79"><unientity>53A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 7A"><unientity>53AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 7B"><unientity>53B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 7C"><unientity>53BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 7D"><unientity>53C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 34 7E"><unientity>53C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 21"><unientity>53C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 22"><unientity>53CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 23"><unientity>53CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 24"><unientity>53CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 25"><unientity>53D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 26"><unientity>53D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 27"><unientity>53D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 28"><unientity>53DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 29"><unientity>53DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2A"><unientity>66FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2B"><unientity>53E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2C"><unientity>53E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2D"><unientity>53F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2E"><unientity>53E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 2F"><unientity>53EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 30"><unientity>53EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 31"><unientity>53E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 32"><unientity>53F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 33"><unientity>53FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 34"><unientity>53E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 35"><unientity>53E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 36"><unientity>53EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 37"><unientity>53EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 38"><unientity>E900</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="21 35 39"><unientity>53E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 3A"><unientity>53F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 3B"><unientity>53ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 3C"><unientity>53EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 3D"><unientity>53F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 3F"><unientity>540B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 40"><unientity>5409</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 41"><unientity>5410</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 42"><unientity>540F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 43"><unientity>540C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 44"><unientity>540A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 45"><unientity>540D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 46"><unientity>5404</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 47"><unientity>5403</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 48"><unientity>5412</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 4A"><unientity>E9E0</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 35 4D"><unientity>542D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 4E"><unientity>541D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 4F"><unientity>541E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 50"><unientity>541B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 51"><unientity>544E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 52"><unientity>543E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 53"><unientity>5427</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 54"><unientity>5440</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 55"><unientity>5431</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 56"><unientity>5446</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 57"><unientity>543C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 58"><unientity>5443</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 59"><unientity>5426</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5A"><unientity>5420</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5B"><unientity>5436</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5C"><unientity>5433</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5D"><unientity>5435</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5E"><unientity>542E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 5F"><unientity>544A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 60"><unientity>5448</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 61"><unientity>543B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 62"><unientity>5438</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 63"><unientity>5439</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 64"><unientity>5442</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 65"><unientity>542B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 66"><unientity>541F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 67"><unientity>5429</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 68"><unientity>5473</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 69"><unientity>5462</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6A"><unientity>5475</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6B"><unientity>5495</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6C"><unientity>5478</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6D"><unientity>5496</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6E"><unientity>5477</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 6F"><unientity>547B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 71"><unientity>5492</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 72"><unientity>5484</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 73"><unientity>547C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 74"><unientity>5468</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 75"><unientity>5486</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 76"><unientity>548B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 77"><unientity>548C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 78"><unientity>5490</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 79"><unientity>547D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 7A"><unientity>5476</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 7B"><unientity>5471</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 7C"><unientity>549A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 7D"><unientity>548E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 35 7E"><unientity>54A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 21"><unientity>54AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 22"><unientity>54A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 23"><unientity>54AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 24"><unientity>54C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 25"><unientity>54B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 26"><unientity>54A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 27"><unientity>54AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 28"><unientity>54C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 29"><unientity>54C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 2A"><unientity>54C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 2B"><unientity>54C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 2D"><unientity>54C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 2F"><unientity>54CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 30"><unientity>54B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 31"><unientity>54BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 32"><unientity>54AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 33"><unientity>54C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 34"><unientity>5501</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 35"><unientity>54FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 36"><unientity>5510</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 37"><unientity>54EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 38"><unientity>5514</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 39"><unientity>54FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3A"><unientity>54E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3B"><unientity>54EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3C"><unientity>54F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3D"><unientity>54E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3E"><unientity>54E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 3F"><unientity>54E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 40"><unientity>54ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 41"><unientity>5506</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 42"><unientity>5509</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 43"><unientity>54E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 44"><unientity>5556</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 45"><unientity>5533</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 46"><unientity>5546</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 48"><unientity>554F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 49"><unientity>555E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4A"><unientity>5566</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4B"><unientity>556A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4C"><unientity>554A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4D"><unientity>5544</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4E"><unientity>555C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 4F"><unientity>5531</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 50"><unientity>5543</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 51"><unientity>552C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 52"><unientity>5561</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 53"><unientity>553E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 54"><unientity>5563</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 55"><unientity>5555</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 56"><unientity>552F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 57"><unientity>552E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 58"><unientity>5564</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 59"><unientity>5538</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5A"><unientity>55A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5B"><unientity>5580</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5C"><unientity>557B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5D"><unientity>557C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5E"><unientity>5527</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 5F"><unientity>5594</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 60"><unientity>5587</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 61"><unientity>559C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 62"><unientity>558B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 63"><unientity>55AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 64"><unientity>55B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 65"><unientity>558A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 66"><unientity>5583</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 67"><unientity>55B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 68"><unientity>55AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 69"><unientity>5582</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6A"><unientity>559F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6B"><unientity>559D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6C"><unientity>5598</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6D"><unientity>559A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6E"><unientity>557E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 6F"><unientity>55AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 70"><unientity>5589</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 71"><unientity>55B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 72"><unientity>55BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 73"><unientity>55E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 74"><unientity>55DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 75"><unientity>55D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 76"><unientity>55DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 77"><unientity>55E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 78"><unientity>55C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 79"><unientity>55D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 7A"><unientity>55CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 7B"><unientity>55E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 7C"><unientity>55EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 7D"><unientity>55E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 36 7E"><unientity>55C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 21"><unientity>55DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 22"><unientity>55C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 23"><unientity>55E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 24"><unientity>5600</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 25"><unientity>561B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 26"><unientity>55FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 27"><unientity>5616</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 28"><unientity>55F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 29"><unientity>5608</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 2A"><unientity>561F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 2B"><unientity>55FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 2C"><unientity>E932</unientity><unientityalt>5606</unientityalt><desc>Variant of 4B372C which maps to 5606</desc></character>
-<character hex="21 37 2D"><unientity>5609</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 2E"><unientity>5614</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 2F"><unientity>560E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 30"><unientity>5617</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 31"><unientity>560D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 32"><unientity>562E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 33"><unientity>562F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 34"><unientity>564E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 35"><unientity>5636</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 36"><unientity>5632</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 37"><unientity>563B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 38"><unientity>5639</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 39"><unientity>5657</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 3B"><unientity>5653</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 3C"><unientity>563F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 3D"><unientity>5634</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 3E"><unientity>5637</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 3F"><unientity>5659</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 40"><unientity>5630</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 41"><unientity>566B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 42"><unientity>5664</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 43"><unientity>5669</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 44"><unientity>5678</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 45"><unientity>5674</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 46"><unientity>5679</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 47"><unientity>5665</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 48"><unientity>566A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 49"><unientity>5668</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 4A"><unientity>5671</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 4B"><unientity>566F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 4C"><unientity>E933</unientity><unientityalt>5662</unientityalt><desc>Variant of 4B374C which maps to 5662</desc></character>
-<character hex="21 37 4D"><unientity>566C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 4E"><unientity>5680</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 4F"><unientity>568E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 50"><unientity>5685</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 51"><unientity>5687</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 52"><unientity>5690</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 53"><unientity>568F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 54"><unientity>5695</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 55"><unientity>E934</unientity><unientityalt>56AE</unientityalt><desc>Variant of 453755 which maps to 56AE</desc></character>
-<character hex="21 37 56"><unientity>56A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 57"><unientity>56B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 58"><unientity>56A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 59"><unientity>56B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5A"><unientity>56B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5B"><unientity>56B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5C"><unientity>56C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5D"><unientity>56C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5E"><unientity>56C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 5F"><unientity>56BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 60"><unientity>56CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 61"><unientity>56C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 62"><unientity>56C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 64"><unientity>56D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 65"><unientity>56DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 66"><unientity>56DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 67"><unientity>56E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 68"><unientity>56DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 69"><unientity>56E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 6B"><unientity>56F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 6C"><unientity>56FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 6D"><unientity>5703</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 6E"><unientity>5708</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 6F"><unientity>570B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 70"><unientity>570D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 71"><unientity>5712</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 72"><unientity>5713</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 73"><unientity>5718</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 74"><unientity>5716</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 75"><unientity>571F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 77"><unientity>572D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 78"><unientity>572F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 79"><unientity>5730</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 7A"><unientity>5728</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 7B"><unientity>5733</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 7C"><unientity>5751</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 37 7D"><unientity>574A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 21"><unientity>5740</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 22"><unientity>5747</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 23"><unientity>574D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 24"><unientity>573E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 25"><unientity>574E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 27"><unientity>5783</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 28"><unientity>576A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 29"><unientity>5769</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2A"><unientity>5777</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2B"><unientity>5761</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2C"><unientity>5764</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2D"><unientity>5766</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2E"><unientity>5782</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 2F"><unientity>577C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 30"><unientity>57A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 31"><unientity>578B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 32"><unientity>57A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 33"><unientity>57AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 34"><unientity>57A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 35"><unientity>57D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 36"><unientity>57C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 37"><unientity>57CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 38"><unientity>57CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 39"><unientity>57C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3A"><unientity>57F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3B"><unientity>57F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3C"><unientity>57FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3D"><unientity>57DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3E"><unientity>580A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 3F"><unientity>5805</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 40"><unientity>5802</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 41"><unientity>5806</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 42"><unientity>57E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 43"><unientity>57E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 44"><unientity>5831</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 45"><unientity>582F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 46"><unientity>5835</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 47"><unientity>582A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 48"><unientity>5830</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 49"><unientity>5824</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4A"><unientity>5834</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4B"><unientity>5821</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4C"><unientity>585E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4D"><unientity>5857</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4E"><unientity>5858</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 4F"><unientity>5851</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 50"><unientity>586B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 51"><unientity>584C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 52"><unientity>585A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 53"><unientity>586D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 54"><unientity>5854</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 55"><unientity>5862</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 56"><unientity>584A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 57"><unientity>5883</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 58"><unientity>587E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 59"><unientity>5875</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5A"><unientity>588A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5B"><unientity>5879</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5C"><unientity>5885</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5D"><unientity>5893</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5E"><unientity>589E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 5F"><unientity>5880</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 60"><unientity>58B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 61"><unientity>589C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 62"><unientity>58AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 63"><unientity>589F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 64"><unientity>E935</unientity><unientityalt>58C7</unientityalt><desc>Variant of 4B3864 which maps to 58C7</desc></character>
-<character hex="21 38 65"><unientity>58C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 66"><unientity>58C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 67"><unientity>58BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 68"><unientity>58D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 69"><unientity>58D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6A"><unientity>58D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6B"><unientity>58D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6C"><unientity>58D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6D"><unientity>58DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6E"><unientity>58DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 6F"><unientity>58E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 70"><unientity>58E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 71"><unientity>58E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 72"><unientity>58EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 73"><unientity>58EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 74"><unientity>58EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 76"><unientity>58FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 77"><unientity>58FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 78"><unientity>590F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 79"><unientity>5914</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 7A"><unientity>5915</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 7B"><unientity>5916</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 7C"><unientity>5919</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 7D"><unientity>591A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 38 7E"><unientity>591C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 21"><unientity>5920</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 22"><unientity>5924</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 23"><unientity>5925</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 24"><unientity>5922</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 25"><unientity>5927</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 26"><unientity>592A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 27"><unientity>592B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 28"><unientity>5929</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 29"><unientity>592D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 2A"><unientity>592E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 2B"><unientity>5931</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 2C"><unientity>5937</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 2E"><unientity>593E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 2F"><unientity>5954</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 30"><unientity>5949</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 31"><unientity>5948</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 32"><unientity>5947</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 33"><unientity>5944</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 34"><unientity>5955</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 35"><unientity>5951</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 36"><unientity>594E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 37"><unientity>594F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 38"><unientity>5950</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 39"><unientity>5957</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3A"><unientity>5958</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3B"><unientity>595A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3C"><unientity>5960</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3D"><unientity>5962</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3E"><unientity>5967</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 3F"><unientity>5969</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 40"><unientity>596A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 41"><unientity>596E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 42"><unientity>5973</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 43"><unientity>5974</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 44"><unientity>5976</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 45"><unientity>5984</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 46"><unientity>5983</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 47"><unientity>5978</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 48"><unientity>597D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 49"><unientity>5979</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 4A"><unientity>5982</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 4B"><unientity>5981</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 4C"><unientity>59A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 4D"><unientity>5992</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 4F"><unientity>59A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 50"><unientity>59A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 51"><unientity>5993</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 52"><unientity>599E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 53"><unientity>599D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 54"><unientity>5999</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 55"><unientity>59A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 56"><unientity>598A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 57"><unientity>5996</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 58"><unientity>59BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 59"><unientity>59BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5A"><unientity>59AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5B"><unientity>59D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5C"><unientity>59B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5D"><unientity>59C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5E"><unientity>59D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 5F"><unientity>59D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 60"><unientity>59AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 61"><unientity>59D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 62"><unientity>59D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 63"><unientity>59CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 65"><unientity>59CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 66"><unientity>59D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 67"><unientity>59E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 69"><unientity>59FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6A"><unientity>59D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6B"><unientity>5A03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6C"><unientity>59E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6D"><unientity>59E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6E"><unientity>59EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 6F"><unientity>5A01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 70"><unientity>59FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 71"><unientity>59E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 72"><unientity>59DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 73"><unientity>5A11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 74"><unientity>5A18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 75"><unientity>5A23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 76"><unientity>5A1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 77"><unientity>5A13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 78"><unientity>59EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 79"><unientity>5A20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 7A"><unientity>5A1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 7B"><unientity>5A1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 7C"><unientity>5A0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 7D"><unientity>5A29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 39 7E"><unientity>5A25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 21"><unientity>5A46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 22"><unientity>5A49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 23"><unientity>5A6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 24"><unientity>5A36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 25"><unientity>5A4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 26"><unientity>5A40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 27"><unientity>5A66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 28"><unientity>5A41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 29"><unientity>5A3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2A"><unientity>5A62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2B"><unientity>5A5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2C"><unientity>5A77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2D"><unientity>5A9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2E"><unientity>5A92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 2F"><unientity>5A7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 30"><unientity>5ABC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 31"><unientity>5A9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 32"><unientity>5ACC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 33"><unientity>5AC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 34"><unientity>5AC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 35"><unientity>5ABE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 36"><unientity>5ABD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 37"><unientity>5AB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 38"><unientity>5AC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 39"><unientity>5AB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3A"><unientity>5AE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3B"><unientity>5AD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3C"><unientity>5AD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3D"><unientity>5AE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3E"><unientity>5AE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 3F"><unientity>5AD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 40"><unientity>5AE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 41"><unientity>5AFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 42"><unientity>5B09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 43"><unientity>5B0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 44"><unientity>5B0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 45"><unientity>5AF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 46"><unientity>5B34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 47"><unientity>5B1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 48"><unientity>5B2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 49"><unientity>5B24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4A"><unientity>5B30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4B"><unientity>5B38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4C"><unientity>5B40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4D"><unientity>5B50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4E"><unientity>5B51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 4F"><unientity>5B53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 50"><unientity>5B54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 51"><unientity>5B55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 52"><unientity>5B57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 53"><unientity>5B58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 54"><unientity>5B5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 55"><unientity>5B5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 57"><unientity>5B5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 58"><unientity>5B63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 59"><unientity>5B64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5A"><unientity>5B69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5B"><unientity>5B6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5C"><unientity>5B70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5D"><unientity>5B73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5E"><unientity>5B71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 5F"><unientity>5B75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 60"><unientity>5B78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 61"><unientity>5B7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 62"><unientity>5B7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 63"><unientity>5B7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 65"><unientity>5B87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 66"><unientity>5B88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 67"><unientity>5B89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 68"><unientity>5B85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 69"><unientity>5B8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6A"><unientity>5B8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6B"><unientity>5B8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6C"><unientity>5B97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6D"><unientity>5B9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6E"><unientity>5B9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 6F"><unientity>5B98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 70"><unientity>5B99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 71"><unientity>5B9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 72"><unientity>5BA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 73"><unientity>5BA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 74"><unientity>5BA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 75"><unientity>5BA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 76"><unientity>5BA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 77"><unientity>5BB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 78"><unientity>5BB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 7A"><unientity>5BB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 7B"><unientity>5BB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 7C"><unientity>5BAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 7D"><unientity>5BB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3A 7E"><unientity>5BB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 21"><unientity>5BC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 22"><unientity>5BC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 23"><unientity>5BC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 24"><unientity>5BC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 25"><unientity>5BC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 26"><unientity>5BBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 27"><unientity>5BCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 28"><unientity>5BD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 29"><unientity>5BD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2A"><unientity>5BD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2B"><unientity>5BE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2C"><unientity>5BE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2D"><unientity>5BE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2E"><unientity>5BE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 2F"><unientity>5BE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 30"><unientity>5BDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 31"><unientity>5BE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 32"><unientity>5BE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 33"><unientity>5BDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 34"><unientity>5BEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 35"><unientity>5BEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 36"><unientity>5BE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 37"><unientity>5BEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 38"><unientity>5BF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 39"><unientity>5BF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3A"><unientity>5BF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3B"><unientity>5BFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3C"><unientity>5C01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3D"><unientity>5C04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3E"><unientity>5C09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 3F"><unientity>5C08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 40"><unientity>5C07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 41"><unientity>5C0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 42"><unientity>5C0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 43"><unientity>5C0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 44"><unientity>5C0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 45"><unientity>5C0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 46"><unientity>5C11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 47"><unientity>5C16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 48"><unientity>5C1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 49"><unientity>5C24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4A"><unientity>5C2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4B"><unientity>5C31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4C"><unientity>5C37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4D"><unientity>5C38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4E"><unientity>5C3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 4F"><unientity>5C3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 50"><unientity>5C40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 51"><unientity>5C41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 52"><unientity>5C3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 53"><unientity>5C3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 54"><unientity>5C46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 55"><unientity>5C45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 56"><unientity>5C48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 57"><unientity>5C4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 58"><unientity>5C4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 59"><unientity>5C4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 5A"><unientity>5C55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 5B"><unientity>5C51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 5C"><unientity>5C50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 5D"><unientity>E9E1</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 3B 5E"><unientity>5C60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 5F"><unientity>5C5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 60"><unientity>5C62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 61"><unientity>E936</unientity><unientityalt>5C64</unientityalt><desc>Variant of 4B3B61 which maps to 5C64</desc></character>
-<character hex="21 3B 62"><unientity>5C65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 63"><unientity>5C6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 64"><unientity>5C6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 65"><unientity>5C71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 66"><unientity>5C79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 67"><unientity>5C90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 68"><unientity>5C8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 69"><unientity>5C91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 6A"><unientity>5C94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 6B"><unientity>5CB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 6C"><unientity>5CB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 6E"><unientity>5CA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 6F"><unientity>5CAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 71"><unientity>5CB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 72"><unientity>5CD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 73"><unientity>5D01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 74"><unientity>5CFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 75"><unientity>5CED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 76"><unientity>5CFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 77"><unientity>5CE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 78"><unientity>5CF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 79"><unientity>5CF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 7A"><unientity>5CEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 7B"><unientity>5D07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 7C"><unientity>5D06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 7D"><unientity>5D1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3B 7E"><unientity>5D16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 21"><unientity>5D0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 22"><unientity>5D11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 23"><unientity>5D22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 24"><unientity>5D29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 25"><unientity>5D14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 26"><unientity>5D19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 27"><unientity>5D4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 28"><unientity>5D50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 29"><unientity>5D69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2A"><unientity>5D84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2B"><unientity>5D87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2C"><unientity>5D9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2D"><unientity>5DBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2E"><unientity>5DBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 2F"><unientity>E937</unientity><unientityalt>5DBA</unientityalt><desc>Variant of 4B3C2F which maps to 5DBA</desc></character>
-<character hex="21 3C 30"><unientity>5DCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 31"><unientity>5DD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 32"><unientity>5DD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 33"><unientity>5DD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 34"><unientity>5DDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 35"><unientity>5DDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 36"><unientity>5DE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 37"><unientity>5DE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 38"><unientity>5DE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 39"><unientity>5DE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3A"><unientity>5DE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3B"><unientity>5DEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3C"><unientity>5DEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3D"><unientity>5DF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3E"><unientity>5DF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 3F"><unientity>5DF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 40"><unientity>5DF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 41"><unientity>5DF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 42"><unientity>5DFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 43"><unientity>5DFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 44"><unientity>5E02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 46"><unientity>5E06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 49"><unientity>5E1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4A"><unientity>5E16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4B"><unientity>5E15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4C"><unientity>5E1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4D"><unientity>5E11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4E"><unientity>5E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 4F"><unientity>5E25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 51"><unientity>5E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 52"><unientity>5E33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 53"><unientity>5E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 54"><unientity>5E38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 55"><unientity>5E37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 56"><unientity>5E45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 57"><unientity>5E3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 58"><unientity>5E40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 59"><unientity>5E4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5A"><unientity>5E5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5B"><unientity>5E54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5C"><unientity>5E57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5D"><unientity>5E55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5E"><unientity>5E63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 5F"><unientity>5E62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 60"><unientity>5E5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 61"><unientity>5E6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 63"><unientity>5E73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 65"><unientity>5E74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 68"><unientity>5E7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 69"><unientity>5E7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6A"><unientity>5E7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6B"><unientity>5E7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6C"><unientity>5E8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6D"><unientity>5E87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6E"><unientity>5E8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 6F"><unientity>5E9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 70"><unientity>5E97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 71"><unientity>5E96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 72"><unientity>5E9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 73"><unientity>5E95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 74"><unientity>5EA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 75"><unientity>5EA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 76"><unientity>5EAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 77"><unientity>5EA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 78"><unientity>5EAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 79"><unientity>5EB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 7A"><unientity>5EB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 7B"><unientity>5EB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 7C"><unientity>5EB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 7D"><unientity>5EC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3C 7E"><unientity>5EC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 21"><unientity>5EBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 22"><unientity>5ECA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 23"><unientity>5EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 24"><unientity>5EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 25"><unientity>5ED3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 26"><unientity>5ED6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 27"><unientity>5EE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 28"><unientity>5EDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 29"><unientity>5EDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 2A"><unientity>E938</unientity><unientityalt>5EE3</unientityalt><desc>Variant of 4B3D2A which maps to 5EE3</desc></character>
-<character hex="21 3D 2B"><unientity>5EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 2C"><unientity>5EE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 2D"><unientity>9F90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 2E"><unientity>5EEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 2F"><unientity>5EF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 30"><unientity>5EF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 32"><unientity>5EF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 33"><unientity>5EFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 34"><unientity>5EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 36"><unientity>5F04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 37"><unientity>5F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 38"><unientity>5F0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 39"><unientity>5F0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3A"><unientity>5F12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3B"><unientity>5F13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3C"><unientity>5F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3D"><unientity>5F14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3E"><unientity>5F18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 3F"><unientity>5F17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 40"><unientity>5F1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 41"><unientity>5F1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 42"><unientity>5F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 43"><unientity>5F27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 44"><unientity>5F29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 45"><unientity>5F2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 46"><unientity>5F31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 47"><unientity>5F35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 48"><unientity>5F37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 49"><unientity>5F3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4A"><unientity>5F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4B"><unientity>5F48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4C"><unientity>5F4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4D"><unientity>5F4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4E"><unientity>5F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 4F"><unientity>5F59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 50"><unientity>5F5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 51"><unientity>5F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 52"><unientity>5F64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 53"><unientity>5F65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 54"><unientity>5F6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 55"><unientity>5F69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 57"><unientity>5F6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 58"><unientity>5F70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 59"><unientity>5F71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 5B"><unientity>5F79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 5C"><unientity>5F80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 5E"><unientity>5F7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 5F"><unientity>5F7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 60"><unientity>5F85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 61"><unientity>5F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 62"><unientity>5F8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 63"><unientity>5F8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 64"><unientity>5F87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 65"><unientity>5F8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 66"><unientity>5F92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 67"><unientity>5F91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 68"><unientity>5F90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 69"><unientity>5F98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 6A"><unientity>5F97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 6B"><unientity>5F99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 6C"><unientity>5F9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 6F"><unientity>5FA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 71"><unientity>5FAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 72"><unientity>5FAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 73"><unientity>5FAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 74"><unientity>5FB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 75"><unientity>5FB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 76"><unientity>5FB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 77"><unientity>5FBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 78"><unientity>5FC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 79"><unientity>5FC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 7A"><unientity>5FD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 7B"><unientity>5FD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 7C"><unientity>5FCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3D 7D"><unientity>5FD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 21"><unientity>5FCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 22"><unientity>5FEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 23"><unientity>5FE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 24"><unientity>5FF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 25"><unientity>5FFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 26"><unientity>5FDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 27"><unientity>5FF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 28"><unientity>5FFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 29"><unientity>6014</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 2A"><unientity>E939</unientity><unientityalt>6035</unientityalt><desc>Variant of 4B3E2A which maps to 6035</desc></character>
-<character hex="21 3E 2B"><unientity>602A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 2C"><unientity>602F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 2D"><unientity>6016</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 2E"><unientity>601D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 2F"><unientity>600F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 30"><unientity>6021</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 31"><unientity>6020</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 32"><unientity>6028</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 33"><unientity>6025</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 34"><unientity>6027</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 35"><unientity>600E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 36"><unientity>6015</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 37"><unientity>6012</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 38"><unientity>6059</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 39"><unientity>6063</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3A"><unientity>6068</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3B"><unientity>6043</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3C"><unientity>6065</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3D"><unientity>6050</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3E"><unientity>606D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 3F"><unientity>6062</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 40"><unientity>E93A</unientity><unientityalt>6046</unientityalt><desc>Variant of 4B3E40 which maps to 6046</desc></character>
-<character hex="21 3E 41"><unientity>604D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 42"><unientity>606B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 43"><unientity>6069</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 44"><unientity>606C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 45"><unientity>606F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 46"><unientity>606A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 47"><unientity>6064</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 48"><unientity>6070</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 49"><unientity>6055</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4A"><unientity>608C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4B"><unientity>60A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4C"><unientity>607F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4D"><unientity>609F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4E"><unientity>609A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 4F"><unientity>6096</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 50"><unientity>6084</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 51"><unientity>608D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 52"><unientity>60A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 53"><unientity>6089</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 54"><unientity>6094</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 55"><unientity>60A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 56"><unientity>60A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 57"><unientity>60B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 58"><unientity>60E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 59"><unientity>60CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 5B"><unientity>E93B</unientity><unientityalt>60C5</unientityalt><desc>Variant of 4B3E5B which maps to 60C5</desc></character>
-<character hex="21 3E 5C"><unientity>60B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 5D"><unientity>60D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 5E"><unientity>60B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 5F"><unientity>60BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 60"><unientity>60E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 61"><unientity>60E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 62"><unientity>60DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 63"><unientity>60D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 64"><unientity>60D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 65"><unientity>60BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 66"><unientity>60B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 67"><unientity>60C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 68"><unientity>60B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 69"><unientity>60DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6A"><unientity>60DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6B"><unientity>610F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6C"><unientity>611C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6D"><unientity>60F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6E"><unientity>611F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 6F"><unientity>60F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 70"><unientity>60FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 71"><unientity>60FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 72"><unientity>611A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 73"><unientity>6115</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 74"><unientity>60F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 75"><unientity>6123</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 76"><unientity>60F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 77"><unientity>611B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 78"><unientity>610E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 79"><unientity>6100</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 7A"><unientity>6101</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 7B"><unientity>60F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 7C"><unientity>6109</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 7D"><unientity>6108</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3E 7E"><unientity>60F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 21"><unientity>6148</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 22"><unientity>6168</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 24"><unientity>613C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 26"><unientity>614C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 27"><unientity>614D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 28"><unientity>614B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 29"><unientity>613E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2A"><unientity>6127</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2B"><unientity>6134</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2C"><unientity>6147</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2D"><unientity>6177</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2E"><unientity>6176</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 2F"><unientity>6167</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 30"><unientity>6170</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 31"><unientity>615A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 32"><unientity>615D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 33"><unientity>6182</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 34"><unientity>617C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 35"><unientity>6162</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 36"><unientity>616E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 37"><unientity>6155</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 38"><unientity>6158</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 39"><unientity>6163</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3A"><unientity>615F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3B"><unientity>616B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3C"><unientity>617E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3D"><unientity>61A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3E"><unientity>61B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 3F"><unientity>6191</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 40"><unientity>618E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 41"><unientity>61AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 42"><unientity>61A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 43"><unientity>61AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 44"><unientity>619A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 45"><unientity>61A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 46"><unientity>6194</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 47"><unientity>618A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 48"><unientity>61B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 49"><unientity>61CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4A"><unientity>61C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4B"><unientity>6190</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4C"><unientity>61BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4D"><unientity>61C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4E"><unientity>61C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 4F"><unientity>61C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 50"><unientity>61CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 51"><unientity>61E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 52"><unientity>61E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 53"><unientity>E93C</unientity><unientityalt>61F2</unientityalt><desc>Variant of 4B3F53 which maps to 61F2</desc></character>
-<character hex="21 3F 54"><unientity>61F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 55"><unientity>61F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 56"><unientity>61F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 57"><unientity>61F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 58"><unientity>61FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 59"><unientity>61FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5A"><unientity>61FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5B"><unientity>61FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5C"><unientity>6200</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5D"><unientity>6208</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5E"><unientity>620A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 5F"><unientity>620E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 60"><unientity>620D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 61"><unientity>620C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 62"><unientity>6210</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 63"><unientity>6212</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 64"><unientity>6211</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 65"><unientity>6216</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 66"><unientity>6215</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 67"><unientity>621B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 68"><unientity>621A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 69"><unientity>621F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6A"><unientity>6221</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6B"><unientity>6222</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6C"><unientity>622A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6D"><unientity>622E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6E"><unientity>6230</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 6F"><unientity>6232</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 70"><unientity>6234</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 71"><unientity>6233</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 72"><unientity>6236</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 73"><unientity>623F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 74"><unientity>623E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 75"><unientity>6240</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 76"><unientity>6241</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 78"><unientity>6248</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 79"><unientity>6249</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 7A"><unientity>624B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 7D"><unientity>6253</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 3F 7E"><unientity>6254</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 21"><unientity>6252</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 22"><unientity>625B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 23"><unientity>6263</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 24"><unientity>6258</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 25"><unientity>6296</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 26"><unientity>6297</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 27"><unientity>6292</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 28"><unientity>6276</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 29"><unientity>6289</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2A"><unientity>627F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2B"><unientity>6279</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2C"><unientity>6280</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2D"><unientity>628A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2E"><unientity>626D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 2F"><unientity>627C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 30"><unientity>627E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 31"><unientity>626F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 32"><unientity>6284</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 33"><unientity>6295</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 34"><unientity>6291</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 35"><unientity>6298</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 36"><unientity>626E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 37"><unientity>6273</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 38"><unientity>6293</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 39"><unientity>62C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3A"><unientity>62C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3B"><unientity>62CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3C"><unientity>62A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3D"><unientity>62DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3E"><unientity>62BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 3F"><unientity>62C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 40"><unientity>62B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 41"><unientity>62D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 42"><unientity>62D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 43"><unientity>62DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 44"><unientity>62AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 45"><unientity>62CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 46"><unientity>62D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 47"><unientity>62BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 48"><unientity>62BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 49"><unientity>E93D</unientity><unientityalt>62D0</unientityalt><desc>Variant of 4B4049 which maps to 62D0</desc></character>
-<character hex="21 40 4A"><unientity>62C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 4B"><unientity>62D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 4C"><unientity>62DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 4D"><unientity>62AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 4E"><unientity>62C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 4F"><unientity>62B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 50"><unientity>62D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 51"><unientity>62D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 52"><unientity>62CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 53"><unientity>62B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 54"><unientity>62CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 55"><unientity>62D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 56"><unientity>62C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 57"><unientity>6309</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 58"><unientity>6316</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 59"><unientity>62FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5A"><unientity>62F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5B"><unientity>6308</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5C"><unientity>62ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5D"><unientity>6301</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5E"><unientity>62EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 5F"><unientity>62EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 60"><unientity>62F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 61"><unientity>6307</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 62"><unientity>62F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 63"><unientity>62FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 64"><unientity>6311</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 65"><unientity>62EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 66"><unientity>E93E</unientity><unientityalt>62F4</unientityalt><desc>Variant of 4B4066 which maps to 62F4</desc></character>
-<character hex="21 40 67"><unientity>62FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 69"><unientity>6342</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6A"><unientity>632A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6B"><unientity>6355</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6C"><unientity>633E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6D"><unientity>632F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6E"><unientity>634E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 6F"><unientity>634F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 70"><unientity>6350</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 71"><unientity>6349</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 73"><unientity>632B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 74"><unientity>6328</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 75"><unientity>633A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 76"><unientity>63A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 77"><unientity>6369</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 78"><unientity>63A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 79"><unientity>6396</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 7A"><unientity>63A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 7B"><unientity>6372</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 7C"><unientity>6377</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 7D"><unientity>6383</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 40 7E"><unientity>636B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 21"><unientity>6367</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 22"><unientity>6398</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 23"><unientity>639B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 24"><unientity>63AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 25"><unientity>6371</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 26"><unientity>63A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 27"><unientity>638C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 28"><unientity>6389</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 29"><unientity>63A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2A"><unientity>6399</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2B"><unientity>63A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2C"><unientity>6388</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2D"><unientity>63AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2E"><unientity>633D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 2F"><unientity>6392</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 30"><unientity>63A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 31"><unientity>6376</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 32"><unientity>638F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 33"><unientity>63A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 34"><unientity>637B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 35"><unientity>E93F</unientity><unientityalt>6368</unientityalt><desc>Variant of 4B4135 which maps to 6368</desc></character>
-<character hex="21 41 36"><unientity>6384</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 37"><unientity>6380</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 38"><unientity>63C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 39"><unientity>63C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3A"><unientity>63CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3B"><unientity>63E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3C"><unientity>63C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3D"><unientity>63E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3E"><unientity>63D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 3F"><unientity>63DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 40"><unientity>63D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 41"><unientity>63ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 42"><unientity>63EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 43"><unientity>63CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 44"><unientity>63E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 45"><unientity>63F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 46"><unientity>E940</unientity><unientityalt>63DB</unientityalt><desc>Variant of 454146 which maps to 63DB</desc></character>
-<character hex="21 41 47"><unientity>63D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 48"><unientity>63EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 49"><unientity>641E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4A"><unientity>642A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4B"><unientity>643E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4C"><unientity>6413</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4D"><unientity>640F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4E"><unientity>6414</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 4F"><unientity>640D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 50"><unientity>642D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 51"><unientity>643D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 52"><unientity>6416</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 53"><unientity>6417</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 54"><unientity>641C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 55"><unientity>6436</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 56"><unientity>642C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 57"><unientity>6458</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 58"><unientity>6469</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 59"><unientity>6454</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5A"><unientity>6452</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5B"><unientity>646F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5C"><unientity>6478</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5D"><unientity>6479</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5E"><unientity>647A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 5F"><unientity>645F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 60"><unientity>6451</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 61"><unientity>6467</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 62"><unientity>649E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 63"><unientity>64A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 64"><unientity>6487</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 65"><unientity>6488</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 66"><unientity>64A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 67"><unientity>64B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 68"><unientity>6493</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 69"><unientity>6495</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6A"><unientity>6492</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6B"><unientity>64A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6C"><unientity>6491</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6D"><unientity>64AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6E"><unientity>64B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 6F"><unientity>64AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 70"><unientity>649A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 71"><unientity>64AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 72"><unientity>64AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 73"><unientity>64C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 74"><unientity>64C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 75"><unientity>64D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 76"><unientity>64CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 77"><unientity>64BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 78"><unientity>64C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 79"><unientity>64BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 7A"><unientity>64CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 7B"><unientity>64CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 7C"><unientity>64DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 7D"><unientity>64C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 41 7E"><unientity>64C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 21"><unientity>64CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 22"><unientity>64D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 23"><unientity>64D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 24"><unientity>64BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 25"><unientity>64E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 26"><unientity>64F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 27"><unientity>64E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 28"><unientity>64EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 29"><unientity>64F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2A"><unientity>64F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2B"><unientity>64F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2C"><unientity>6506</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2D"><unientity>6500</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2E"><unientity>64FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 2F"><unientity>64FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 30"><unientity>64FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 31"><unientity>650F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 32"><unientity>6518</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 33"><unientity>6514</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 34"><unientity>6519</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 35"><unientity>651D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 36"><unientity>651C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 37"><unientity>6523</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 38"><unientity>6524</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 39"><unientity>652B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3A"><unientity>652A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3B"><unientity>652C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3C"><unientity>652F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3D"><unientity>6536</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3E"><unientity>6539</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 3F"><unientity>653B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 40"><unientity>653E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 41"><unientity>653F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 42"><unientity>6545</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 43"><unientity>6548</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 44"><unientity>654E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 45"><unientity>6556</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 46"><unientity>6551</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 47"><unientity>6557</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 48"><unientity>655D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 49"><unientity>6558</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4A"><unientity>654F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4B"><unientity>6566</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4C"><unientity>6562</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4D"><unientity>6563</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4E"><unientity>655E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 4F"><unientity>5553</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 50"><unientity>656C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 51"><unientity>6572</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 52"><unientity>6575</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 53"><unientity>6577</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 54"><unientity>6578</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 55"><unientity>6574</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 56"><unientity>6582</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 57"><unientity>6583</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 58"><unientity>6587</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 59"><unientity>6591</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 5A"><unientity>6590</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 5C"><unientity>6599</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 5D"><unientity>659C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 5E"><unientity>659F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 5F"><unientity>65A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 60"><unientity>65A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 61"><unientity>65A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 62"><unientity>65A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 63"><unientity>65AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 64"><unientity>65AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 65"><unientity>65B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 66"><unientity>65B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 67"><unientity>65B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 69"><unientity>65BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6A"><unientity>65C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6B"><unientity>65C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6C"><unientity>65CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6D"><unientity>65CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6E"><unientity>65CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 6F"><unientity>65CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 70"><unientity>65D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 71"><unientity>65D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 72"><unientity>65E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 73"><unientity>65E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 75"><unientity>65E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 76"><unientity>65EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 77"><unientity>65ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 78"><unientity>65E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 79"><unientity>65F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 7A"><unientity>65FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 7B"><unientity>6606</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 7C"><unientity>6614</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 7D"><unientity>660C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 42 7E"><unientity>6600</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 21"><unientity>660E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 22"><unientity>6613</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 23"><unientity>6602</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 24"><unientity>660F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 25"><unientity>6625</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 26"><unientity>6627</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 27"><unientity>662F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 28"><unientity>662D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 29"><unientity>6620</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2A"><unientity>661F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2B"><unientity>6628</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2C"><unientity>664F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2D"><unientity>6642</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2E"><unientity>6652</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 2F"><unientity>6649</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 30"><unientity>6643</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 31"><unientity>664C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 32"><unientity>665D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 33"><unientity>6664</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 34"><unientity>6668</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 35"><unientity>6666</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 36"><unientity>665A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 37"><unientity>666F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 38"><unientity>666E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 39"><unientity>FA12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3A"><unientity>6691</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3B"><unientity>6670</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3C"><unientity>6676</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3D"><unientity>667A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3E"><unientity>6697</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 3F"><unientity>6687</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 40"><unientity>6689</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 41"><unientity>6688</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 42"><unientity>6696</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 43"><unientity>66A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 44"><unientity>66AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 45"><unientity>66B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 46"><unientity>66AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 47"><unientity>66C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 48"><unientity>66C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 49"><unientity>66C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4A"><unientity>66B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4B"><unientity>66D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4C"><unientity>66D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4D"><unientity>66E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4E"><unientity>66DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 4F"><unientity>66E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 50"><unientity>66F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 51"><unientity>66F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 52"><unientity>66F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 53"><unientity>66F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 54"><unientity>66F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 55"><unientity>66F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 56"><unientity>66F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 57"><unientity>52D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 58"><unientity>66FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 59"><unientity>66FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5A"><unientity>6703</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5B"><unientity>6708</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5C"><unientity>6709</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5D"><unientity>670D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5E"><unientity>670B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 5F"><unientity>6717</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 60"><unientity>6715</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 61"><unientity>6714</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 62"><unientity>671B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 63"><unientity>671D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 64"><unientity>671F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 66"><unientity>6727</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 67"><unientity>6728</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 69"><unientity>672C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 6A"><unientity>672B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 6B"><unientity>672A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 6D"><unientity>673D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 6F"><unientity>6731</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 70"><unientity>6735</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 71"><unientity>675E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 72"><unientity>6751</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 73"><unientity>674E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 74"><unientity>675C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 75"><unientity>6750</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 76"><unientity>6756</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 77"><unientity>675F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 78"><unientity>674F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 79"><unientity>6749</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 7B"><unientity>676D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 7C"><unientity>678B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 7D"><unientity>6795</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 43 7E"><unientity>6789</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 21"><unientity>6787</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 22"><unientity>6777</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 23"><unientity>679D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 24"><unientity>6797</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 25"><unientity>676F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 26"><unientity>6771</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 27"><unientity>6773</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 28"><unientity>679C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 29"><unientity>6775</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 2A"><unientity>679A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 2B"><unientity>6790</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 2D"><unientity>677E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 2E"><unientity>67D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 2F"><unientity>67F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 30"><unientity>67FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 31"><unientity>67D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 32"><unientity>67C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 33"><unientity>67AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 34"><unientity>67D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 35"><unientity>67D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 36"><unientity>67EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 37"><unientity>67E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 38"><unientity>67B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 39"><unientity>67EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3A"><unientity>67E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3B"><unientity>67FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3C"><unientity>67DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3D"><unientity>6805</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3E"><unientity>67DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 3F"><unientity>67B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 40"><unientity>67CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 41"><unientity>67F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 42"><unientity>6848</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 43"><unientity>6821</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 44"><unientity>6838</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 45"><unientity>6853</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 46"><unientity>6846</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 47"><unientity>6842</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 48"><unientity>6854</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 49"><unientity>6817</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 4A"><unientity>683D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 4B"><unientity>6851</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 4C"><unientity>6829</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 4D"><unientity>6850</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 4E"><unientity>6839</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 50"><unientity>67F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 51"><unientity>6843</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 52"><unientity>6840</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 53"><unientity>682A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 54"><unientity>6845</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 55"><unientity>683C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 56"><unientity>E941</unientity><unientityalt>6813</unientityalt><desc>Variant of 4B4456 which maps to 6813</desc></character>
-<character hex="21 44 57"><unientity>6881</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 58"><unientity>6893</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 59"><unientity>68AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5A"><unientity>6876</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5B"><unientity>68B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5C"><unientity>68A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5D"><unientity>6897</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5E"><unientity>68B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 5F"><unientity>68B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 60"><unientity>68A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 61"><unientity>687F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 62"><unientity>68B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 63"><unientity>689D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 64"><unientity>68AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 65"><unientity>6886</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 66"><unientity>6885</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 67"><unientity>68A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 68"><unientity>689F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 69"><unientity>6894</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6A"><unientity>6883</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6B"><unientity>68D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6C"><unientity>68FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6D"><unientity>68C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6E"><unientity>68F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 6F"><unientity>68D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 70"><unientity>68E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 71"><unientity>68DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 72"><unientity>68CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 73"><unientity>68EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 74"><unientity>690D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 75"><unientity>6905</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 76"><unientity>68E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 77"><unientity>68E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 78"><unientity>68F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 79"><unientity>68CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 7A"><unientity>68D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 7B"><unientity>68D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 7C"><unientity>6912</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 7D"><unientity>68F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 44 7E"><unientity>68DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 21"><unientity>690E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 22"><unientity>68C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 23"><unientity>6954</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 24"><unientity>6930</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 25"><unientity>6977</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 26"><unientity>6975</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 27"><unientity>695A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 28"><unientity>6960</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 29"><unientity>696B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2A"><unientity>694A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2B"><unientity>6968</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2C"><unientity>695E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2D"><unientity>696D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2E"><unientity>6979</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 2F"><unientity>6953</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 30"><unientity>6986</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 31"><unientity>69A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 32"><unientity>6995</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 33"><unientity>699C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 34"><unientity>6994</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 35"><unientity>69C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 36"><unientity>69B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 37"><unientity>69AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 38"><unientity>699B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 39"><unientity>69CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3A"><unientity>69D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3B"><unientity>69BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3C"><unientity>69AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3D"><unientity>69CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3E"><unientity>69AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 3F"><unientity>69D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 40"><unientity>69CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 41"><unientity>69B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 42"><unientity>6A1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 43"><unientity>69E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 44"><unientity>6A23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 45"><unientity>69EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 46"><unientity>6A01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 47"><unientity>6A19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 48"><unientity>69FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 49"><unientity>6A1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4A"><unientity>6A13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4B"><unientity>6A21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4C"><unientity>69F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4D"><unientity>6A0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4E"><unientity>6A02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 4F"><unientity>6A05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 50"><unientity>6A3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 51"><unientity>6A58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 52"><unientity>6A59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 53"><unientity>6A62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 54"><unientity>6A44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 55"><unientity>6A39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 56"><unientity>6A6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 57"><unientity>6A3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 58"><unientity>6A38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 59"><unientity>6A47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5A"><unientity>6A61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5B"><unientity>6A4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5C"><unientity>6A35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5D"><unientity>6A5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5E"><unientity>6A80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 5F"><unientity>6A94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 60"><unientity>6A84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 61"><unientity>6AA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 62"><unientity>6A9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 63"><unientity>6AB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 64"><unientity>6AB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 65"><unientity>6AC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 66"><unientity>6ABB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 68"><unientity>6AAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 69"><unientity>6AE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6A"><unientity>6ADA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6B"><unientity>6ADD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6C"><unientity>6ADB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6D"><unientity>6AD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6E"><unientity>6B04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 6F"><unientity>6AFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 70"><unientity>6B0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 71"><unientity>6B16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 73"><unientity>6B21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 74"><unientity>6B23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 76"><unientity>6B3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 77"><unientity>6B3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 78"><unientity>6B3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 79"><unientity>6B47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 7A"><unientity>6B49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 7B"><unientity>6B4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 7C"><unientity>6B50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 7D"><unientity>6B59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 45 7E"><unientity>6B5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 21"><unientity>6B61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 23"><unientity>6B63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 24"><unientity>6B64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 25"><unientity>6B65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 27"><unientity>6B66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 28"><unientity>6B6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 29"><unientity>6B72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2A"><unientity>6B77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2B"><unientity>6B78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2C"><unientity>6B79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2D"><unientity>6B7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2E"><unientity>6B7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 2F"><unientity>6B83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 30"><unientity>6B86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 31"><unientity>6B8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 32"><unientity>6B89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 33"><unientity>6B98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 34"><unientity>6B96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 35"><unientity>6BA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 36"><unientity>6BAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 37"><unientity>6BAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 38"><unientity>6BB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 39"><unientity>6BB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3A"><unientity>6BB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3B"><unientity>6BBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3C"><unientity>6BBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3D"><unientity>6BC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3E"><unientity>6BBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 3F"><unientity>6BC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 40"><unientity>6BC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 41"><unientity>6BCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 42"><unientity>6BCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 43"><unientity>6BCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 44"><unientity>6BD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 46"><unientity>6BD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 47"><unientity>6BD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 48"><unientity>6BDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 49"><unientity>6BEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4A"><unientity>6BEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4B"><unientity>6BFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4C"><unientity>6C0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4D"><unientity>6C11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4E"><unientity>6C10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 4F"><unientity>6C13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 50"><unientity>6C16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 51"><unientity>6C1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 52"><unientity>6C1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 53"><unientity>6C27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 54"><unientity>6C26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 55"><unientity>6C23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 56"><unientity>6C28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 57"><unientity>6C24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 58"><unientity>6C2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 59"><unientity>6C2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 5A"><unientity>6C33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 5B"><unientity>E942</unientity><unientityalt>6C2F</unientityalt><desc>Variant of 45465B which maps to 6C2F</desc></character>
-<character hex="21 46 5C"><unientity>6C34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 5D"><unientity>6C38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 5E"><unientity>6C41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 60"><unientity>6C40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 61"><unientity>6C42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 62"><unientity>6C5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 63"><unientity>6C57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 64"><unientity>6C5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 65"><unientity>6C59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 66"><unientity>6C60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 67"><unientity>6C55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 68"><unientity>6C50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 69"><unientity>6C5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 6A"><unientity>6C9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 6B"><unientity>6C81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 6D"><unientity>6C7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 6E"><unientity>6C6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 6F"><unientity>6C8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 70"><unientity>6C90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 71"><unientity>6C72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 72"><unientity>6C70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 73"><unientity>6C68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 74"><unientity>6C96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 76"><unientity>E943</unientity><unientityalt>6C89</unientityalt><desc>Variant of 4B4676 which maps to 6C89</desc></character>
-<character hex="21 46 77"><unientity>6C99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 78"><unientity>6C7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 79"><unientity>6C7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 7A"><unientity>6C92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 7B"><unientity>6C83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 7C"><unientity>6CB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 46 7E"><unientity>6CF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 21"><unientity>6CE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 22"><unientity>6CF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 23"><unientity>6CB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 24"><unientity>6CD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 25"><unientity>6CAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 26"><unientity>6CE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 27"><unientity>6CBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 28"><unientity>6CB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 29"><unientity>6CC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2A"><unientity>6CD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2B"><unientity>6CE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2C"><unientity>6CBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2D"><unientity>6CAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2E"><unientity>6CB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 2F"><unientity>6CF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 30"><unientity>6CC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 31"><unientity>6CBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 32"><unientity>6CC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 33"><unientity>6CD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 34"><unientity>6CBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 35"><unientity>6CDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 36"><unientity>6CE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 37"><unientity>6CBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 38"><unientity>6CCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 39"><unientity>6CCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3A"><unientity>6CC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3B"><unientity>6D41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3C"><unientity>6D0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3D"><unientity>6D32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3E"><unientity>6D25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 3F"><unientity>6D31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 40"><unientity>6D2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 41"><unientity>6D0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 42"><unientity>6D1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 43"><unientity>6D17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 44"><unientity>6D3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 45"><unientity>6D1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 46"><unientity>6D36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 47"><unientity>6D3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 48"><unientity>6D3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 49"><unientity>6D6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4A"><unientity>6D95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4B"><unientity>6D78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4C"><unientity>6D66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4D"><unientity>6D59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4E"><unientity>6D87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 4F"><unientity>6D88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 50"><unientity>6D6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 51"><unientity>6D93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 52"><unientity>6D89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 53"><unientity>6D6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 54"><unientity>6D74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 55"><unientity>6D5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 56"><unientity>6D69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 57"><unientity>6D77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 58"><unientity>6DD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 59"><unientity>6DDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5A"><unientity>6DF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5B"><unientity>6DBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5C"><unientity>6DE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5D"><unientity>6DB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5E"><unientity>6DE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 5F"><unientity>6DD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 60"><unientity>6DAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 61"><unientity>6DF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 62"><unientity>6DC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 63"><unientity>6DCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 64"><unientity>6DC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 65"><unientity>6DDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 66"><unientity>6DAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 67"><unientity>6DB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 68"><unientity>6DFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 69"><unientity>6DF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6A"><unientity>6DCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6B"><unientity>6DF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6C"><unientity>6DB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6D"><unientity>6DD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6E"><unientity>6DF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 6F"><unientity>6DE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 70"><unientity>6DEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 71"><unientity>6DD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 72"><unientity>6DFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 73"><unientity>6DEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 74"><unientity>6DF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 75"><unientity>6D8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 76"><unientity>6DC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 77"><unientity>6DEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 78"><unientity>6DC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 79"><unientity>6E54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 7A"><unientity>6E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 7B"><unientity>6E38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 7C"><unientity>6E32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 7D"><unientity>6E67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 47 7E"><unientity>6E20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 21"><unientity>6E5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 22"><unientity>6E1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 23"><unientity>6E56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 24"><unientity>6E2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 25"><unientity>6E6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 26"><unientity>6E58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 27"><unientity>6E23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 28"><unientity>6E24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 29"><unientity>6E1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2A"><unientity>6E25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2B"><unientity>6E4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2C"><unientity>6E3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2D"><unientity>6E6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2E"><unientity>6E2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 2F"><unientity>6E34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 30"><unientity>6E2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 31"><unientity>6E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 32"><unientity>6E4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 33"><unientity>6E3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 34"><unientity>6E43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 35"><unientity>6E19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 36"><unientity>6E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 37"><unientity>6ED3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 38"><unientity>6EB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 39"><unientity>6EC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 3B"><unientity>6EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 3C"><unientity>6EA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 3D"><unientity>6E9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 3F"><unientity>6EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 40"><unientity>6E98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 41"><unientity>6E90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 42"><unientity>6EC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 43"><unientity>6EC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 44"><unientity>6EBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 45"><unientity>6EAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 46"><unientity>6ED1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 47"><unientity>6ECB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 48"><unientity>6EC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 49"><unientity>6ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4A"><unientity>6EAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4B"><unientity>6E96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4C"><unientity>6E9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4D"><unientity>6F33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4E"><unientity>6EF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 4F"><unientity>6EEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 50"><unientity>6EFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 51"><unientity>6F29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 52"><unientity>6F14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 53"><unientity>6F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 54"><unientity>6F2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 55"><unientity>6F32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 56"><unientity>6F0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 57"><unientity>E944</unientity><unientityalt>6F22</unientityalt><desc>Variant of 4B4857 which maps to 6F22</desc></character>
-<character hex="21 48 58"><unientity>6EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 59"><unientity>6F23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5A"><unientity>6F38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5B"><unientity>6F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5C"><unientity>6F31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5D"><unientity>6F02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5E"><unientity>6F06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 5F"><unientity>6EEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 60"><unientity>6F2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 61"><unientity>6F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 62"><unientity>6F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 63"><unientity>6F3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 64"><unientity>6EF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 65"><unientity>6F01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 66"><unientity>6F11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 67"><unientity>6ECC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 68"><unientity>6F2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 69"><unientity>6F7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6A"><unientity>6F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6B"><unientity>6F84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6C"><unientity>6F51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6D"><unientity>6F64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6E"><unientity>6F97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 6F"><unientity>6F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 70"><unientity>6F7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 71"><unientity>6F86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 72"><unientity>6F8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 73"><unientity>6F6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 74"><unientity>6F5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 75"><unientity>6F6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 76"><unientity>6F78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 77"><unientity>6F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 78"><unientity>6F70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 79"><unientity>6F58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 7A"><unientity>6FC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 7B"><unientity>6FB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 7C"><unientity>6FC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 7D"><unientity>6FA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 48 7E"><unientity>6FA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 21"><unientity>6FA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 22"><unientity>6FC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 24"><unientity>6FC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 25"><unientity>6FB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 26"><unientity>6FDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 27"><unientity>6FD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 28"><unientity>6FF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 29"><unientity>6FE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 2A"><unientity>6FEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 2B"><unientity>E945</unientity><unientityalt>6FEB</unientityalt><desc>Variant of 4B492B which maps to 6FEB</desc></character>
-<character hex="21 49 2C"><unientity>6FE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 2D"><unientity>6FE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 2E"><unientity>6F80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 31"><unientity>700B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 32"><unientity>7009</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 33"><unientity>7006</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 34"><unientity>6FFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 35"><unientity>7011</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 36"><unientity>6FFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 37"><unientity>700F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 38"><unientity>701B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 39"><unientity>701A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 3A"><unientity>7028</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 3B"><unientity>701D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 3C"><unientity>7015</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 3D"><unientity>701F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 3F"><unientity>703E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 40"><unientity>704C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 41"><unientity>7051</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 42"><unientity>7058</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 43"><unientity>7063</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 44"><unientity>7064</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 45"><unientity>706B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 46"><unientity>7070</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 47"><unientity>7076</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 48"><unientity>707C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 49"><unientity>7078</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4A"><unientity>707D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4B"><unientity>7095</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4C"><unientity>708E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4D"><unientity>7092</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4E"><unientity>7099</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 4F"><unientity>708A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 50"><unientity>70AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 51"><unientity>70BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 52"><unientity>70AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 53"><unientity>70B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 54"><unientity>70AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 55"><unientity>70AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 56"><unientity>70AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 57"><unientity>70B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 58"><unientity>70CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 59"><unientity>70E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5A"><unientity>70D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5B"><unientity>70C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5C"><unientity>70D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5D"><unientity>70CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5E"><unientity>70F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 5F"><unientity>7109</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 60"><unientity>710A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 61"><unientity>70FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 62"><unientity>7119</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 63"><unientity>716E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 64"><unientity>711A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 65"><unientity>7136</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 66"><unientity>7121</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 67"><unientity>7130</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 68"><unientity>7126</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 69"><unientity>714E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6A"><unientity>7149</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6B"><unientity>7159</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6C"><unientity>7164</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6D"><unientity>7169</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6E"><unientity>715C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 6F"><unientity>716C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 70"><unientity>7166</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 71"><unientity>7167</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 72"><unientity>715E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 73"><unientity>7165</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 74"><unientity>714C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 75"><unientity>717D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 77"><unientity>7199</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 78"><unientity>718A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 79"><unientity>7184</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 7A"><unientity>719F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 7B"><unientity>71A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 7C"><unientity>71AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 7D"><unientity>71B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 49 7E"><unientity>71D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 21"><unientity>71BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 22"><unientity>71C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 23"><unientity>71D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 24"><unientity>71C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 25"><unientity>71DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 26"><unientity>71D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 27"><unientity>71B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 28"><unientity>71D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 29"><unientity>71CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2A"><unientity>71C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2B"><unientity>71C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2C"><unientity>71EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2D"><unientity>71E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2E"><unientity>71DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 2F"><unientity>71E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 30"><unientity>71ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 31"><unientity>71E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 32"><unientity>71EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 33"><unientity>71F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 34"><unientity>71FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 35"><unientity>7206</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 36"><unientity>720D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 37"><unientity>7210</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 38"><unientity>721B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 39"><unientity>7228</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 3A"><unientity>722A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 3B"><unientity>722D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 3C"><unientity>722C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 3D"><unientity>7230</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 3E"><unientity>E946</unientity><unientityalt>7235</unientityalt><desc>Variant of 4B4A3E which maps to 7235</desc></character>
-<character hex="21 4A 3F"><unientity>7236</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 40"><unientity>7238</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 41"><unientity>7239</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 42"><unientity>723A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 43"><unientity>723B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 44"><unientity>723D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 45"><unientity>723E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 46"><unientity>7246</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 47"><unientity>7247</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 48"><unientity>7248</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 49"><unientity>724C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4A"><unientity>7252</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4B"><unientity>7256</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4C"><unientity>7258</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4D"><unientity>7259</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4E"><unientity>725B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 4F"><unientity>725F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 50"><unientity>725D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 51"><unientity>7262</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 52"><unientity>7261</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 53"><unientity>7260</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 54"><unientity>7267</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 55"><unientity>7269</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 56"><unientity>726F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 57"><unientity>7272</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 58"><unientity>7274</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 59"><unientity>7279</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5A"><unientity>727D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5B"><unientity>7281</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5C"><unientity>7280</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5D"><unientity>7284</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5E"><unientity>7296</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 5F"><unientity>7292</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 60"><unientity>729B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 61"><unientity>72A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 62"><unientity>72A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 63"><unientity>72AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 64"><unientity>72AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 65"><unientity>72C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 66"><unientity>72C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 67"><unientity>72D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 68"><unientity>72C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 69"><unientity>72CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6A"><unientity>72D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6B"><unientity>72D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6C"><unientity>72E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6D"><unientity>72E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6E"><unientity>72E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 6F"><unientity>72FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 70"><unientity>72F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 72"><unientity>72FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 73"><unientity>72F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 74"><unientity>731C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 75"><unientity>731B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 76"><unientity>7313</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 77"><unientity>7316</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 78"><unientity>7319</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 79"><unientity>7336</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 7A"><unientity>7337</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 7B"><unientity>7329</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 7C"><unientity>7325</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 7D"><unientity>7334</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4A 7E"><unientity>7344</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 21"><unientity>733F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 22"><unientity>733E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 23"><unientity>7345</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 24"><unientity>7350</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 26"><unientity>7357</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 27"><unientity>7368</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 28"><unientity>7370</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 29"><unientity>7372</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2A"><unientity>7377</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2B"><unientity>7378</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2C"><unientity>7375</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2D"><unientity>737A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2E"><unientity>737B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 2F"><unientity>7380</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 30"><unientity>7384</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 31"><unientity>7387</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 32"><unientity>7389</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 33"><unientity>738B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 34"><unientity>7396</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 35"><unientity>739F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 36"><unientity>73A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 37"><unientity>73A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 38"><unientity>73AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 39"><unientity>73BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 3A"><unientity>73CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 3B"><unientity>73B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 3C"><unientity>73C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 3E"><unientity>73B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 3F"><unientity>73CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 40"><unientity>73ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 41"><unientity>73EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 42"><unientity>73E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 43"><unientity>7405</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 44"><unientity>7409</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 45"><unientity>7403</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 46"><unientity>740A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 47"><unientity>73FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 48"><unientity>7406</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 49"><unientity>740D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4A"><unientity>743A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4B"><unientity>7435</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4C"><unientity>7436</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4D"><unientity>7434</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4E"><unientity>742A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 4F"><unientity>7433</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 50"><unientity>7422</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 51"><unientity>7425</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 53"><unientity>7455</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 54"><unientity>745F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 55"><unientity>745A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 56"><unientity>7441</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 57"><unientity>743F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 58"><unientity>745B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 59"><unientity>745E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5A"><unientity>745C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5B"><unientity>7459</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5C"><unientity>7483</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5D"><unientity>7469</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5E"><unientity>746A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 5F"><unientity>7463</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 60"><unientity>7464</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 61"><unientity>7470</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 62"><unientity>748B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 63"><unientity>E947</unientity><unientityalt>749C</unientityalt><desc>Variant of 4B4B63 which maps to 749C</desc></character>
-<character hex="21 4B 64"><unientity>74A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 65"><unientity>74A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 66"><unientity>74A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 67"><unientity>74B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 68"><unientity>74A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 69"><unientity>74BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6A"><unientity>74CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6B"><unientity>74CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6C"><unientity>74DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6D"><unientity>74E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6E"><unientity>74E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 6F"><unientity>74E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 70"><unientity>74E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 71"><unientity>74F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 72"><unientity>74F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 73"><unientity>7504</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 74"><unientity>750C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 75"><unientity>7515</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 76"><unientity>7518</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 77"><unientity>751A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 78"><unientity>751C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 79"><unientity>751F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 7A"><unientity>7522</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 7B"><unientity>7526</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 7C"><unientity>7525</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 7D"><unientity>7528</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4B 7E"><unientity>7529</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 21"><unientity>752C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 22"><unientity>752B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 23"><unientity>752D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 24"><unientity>7530</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 25"><unientity>7532</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 26"><unientity>7531</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 27"><unientity>7533</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 28"><unientity>7537</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 29"><unientity>7538</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2A"><unientity>753D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2B"><unientity>754F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2C"><unientity>754C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2D"><unientity>755D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2E"><unientity>755C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 2F"><unientity>7554</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 30"><unientity>755A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 31"><unientity>7559</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 32"><unientity>7566</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 33"><unientity>7562</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 34"><unientity>7570</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 35"><unientity>7565</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 36"><unientity>756B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 37"><unientity>756A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 38"><unientity>7578</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 39"><unientity>7576</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 3A"><unientity>7586</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 3B"><unientity>7587</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 3C"><unientity>758A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 3E"><unientity>758F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 3F"><unientity>7591</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 40"><unientity>759D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 41"><unientity>7599</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 42"><unientity>759A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 43"><unientity>75A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 44"><unientity>75AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 45"><unientity>75A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 46"><unientity>75C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 47"><unientity>75C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 48"><unientity>75B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 49"><unientity>75B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4A"><unientity>75BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4B"><unientity>75BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4C"><unientity>75BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4D"><unientity>75B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4E"><unientity>75D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 4F"><unientity>75D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 50"><unientity>75B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 51"><unientity>E948</unientity><unientityalt>75CA</unientityalt><desc>Variant of 4B4C51 which maps to 75CA</desc></character>
-<character hex="21 4C 52"><unientity>75DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 53"><unientity>75E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 54"><unientity>75D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 55"><unientity>75DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 56"><unientity>75D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 57"><unientity>75E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 58"><unientity>7601</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 59"><unientity>7600</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5A"><unientity>75F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5B"><unientity>75F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5C"><unientity>75F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5D"><unientity>75F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5E"><unientity>75FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 5F"><unientity>75FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 60"><unientity>760D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 61"><unientity>7627</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 62"><unientity>7613</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 63"><unientity>760B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 65"><unientity>7620</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 66"><unientity>7629</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 67"><unientity>761F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 68"><unientity>7624</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 69"><unientity>7626</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6A"><unientity>7621</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6B"><unientity>7634</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6C"><unientity>7638</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6D"><unientity>7646</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6E"><unientity>7642</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 6F"><unientity>764C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 70"><unientity>7656</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 71"><unientity>7658</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 73"><unientity>7662</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 74"><unientity>7665</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 75"><unientity>7669</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 76"><unientity>766E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 77"><unientity>766C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 78"><unientity>7671</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 79"><unientity>E949</unientity><unientityalt>7672</unientityalt><desc>Variant of 4B4C79 which maps to 7672</desc></character>
-<character hex="21 4C 7A"><unientity>7678</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 7B"><unientity>767C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 7C"><unientity>767B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 7D"><unientity>767D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4C 7E"><unientity>767E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 21"><unientity>7682</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 22"><unientity>7684</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 23"><unientity>7687</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 24"><unientity>7686</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 26"><unientity>768E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 27"><unientity>7696</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 28"><unientity>7693</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 29"><unientity>769A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2A"><unientity>76AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2B"><unientity>76B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2C"><unientity>76B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2D"><unientity>76BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2E"><unientity>76BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 2F"><unientity>76C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 31"><unientity>76C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 32"><unientity>76C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 33"><unientity>76CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 34"><unientity>76CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 35"><unientity>76CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 36"><unientity>76D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 37"><unientity>76D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 38"><unientity>76DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 39"><unientity>76DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3A"><unientity>76DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3B"><unientity>76DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3C"><unientity>76E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3D"><unientity>76E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3E"><unientity>76E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 3F"><unientity>76E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 40"><unientity>76E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 41"><unientity>76EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 42"><unientity>76EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 43"><unientity>76EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 44"><unientity>76F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 45"><unientity>76F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 46"><unientity>7709</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 47"><unientity>76F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 48"><unientity>76F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 49"><unientity>7701</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4A"><unientity>770B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4B"><unientity>76FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4C"><unientity>76FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4D"><unientity>7729</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4E"><unientity>7720</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 4F"><unientity>771E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 50"><unientity>7728</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 51"><unientity>7737</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 52"><unientity>773C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 53"><unientity>7736</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 54"><unientity>7738</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 55"><unientity>773A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 56"><unientity>773E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 57"><unientity>774F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 58"><unientity>776B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 59"><unientity>775B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5A"><unientity>776A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5B"><unientity>7766</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5C"><unientity>7779</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5D"><unientity>775E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5E"><unientity>7763</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 5F"><unientity>775C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 60"><unientity>776C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 61"><unientity>7768</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 62"><unientity>7765</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 63"><unientity>777D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 64"><unientity>7771</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 65"><unientity>777F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 66"><unientity>7784</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 67"><unientity>7761</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 68"><unientity>7787</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 69"><unientity>778E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6A"><unientity>778C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6B"><unientity>7791</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6C"><unientity>779F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6D"><unientity>779E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6E"><unientity>77A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 6F"><unientity>77A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 70"><unientity>77B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 71"><unientity>77AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 72"><unientity>77B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 73"><unientity>77AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 74"><unientity>77AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 75"><unientity>77A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 76"><unientity>77BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 77"><unientity>77BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 78"><unientity>77BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 7A"><unientity>77D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 7B"><unientity>77D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 7C"><unientity>77DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 7D"><unientity>77DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4D 7E"><unientity>77DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 21"><unientity>77E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 22"><unientity>77E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 23"><unientity>77E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 24"><unientity>77E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 25"><unientity>77ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 26"><unientity>77EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 27"><unientity>77EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 28"><unientity>77F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 29"><unientity>77FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2A"><unientity>7802</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2B"><unientity>780D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2C"><unientity>780C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2D"><unientity>65AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2E"><unientity>7830</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 2F"><unientity>781D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 30"><unientity>7834</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 31"><unientity>7838</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 32"><unientity>7837</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 33"><unientity>7827</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 34"><unientity>782D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 35"><unientity>7825</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 36"><unientity>786B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 37"><unientity>784F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 38"><unientity>7843</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 39"><unientity>786C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3A"><unientity>785D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3B"><unientity>786F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3C"><unientity>78B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3D"><unientity>7897</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3E"><unientity>788E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 3F"><unientity>7898</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 40"><unientity>7889</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 41"><unientity>7891</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 42"><unientity>787C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 43"><unientity>788C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 44"><unientity>78A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 45"><unientity>78A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 46"><unientity>789F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 47"><unientity>78B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 48"><unientity>78CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 49"><unientity>78BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4A"><unientity>78C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4B"><unientity>78C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4C"><unientity>78BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4D"><unientity>78D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4E"><unientity>78BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 4F"><unientity>78CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 50"><unientity>78D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 51"><unientity>78E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 52"><unientity>78EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 53"><unientity>78DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 54"><unientity>78F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 55"><unientity>78F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 56"><unientity>E94A</unientity><unientityalt>78FA</unientityalt><desc>Variant of 4B4E56 which maps to 78FA</desc></character>
-<character hex="21 4E 57"><unientity>7901</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 58"><unientity>78EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 59"><unientity>790E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5A"><unientity>7919</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5B"><unientity>7926</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5C"><unientity>792C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5D"><unientity>792A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5E"><unientity>792B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 5F"><unientity>793A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 60"><unientity>7940</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 61"><unientity>793E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 62"><unientity>7941</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 63"><unientity>7945</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 64"><unientity>7949</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 65"><unientity>7948</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 66"><unientity>7947</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 67"><unientity>7955</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 68"><unientity>7960</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 69"><unientity>7950</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6A"><unientity>7956</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6B"><unientity>795E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6C"><unientity>795D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6D"><unientity>795F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6E"><unientity>795A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 6F"><unientity>7957</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 70"><unientity>7965</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 71"><unientity>7968</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 72"><unientity>796D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 73"><unientity>797A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 74"><unientity>7981</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 75"><unientity>797F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 76"><unientity>798F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 77"><unientity>798D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 78"><unientity>798E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 79"><unientity>79A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 7A"><unientity>79A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 7B"><unientity>79AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 7C"><unientity>79AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 7D"><unientity>79B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4E 7E"><unientity>79B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 21"><unientity>79BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 22"><unientity>842C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 23"><unientity>79BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 24"><unientity>79C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 25"><unientity>79C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 26"><unientity>79BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 27"><unientity>79C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 28"><unientity>79D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 29"><unientity>79CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2A"><unientity>79D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2B"><unientity>79E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2C"><unientity>79E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2D"><unientity>79E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2E"><unientity>79DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 2F"><unientity>79E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 30"><unientity>79E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 31"><unientity>79FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 32"><unientity>7A05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 33"><unientity>7A0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 34"><unientity>7A08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 35"><unientity>7A0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 36"><unientity>7A00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 37"><unientity>7A1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 39"><unientity>7A20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3A"><unientity>7A1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3B"><unientity>7A14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3C"><unientity>7A31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3D"><unientity>7A2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3E"><unientity>7A3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 3F"><unientity>7A3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 40"><unientity>7A40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 41"><unientity>7A3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 42"><unientity>7A37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 43"><unientity>7A3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 44"><unientity>7A4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 45"><unientity>7A4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 46"><unientity>7A4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 47"><unientity>7A46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 48"><unientity>7A57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 49"><unientity>7A61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4A"><unientity>7A62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4B"><unientity>7A6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4C"><unientity>7A69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4D"><unientity>7A74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4E"><unientity>7A76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 4F"><unientity>7A79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 50"><unientity>7A7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 51"><unientity>7A7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 52"><unientity>7A81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 53"><unientity>7A84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 54"><unientity>7A88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 55"><unientity>7A92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 56"><unientity>7A95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 57"><unientity>7A98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 58"><unientity>7A96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 59"><unientity>7A97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5A"><unientity>7A9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5B"><unientity>7AA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5C"><unientity>7AAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5D"><unientity>7AA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5E"><unientity>7AAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 5F"><unientity>7AAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 60"><unientity>7ABA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 61"><unientity>7AC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 62"><unientity>7AC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 63"><unientity>7AC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 64"><unientity>7ACA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 65"><unientity>7ACB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 66"><unientity>7AD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 67"><unientity>7AE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 68"><unientity>7AE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 69"><unientity>7AED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6A"><unientity>7AEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6B"><unientity>7AF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6C"><unientity>7AF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6D"><unientity>7AFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6E"><unientity>7AFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 6F"><unientity>7AFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 70"><unientity>7B06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 71"><unientity>7B11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 72"><unientity>7B20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 73"><unientity>7B2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 74"><unientity>7B28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 75"><unientity>7B1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 76"><unientity>7B1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 77"><unientity>7B19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 78"><unientity>7B26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 79"><unientity>7B46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 7A"><unientity>7B49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 7B"><unientity>7B50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 7C"><unientity>7B56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 7D"><unientity>7B52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 4F 7E"><unientity>7B4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 21"><unientity>7B4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 22"><unientity>7B4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 23"><unientity>7B54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 24"><unientity>7B60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 25"><unientity>7B77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 26"><unientity>7B75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 27"><unientity>7BA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 28"><unientity>7B94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 29"><unientity>7B95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2A"><unientity>7B9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2B"><unientity>7B8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2C"><unientity>7B97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2D"><unientity>7B8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2E"><unientity>7BC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 2F"><unientity>7BAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 30"><unientity>7BC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 31"><unientity>7BB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 32"><unientity>7BB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 33"><unientity>7BC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 34"><unientity>7BC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 35"><unientity>7BC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 36"><unientity>7C11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 37"><unientity>7BD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 38"><unientity>7BDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 39"><unientity>7BE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3A"><unientity>7BC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3B"><unientity>7BE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3C"><unientity>7BE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3D"><unientity>7C07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3E"><unientity>7C0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 3F"><unientity>7BFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 40"><unientity>7BF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 41"><unientity>7C21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 42"><unientity>7C2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 43"><unientity>7C2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 44"><unientity>7C27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 45"><unientity>7C1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 46"><unientity>7C23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 47"><unientity>7C3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 48"><unientity>7C3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 49"><unientity>7C38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4A"><unientity>7C37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4B"><unientity>7C3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4C"><unientity>7C43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4D"><unientity>7C4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4E"><unientity>7C4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 4F"><unientity>7C50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 50"><unientity>7C60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 51"><unientity>7C5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 52"><unientity>7C64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 53"><unientity>7C6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 54"><unientity>7C6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 55"><unientity>7C72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 56"><unientity>7C73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 57"><unientity>7C89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 58"><unientity>7C92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 59"><unientity>7C97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5A"><unientity>7C9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5B"><unientity>7CA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5C"><unientity>7CA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5D"><unientity>7CB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5E"><unientity>7CB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 5F"><unientity>7CBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 60"><unientity>7CB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 61"><unientity>FA1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 62"><unientity>7CCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 63"><unientity>7CD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 64"><unientity>7CD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 65"><unientity>7CE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 66"><unientity>7CDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 67"><unientity>7CDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 68"><unientity>7CDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 69"><unientity>7CE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 6A"><unientity>7CD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 6B"><unientity>7CE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 6C"><unientity>7CEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 6E"><unientity>7CFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 6F"><unientity>7CFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 70"><unientity>7D00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 71"><unientity>7D02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 72"><unientity>7D05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 73"><unientity>7D09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 74"><unientity>7D04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 75"><unientity>7D07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 76"><unientity>7D21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 77"><unientity>7D0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 78"><unientity>7D0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 79"><unientity>7D20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 7A"><unientity>7D1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 7B"><unientity>7D22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 7C"><unientity>7D15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 7D"><unientity>7D14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 50 7E"><unientity>7D10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 21"><unientity>7D17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 22"><unientity>E94B</unientity><unientityalt>7D0D</unientityalt><desc>Variant of 455122 which maps to 7D0D</desc></character>
-<character hex="21 51 23"><unientity>7D1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 24"><unientity>7D19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 25"><unientity>7D1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 26"><unientity>7D46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 28"><unientity>7D3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 29"><unientity>7D2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2A"><unientity>7D39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2B"><unientity>7D44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2C"><unientity>7D30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2D"><unientity>7D33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2E"><unientity>7D2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 2F"><unientity>7D40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 30"><unientity>7D42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 31"><unientity>7D71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 32"><unientity>7D5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 33"><unientity>7D68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 34"><unientity>7D50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 35"><unientity>7D2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 36"><unientity>7D62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 37"><unientity>7D76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 38"><unientity>7D61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 39"><unientity>7D66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3A"><unientity>7D6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3B"><unientity>7D72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3C"><unientity>7D93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3D"><unientity>7D91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3E"><unientity>7D79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 3F"><unientity>7D8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 40"><unientity>7D81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 41"><unientity>7D9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 42"><unientity>7DBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 43"><unientity>7DB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 44"><unientity>7DCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 45"><unientity>7DBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 46"><unientity>7DB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 47"><unientity>7DBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 48"><unientity>7DB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 49"><unientity>7DB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4A"><unientity>7DBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4B"><unientity>7DB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4C"><unientity>7DA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4D"><unientity>7DA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4E"><unientity>7DAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 4F"><unientity>7DBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 50"><unientity>7DB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 51"><unientity>7DC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 52"><unientity>7DE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 53"><unientity>7DEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 54"><unientity>E94C</unientity><unientityalt>7DF4</unientityalt><desc>Variant of 4B5154 which maps to 7DF4</desc></character>
-<character hex="21 51 55"><unientity>7DD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 56"><unientity>7DD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 57"><unientity>7DEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 58"><unientity>7DDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 59"><unientity>7DE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5A"><unientity>7DE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5B"><unientity>7DE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5C"><unientity>7DDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5D"><unientity>7D9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5E"><unientity>7DDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 5F"><unientity>7E11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 60"><unientity>7E0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 61"><unientity>7E08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 62"><unientity>7E1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 63"><unientity>7DFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 64"><unientity>7E23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 65"><unientity>7E2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 66"><unientity>7E3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 67"><unientity>7E46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 68"><unientity>7E37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 69"><unientity>7E32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6A"><unientity>7E43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6B"><unientity>7E41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6C"><unientity>7E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6D"><unientity>7E3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6E"><unientity>7E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 6F"><unientity>7E45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 70"><unientity>7E55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 71"><unientity>7E54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 72"><unientity>7E61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 73"><unientity>7E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 74"><unientity>7E5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 75"><unientity>7E6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 76"><unientity>7E69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 77"><unientity>7E6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 78"><unientity>7E79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 79"><unientity>7E6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 7A"><unientity>8FAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 7B"><unientity>7E7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 7C"><unientity>7E82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 7D"><unientity>7E7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 51 7E"><unientity>7E8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 21"><unientity>7E8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 22"><unientity>7E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 23"><unientity>7E96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 24"><unientity>7E9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 26"><unientity>7F38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 27"><unientity>7F3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 28"><unientity>7F3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 29"><unientity>7F44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 2B"><unientity>7F50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 2C"><unientity>7F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 2D"><unientity>7F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 2E"><unientity>7F5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 2F"><unientity>7F72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 30"><unientity>7F6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 31"><unientity>7F69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 32"><unientity>7F6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 33"><unientity>7F70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 34"><unientity>7F75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 35"><unientity>7F77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 36"><unientity>7F79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 37"><unientity>7F85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 38"><unientity>7F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 39"><unientity>7F8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3A"><unientity>7F8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3B"><unientity>7F8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3C"><unientity>7F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3D"><unientity>7F9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3E"><unientity>7F9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 3F"><unientity>5584</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 40"><unientity>7FA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 41"><unientity>7FA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 42"><unientity>7FA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 43"><unientity>7FAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 44"><unientity>7FB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 45"><unientity>7FB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 46"><unientity>7FB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 47"><unientity>7FB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 48"><unientity>7FBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 49"><unientity>7FBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 4A"><unientity>7FC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 4B"><unientity>7FC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 4C"><unientity>7FCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 4D"><unientity>7FD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 4E"><unientity>E94D</unientity><unientityalt>7FCE</unientityalt><desc>Variant of 4B524E which maps to 7FCE</desc></character>
-<character hex="21 52 4F"><unientity>7FD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 50"><unientity>7FD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 51"><unientity>7FE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 52"><unientity>7FE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 53"><unientity>7FDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 54"><unientity>7FE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 55"><unientity>7FF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 56"><unientity>7FF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 57"><unientity>7FFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 58"><unientity>7FF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 59"><unientity>7FFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5A"><unientity>7FF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5B"><unientity>8000</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5C"><unientity>8001</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5D"><unientity>8003</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5E"><unientity>8006</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 5F"><unientity>8005</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 60"><unientity>800C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 61"><unientity>8010</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 62"><unientity>800D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 63"><unientity>8012</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 64"><unientity>8015</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 65"><unientity>8018</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 66"><unientity>8019</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 67"><unientity>8017</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 68"><unientity>801C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 69"><unientity>8033</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6A"><unientity>8036</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6B"><unientity>803F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6C"><unientity>803D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6D"><unientity>804A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6E"><unientity>8046</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 6F"><unientity>8056</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 70"><unientity>8058</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 71"><unientity>805E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 72"><unientity>805A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 73"><unientity>8071</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 74"><unientity>8072</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 75"><unientity>8073</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 76"><unientity>8070</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 77"><unientity>806F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 78"><unientity>8077</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 79"><unientity>8076</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 7A"><unientity>807E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 7B"><unientity>807D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 7C"><unientity>807F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 52 7E"><unientity>8084</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 21"><unientity>8085</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 22"><unientity>8087</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 23"><unientity>8089</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 24"><unientity>808B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 25"><unientity>808C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 26"><unientity>8093</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 27"><unientity>809D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 28"><unientity>8098</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 29"><unientity>809B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2A"><unientity>809A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2B"><unientity>8096</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2C"><unientity>80B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2D"><unientity>80AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2E"><unientity>80BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 2F"><unientity>80A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 30"><unientity>80A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 31"><unientity>80AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 32"><unientity>80B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 33"><unientity>80AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 34"><unientity>80A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 35"><unientity>80A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 36"><unientity>80B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 37"><unientity>80D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 38"><unientity>80CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 39"><unientity>80E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3A"><unientity>80DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3B"><unientity>80E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3C"><unientity>80C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3D"><unientity>80DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3E"><unientity>80C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 3F"><unientity>80CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 40"><unientity>80DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 41"><unientity>80E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 42"><unientity>80F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 43"><unientity>8102</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 44"><unientity>8105</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 45"><unientity>80F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 46"><unientity>80F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 47"><unientity>80ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 48"><unientity>80FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 49"><unientity>8106</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4A"><unientity>80F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4B"><unientity>80F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4C"><unientity>810A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4D"><unientity>8108</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4E"><unientity>812B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 4F"><unientity>812F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 50"><unientity>8116</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 52"><unientity>8129</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 53"><unientity>8155</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 54"><unientity>8154</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 55"><unientity>814B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 56"><unientity>8151</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 57"><unientity>8150</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 58"><unientity>814E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 59"><unientity>8139</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5A"><unientity>8146</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5B"><unientity>813E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5C"><unientity>8171</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5D"><unientity>8170</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5E"><unientity>8178</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 5F"><unientity>8165</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 60"><unientity>816E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 61"><unientity>8173</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 62"><unientity>816B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 63"><unientity>8179</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 64"><unientity>817A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 65"><unientity>8166</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 66"><unientity>8180</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 67"><unientity>818F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 68"><unientity>817F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 69"><unientity>818A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6A"><unientity>8188</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6B"><unientity>819D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6C"><unientity>81A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6D"><unientity>819B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6E"><unientity>819A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 6F"><unientity>819C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 70"><unientity>81B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 71"><unientity>81A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 72"><unientity>81A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 73"><unientity>81C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 74"><unientity>81BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 75"><unientity>81C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 76"><unientity>81C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 77"><unientity>81C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 78"><unientity>81BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 79"><unientity>81BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 7A"><unientity>81C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 7B"><unientity>81BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 7C"><unientity>81CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 7D"><unientity>81CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 53 7E"><unientity>81D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 21"><unientity>81DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 22"><unientity>81DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 23"><unientity>81E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 24"><unientity>81E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 25"><unientity>81E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 26"><unientity>81EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 27"><unientity>81EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 28"><unientity>81ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 29"><unientity>81F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 2B"><unientity>81FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 2C"><unientity>81FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 2D"><unientity>81FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 2E"><unientity>81FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 2F"><unientity>8200</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 30"><unientity>8202</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 31"><unientity>8205</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 32"><unientity>8207</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 33"><unientity>8208</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 34"><unientity>8209</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 35"><unientity>820A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 36"><unientity>820C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 37"><unientity>820D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 38"><unientity>8210</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 39"><unientity>8212</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3A"><unientity>8214</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3B"><unientity>821B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3C"><unientity>821C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3D"><unientity>821E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3E"><unientity>821F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 3F"><unientity>8222</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 40"><unientity>822A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 41"><unientity>822B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 42"><unientity>822C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 43"><unientity>8228</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 44"><unientity>8237</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 45"><unientity>8235</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 46"><unientity>8239</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 47"><unientity>8236</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 48"><unientity>8247</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 49"><unientity>8258</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4A"><unientity>8259</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4B"><unientity>8266</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4C"><unientity>826E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4D"><unientity>826F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4E"><unientity>8271</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 4F"><unientity>8272</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 50"><unientity>827E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 51"><unientity>8292</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 52"><unientity>828B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 53"><unientity>828D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 54"><unientity>82B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 55"><unientity>829D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 56"><unientity>8299</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 57"><unientity>82BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 58"><unientity>82AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 59"><unientity>82AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 5A"><unientity>82A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 5B"><unientity>829F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 5C"><unientity>82BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 5D"><unientity>82B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 5E"><unientity>82B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 60"><unientity>82E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 61"><unientity>8305</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 62"><unientity>8309</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 63"><unientity>82E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 64"><unientity>82DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 65"><unientity>82E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 66"><unientity>8304</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 67"><unientity>82E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 68"><unientity>8302</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 69"><unientity>82DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6A"><unientity>82D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6B"><unientity>82F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6C"><unientity>8301</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6D"><unientity>82D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6E"><unientity>82D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 6F"><unientity>82D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 70"><unientity>82DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 71"><unientity>82DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 72"><unientity>832B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 73"><unientity>8352</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 74"><unientity>834A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 75"><unientity>8338</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 76"><unientity>8354</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 77"><unientity>8350</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 78"><unientity>8349</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 79"><unientity>8335</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 7A"><unientity>8334</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 7B"><unientity>8336</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 7C"><unientity>8331</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 7D"><unientity>8340</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 54 7E"><unientity>8317</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 21"><unientity>5179</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 22"><unientity>834F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 23"><unientity>8339</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 24"><unientity>838E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 25"><unientity>8398</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 26"><unientity>839E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 27"><unientity>8378</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 28"><unientity>83A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 29"><unientity>8396</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 2A"><unientity>83A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 2B"><unientity>83AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 2C"><unientity>E94E</unientity><unientityalt>8392</unientityalt><desc>Variant of 4B552C which maps to 8392</desc></character>
-<character hex="21 55 2D"><unientity>838A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 2E"><unientity>8393</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 2F"><unientity>83A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 30"><unientity>8389</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 31"><unientity>8377</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 32"><unientity>837C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 33"><unientity>837B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 34"><unientity>840D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 35"><unientity>83E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 36"><unientity>83E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 38"><unientity>8403</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 39"><unientity>83C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 3A"><unientity>83C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 3B"><unientity>840B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 3C"><unientity>83EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 3E"><unientity>83F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 3F"><unientity>83BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 41"><unientity>840A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 42"><unientity>840C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 43"><unientity>83CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 44"><unientity>83DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 45"><unientity>83CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 46"><unientity>83F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 47"><unientity>840E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 48"><unientity>8404</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 49"><unientity>843D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4A"><unientity>8482</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4B"><unientity>8431</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4C"><unientity>8475</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4D"><unientity>8466</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4E"><unientity>8457</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 4F"><unientity>8449</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 50"><unientity>846C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 51"><unientity>846B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 52"><unientity>845B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 53"><unientity>8477</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 54"><unientity>843C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 55"><unientity>8435</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 56"><unientity>8461</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 57"><unientity>8463</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 58"><unientity>8469</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 59"><unientity>8438</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5A"><unientity>84B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5B"><unientity>849E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5C"><unientity>84BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5D"><unientity>84C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5E"><unientity>84C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 5F"><unientity>84C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 60"><unientity>849C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 61"><unientity>84CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 62"><unientity>84B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 63"><unientity>84C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 64"><unientity>8499</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 65"><unientity>84D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 66"><unientity>8490</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 67"><unientity>84BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 68"><unientity>853D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 69"><unientity>84FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6A"><unientity>8517</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6B"><unientity>851A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6C"><unientity>84EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6D"><unientity>852C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6E"><unientity>852D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 6F"><unientity>8513</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 71"><unientity>8523</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 72"><unientity>8521</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 73"><unientity>8514</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 74"><unientity>84EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 75"><unientity>8525</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 76"><unientity>8569</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 77"><unientity>854A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 78"><unientity>8559</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 79"><unientity>8548</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 7A"><unientity>8568</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 7B"><unientity>8543</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 7C"><unientity>856A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 7D"><unientity>8549</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 55 7E"><unientity>8584</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 21"><unientity>85AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 22"><unientity>856D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 23"><unientity>859B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 24"><unientity>8591</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 25"><unientity>857E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 26"><unientity>8594</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 27"><unientity>859C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 28"><unientity>8587</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 29"><unientity>E94F</unientity><unientityalt>85CD</unientityalt><desc>Variant of 4B5629 which maps to 85CD</desc></character>
-<character hex="21 56 2A"><unientity>85A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 2B"><unientity>85CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 2C"><unientity>85AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 2D"><unientity>85D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 2E"><unientity>85C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 2F"><unientity>85B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 30"><unientity>85E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 31"><unientity>85DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 32"><unientity>85EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 33"><unientity>85E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 34"><unientity>85D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 35"><unientity>85E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 36"><unientity>85FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 37"><unientity>85F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 38"><unientity>8611</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 39"><unientity>85FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3A"><unientity>8606</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3B"><unientity>860B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3C"><unientity>8607</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3D"><unientity>860A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3E"><unientity>862D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 3F"><unientity>8617</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 40"><unientity>861A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 41"><unientity>8638</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 42"><unientity>863F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 43"><unientity>864E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 44"><unientity>8650</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 45"><unientity>8654</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 46"><unientity>5F6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 47"><unientity>8655</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 48"><unientity>865C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 49"><unientity>865B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 4A"><unientity>865F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 4B"><unientity>865E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 4C"><unientity>8667</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 4F"><unientity>8679</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 50"><unientity>86A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 51"><unientity>86AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 52"><unientity>868A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 53"><unientity>8693</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 54"><unientity>86A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 55"><unientity>868C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 56"><unientity>86A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 57"><unientity>86C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 58"><unientity>86C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 59"><unientity>86B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5A"><unientity>86CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5B"><unientity>86B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5C"><unientity>86C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5D"><unientity>86C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5E"><unientity>86B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 5F"><unientity>86AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 60"><unientity>86DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 61"><unientity>86D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 62"><unientity>86ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 63"><unientity>86D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 64"><unientity>86DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 65"><unientity>86E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 66"><unientity>86FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 67"><unientity>86F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 68"><unientity>8707</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 69"><unientity>8703</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6A"><unientity>8708</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6B"><unientity>8700</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6C"><unientity>86FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6D"><unientity>8713</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6E"><unientity>8702</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 6F"><unientity>871C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 70"><unientity>873F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 71"><unientity>873B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 72"><unientity>8722</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 73"><unientity>8725</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 74"><unientity>8734</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 75"><unientity>8718</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 76"><unientity>8755</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 77"><unientity>8760</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 78"><unientity>8776</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 79"><unientity>8774</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 7A"><unientity>8766</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 7B"><unientity>8778</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 7C"><unientity>8768</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 7D"><unientity>874C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 56 7E"><unientity>8757</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 21"><unientity>8759</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 22"><unientity>8783</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 23"><unientity>8782</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 24"><unientity>87A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 25"><unientity>879E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 26"><unientity>878D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 27"><unientity>879F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 28"><unientity>87D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 29"><unientity>87C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2A"><unientity>87AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2B"><unientity>87B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2C"><unientity>87BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2D"><unientity>87C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2E"><unientity>87D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 2F"><unientity>87BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 30"><unientity>87C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 31"><unientity>87CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 32"><unientity>87EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 33"><unientity>87F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 34"><unientity>87EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 35"><unientity>87FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 36"><unientity>8805</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 37"><unientity>880D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 38"><unientity>87F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 39"><unientity>8814</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3A"><unientity>8815</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3B"><unientity>8822</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3C"><unientity>8823</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3D"><unientity>8821</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3E"><unientity>881F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 3F"><unientity>8831</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 40"><unientity>8839</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 41"><unientity>8836</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 42"><unientity>883B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 43"><unientity>8840</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 44"><unientity>884C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 45"><unientity>884D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 46"><unientity>E950</unientity><unientityalt>8853</unientityalt><desc>Variant of 4B5746 which maps to 8853</desc></character>
-<character hex="21 57 47"><unientity>8857</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 48"><unientity>8859</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 49"><unientity>885B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4A"><unientity>885D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4B"><unientity>8861</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4C"><unientity>8862</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4D"><unientity>8863</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4E"><unientity>521D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 4F"><unientity>8868</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 50"><unientity>886B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 51"><unientity>8882</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 52"><unientity>8881</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 53"><unientity>8870</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 54"><unientity>8877</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 55"><unientity>8888</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 56"><unientity>88AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 57"><unientity>8892</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 58"><unientity>8896</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 59"><unientity>888D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5A"><unientity>888B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5B"><unientity>889E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5C"><unientity>88C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5D"><unientity>88C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5E"><unientity>88B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 5F"><unientity>88DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 60"><unientity>88D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 61"><unientity>88D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 62"><unientity>88DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 63"><unientity>88CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 64"><unientity>88D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 65"><unientity>88DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 66"><unientity>88D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 67"><unientity>8902</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 68"><unientity>88F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 69"><unientity>88F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6A"><unientity>88F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6B"><unientity>88F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6C"><unientity>88FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6D"><unientity>88E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6E"><unientity>891A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 6F"><unientity>8910</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 71"><unientity>8913</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 72"><unientity>8912</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 73"><unientity>8932</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 74"><unientity>892A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 75"><unientity>8925</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 76"><unientity>892B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 77"><unientity>893B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 78"><unientity>8936</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 79"><unientity>8938</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 7A"><unientity>8944</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 7B"><unientity>895F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 7C"><unientity>8960</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 7D"><unientity>8956</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 57 7E"><unientity>8964</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 21"><unientity>896A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 22"><unientity>896F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 23"><unientity>8972</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 24"><unientity>897F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 25"><unientity>8981</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 26"><unientity>8983</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 28"><unientity>898B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 29"><unientity>898F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2A"><unientity>8993</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2B"><unientity>8996</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2C"><unientity>89AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2D"><unientity>89A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2E"><unientity>89AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 2F"><unientity>89B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 30"><unientity>89BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 31"><unientity>89BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 32"><unientity>89C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 33"><unientity>89D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 34"><unientity>89E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 35"><unientity>89F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 36"><unientity>89F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 37"><unientity>8A00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 38"><unientity>8A08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 39"><unientity>8A02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3A"><unientity>8A03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3B"><unientity>8A10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3C"><unientity>8A18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3D"><unientity>8A0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3E"><unientity>8A0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 3F"><unientity>8A15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 40"><unientity>8A0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 41"><unientity>8A16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 42"><unientity>8A17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 43"><unientity>8A13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 44"><unientity>8A2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 45"><unientity>8A23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 46"><unientity>8A1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 47"><unientity>8A25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 48"><unientity>8A31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 49"><unientity>8A2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4A"><unientity>8A1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4B"><unientity>8A1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4C"><unientity>8A3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4D"><unientity>8A60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4E"><unientity>8A55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 4F"><unientity>8A5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 51"><unientity>8A41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 52"><unientity>8A54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 53"><unientity>8A5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 54"><unientity>8A50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 55"><unientity>8A46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 56"><unientity>8A34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 57"><unientity>8A3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 58"><unientity>8A6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 59"><unientity>8A72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5A"><unientity>8A73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5B"><unientity>8A66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5C"><unientity>8A69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5D"><unientity>8A70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5E"><unientity>8A63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 5F"><unientity>8A7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 60"><unientity>8AA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 61"><unientity>8A87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 62"><unientity>8A85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 63"><unientity>8A6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 64"><unientity>8A79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 65"><unientity>8A62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 66"><unientity>8A71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 67"><unientity>8A6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 68"><unientity>8A6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 69"><unientity>8AAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6A"><unientity>8AA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6B"><unientity>8AA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6C"><unientity>8A9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6D"><unientity>8A8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6E"><unientity>8A93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 6F"><unientity>8AA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 70"><unientity>8A8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 71"><unientity>E951</unientity><unientityalt>8AA4</unientityalt><desc>Variant of 4B5871 which maps to 8AA4</desc></character>
-<character hex="21 58 72"><unientity>8AA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 73"><unientity>8AA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 74"><unientity>8A98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 75"><unientity>8A91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 76"><unientity>8ABC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 77"><unientity>8AC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 78"><unientity>8AD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 79"><unientity>8AC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 7A"><unientity>E952</unientity><unientityalt>8ACB</unientityalt><desc>Variant of 4B587A which maps to 8ACB</desc></character>
-<character hex="21 58 7B"><unientity>8AF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 7C"><unientity>8AB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 7D"><unientity>8ABF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 58 7E"><unientity>8AC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 21"><unientity>8AC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 22"><unientity>8AB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 23"><unientity>8A95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 24"><unientity>8AD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 25"><unientity>8AE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 26"><unientity>8AFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 27"><unientity>8AEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 28"><unientity>8AF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 29"><unientity>8AE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 2A"><unientity>8ADC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 2B"><unientity>8B00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 2C"><unientity>E953</unientity><unientityalt>8B01</unientityalt><desc>Variant of 2D592C which maps to 8B01</desc></character>
-<character hex="21 59 2D"><unientity>8B02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 2E"><unientity>8AFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 2F"><unientity>8AF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 30"><unientity>8AED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 31"><unientity>8B17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 32"><unientity>8B19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 33"><unientity>8B0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 34"><unientity>8B1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 35"><unientity>8B0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 36"><unientity>8B21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 37"><unientity>8B04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 38"><unientity>8B1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 39"><unientity>8B39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3A"><unientity>8B2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3B"><unientity>8B28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3C"><unientity>8B58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3D"><unientity>8B5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3E"><unientity>8B4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 3F"><unientity>8B49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 40"><unientity>8B5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 41"><unientity>8B41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 42"><unientity>8B4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 43"><unientity>8B70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 44"><unientity>8B6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 45"><unientity>8B66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 46"><unientity>8B6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 47"><unientity>8B74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 48"><unientity>8B77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 49"><unientity>8B7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4A"><unientity>8B80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4B"><unientity>8B8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4C"><unientity>8B93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4D"><unientity>8B96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4E"><unientity>8B92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 4F"><unientity>8B9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 51"><unientity>8C41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 52"><unientity>8C3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 53"><unientity>8C46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 54"><unientity>8C48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 55"><unientity>8C49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 56"><unientity>8C4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 57"><unientity>8C4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 58"><unientity>8C50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 59"><unientity>8C54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 5A"><unientity>8C5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 5C"><unientity>8C62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 5D"><unientity>8C6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 5E"><unientity>8C6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 5F"><unientity>8C6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 60"><unientity>8C7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 61"><unientity>8C79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 62"><unientity>8C82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 63"><unientity>8C8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 64"><unientity>8C89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 65"><unientity>8C8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 66"><unientity>8C8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 67"><unientity>8C93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 68"><unientity>8C9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 69"><unientity>8C9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6A"><unientity>8CA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6B"><unientity>8CA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6C"><unientity>8CA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6D"><unientity>8CAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6E"><unientity>8CAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 6F"><unientity>8CA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 70"><unientity>8CAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 71"><unientity>8CA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 72"><unientity>8CA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 73"><unientity>8CAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 75"><unientity>8CBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 76"><unientity>8CC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 77"><unientity>8CC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 78"><unientity>8CB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 79"><unientity>8CBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 7A"><unientity>8CB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 7B"><unientity>8CB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 7C"><unientity>8CBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 7D"><unientity>8CB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 59 7E"><unientity>8CBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 21"><unientity>8CC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 22"><unientity>8CC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 23"><unientity>8CCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 24"><unientity>8CC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 25"><unientity>8CC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 26"><unientity>8CB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 27"><unientity>8CC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 28"><unientity>8CC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 29"><unientity>8CD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 2A"><unientity>8CD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 2B"><unientity>8CD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 2C"><unientity>8CE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 2D"><unientity>8CE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 2F"><unientity>8CE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 30"><unientity>8CE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 31"><unientity>8CE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 32"><unientity>8CDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 33"><unientity>8CDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 34"><unientity>8CEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 35"><unientity>8CED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 36"><unientity>8CF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 37"><unientity>8CFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 38"><unientity>8CFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 39"><unientity>8D05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 3A"><unientity>8CFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 3B"><unientity>E954</unientity><unientityalt>8D08</unientityalt><desc>Variant of 4B5A3B which maps to 8D08</desc></character>
-<character hex="21 5A 3C"><unientity>8D0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 3D"><unientity>8D0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 3E"><unientity>8D0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 3F"><unientity>8D0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 40"><unientity>8D13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 41"><unientity>8D16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 42"><unientity>8D1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 43"><unientity>8D64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 44"><unientity>8D67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 45"><unientity>8D66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 46"><unientity>8D6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 47"><unientity>8D6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 48"><unientity>8D70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 49"><unientity>8D74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4A"><unientity>8D73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4B"><unientity>8D77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4C"><unientity>8D85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4D"><unientity>8D8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4E"><unientity>8D81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 4F"><unientity>8D99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 50"><unientity>8D95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 51"><unientity>8DA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 52"><unientity>8D9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 53"><unientity>8DA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 54"><unientity>8DB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 55"><unientity>8DB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 56"><unientity>8DBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 57"><unientity>8DCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 58"><unientity>8DDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 59"><unientity>8DDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5A"><unientity>8DCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5B"><unientity>8DDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5C"><unientity>8DC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5D"><unientity>8DD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5E"><unientity>8DCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 5F"><unientity>8DE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 60"><unientity>8DDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 61"><unientity>8DE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 62"><unientity>8DF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 63"><unientity>8DFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 64"><unientity>8DEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 65"><unientity>8DEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 66"><unientity>8DFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 67"><unientity>8E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 68"><unientity>8E10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 69"><unientity>8E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6A"><unientity>8E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6B"><unientity>8E0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6C"><unientity>8E29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6D"><unientity>8E1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6E"><unientity>8E44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 6F"><unientity>8E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 70"><unientity>8E42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 71"><unientity>8E34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 72"><unientity>8E39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 73"><unientity>8E35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 74"><unientity>8E49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 75"><unientity>8E4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 76"><unientity>8E48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 77"><unientity>8E4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 78"><unientity>8E63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 79"><unientity>8E59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 7A"><unientity>8E66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 7B"><unientity>8E64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 7C"><unientity>8E72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 7D"><unientity>8E6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5A 7E"><unientity>8E7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 21"><unientity>8E76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 22"><unientity>8E7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 23"><unientity>8E82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 24"><unientity>8E81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 25"><unientity>8E87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 26"><unientity>8E89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 27"><unientity>8E85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 28"><unientity>8E8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 29"><unientity>E955</unientity><unientityalt>8E8D</unientityalt><desc>Variant of 4B5B29 which maps to 8E8D</desc></character>
-<character hex="21 5B 2A"><unientity>8E91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 2B"><unientity>8EA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 2C"><unientity>8EAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 2D"><unientity>8EAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 2E"><unientity>8EAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 2F"><unientity>8EB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 30"><unientity>8EBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 31"><unientity>8EC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 32"><unientity>8ECA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 33"><unientity>8ECB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 34"><unientity>8ECD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 35"><unientity>8ECC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 36"><unientity>8ED2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 37"><unientity>8ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 38"><unientity>8EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 39"><unientity>8EDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3A"><unientity>8EFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3B"><unientity>8EF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3C"><unientity>8EFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3D"><unientity>8F03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3E"><unientity>8EFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 3F"><unientity>8F09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 40"><unientity>8F0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 41"><unientity>8F14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 42"><unientity>8F12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 43"><unientity>8F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 44"><unientity>8F13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 45"><unientity>8F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 46"><unientity>8F1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 47"><unientity>8F1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 48"><unientity>8F1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 49"><unientity>8F29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4A"><unientity>8F2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4B"><unientity>8F1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4C"><unientity>8F3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4D"><unientity>8F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4E"><unientity>8F38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 4F"><unientity>8F44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 50"><unientity>8F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 51"><unientity>8F45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 52"><unientity>E956</unientity><unientityalt>8F42</unientityalt><desc>Variant of 4B5B52 which maps to 8F42</desc></character>
-<character hex="21 5B 53"><unientity>8F3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 54"><unientity>8F4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 55"><unientity>8F49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 56"><unientity>8F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 57"><unientity>8F4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 58"><unientity>8F5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 59"><unientity>8F61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5A"><unientity>8F9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5B"><unientity>8F9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5C"><unientity>8F9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5D"><unientity>8FA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5E"><unientity>8FA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 5F"><unientity>8FA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 60"><unientity>8FAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 61"><unientity>8FAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 62"><unientity>8FB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 63"><unientity>8FB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 64"><unientity>8FB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 66"><unientity>8FC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 67"><unientity>8FC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 68"><unientity>8FC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 69"><unientity>5DE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 6A"><unientity>8FCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 6B"><unientity>8FD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 6C"><unientity>8FD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 6D"><unientity>E957</unientity><unientityalt>8FF0</unientityalt><desc>Variant of 275B6D which maps to 8FF0</desc></character>
-<character hex="21 5B 6E"><unientity>8FE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 6F"><unientity>8FE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 70"><unientity>8FEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 71"><unientity>8FE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 73"><unientity>8FEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 74"><unientity>9001</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 75"><unientity>9006</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 76"><unientity>8FF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 77"><unientity>9000</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 7A"><unientity>9003</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 7B"><unientity>8FFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 7C"><unientity>9005</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 7D"><unientity>9019</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5B 7E"><unientity>9023</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 21"><unientity>901F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 22"><unientity>9017</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 23"><unientity>901D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 24"><unientity>9010</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 26"><unientity>900D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 27"><unientity>901E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 28"><unientity>901A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 29"><unientity>9020</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2A"><unientity>900F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2B"><unientity>9022</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2C"><unientity>9016</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2D"><unientity>901B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2E"><unientity>9014</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 2F"><unientity>902E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 30"><unientity>9035</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 31"><unientity>9031</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 32"><unientity>FA25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 33"><unientity>9032</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 34"><unientity>904B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 36"><unientity>9053</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 37"><unientity>9042</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 38"><unientity>9050</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 39"><unientity>9054</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3A"><unientity>9055</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3B"><unientity>903C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3C"><unientity>9047</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3D"><unientity>904F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3E"><unientity>904E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 3F"><unientity>904D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 40"><unientity>9051</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 41"><unientity>9041</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 42"><unientity>903E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 43"><unientity>9058</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 44"><unientity>9060</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 45"><unientity>905C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 46"><unientity>9063</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 47"><unientity>9065</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 48"><unientity>905E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 49"><unientity>9069</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4A"><unientity>906E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4B"><unientity>9068</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4C"><unientity>906D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4D"><unientity>9075</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4E"><unientity>9074</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 4F"><unientity>9078</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 50"><unientity>9072</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 51"><unientity>9077</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 52"><unientity>907C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 53"><unientity>907A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 54"><unientity>907F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 55"><unientity>907D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 56"><unientity>9081</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 57"><unientity>9084</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 58"><unientity>9082</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 59"><unientity>9080</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5A"><unientity>9087</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5B"><unientity>908A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5C"><unientity>9090</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5D"><unientity>908F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5E"><unientity>9091</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 5F"><unientity>9095</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 60"><unientity>90A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 61"><unientity>90A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 62"><unientity>90AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 63"><unientity>90A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 64"><unientity>90B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 65"><unientity>90B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 66"><unientity>90B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 67"><unientity>90CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 68"><unientity>90CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6A"><unientity>90E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6B"><unientity>90E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6C"><unientity>90ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6D"><unientity>90F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6E"><unientity>90FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 6F"><unientity>9102</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 70"><unientity>9109</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 71"><unientity>9112</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 72"><unientity>9119</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 73"><unientity>912D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 74"><unientity>9130</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 75"><unientity>9127</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 76"><unientity>9131</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 77"><unientity>E958</unientity><unientityalt>9139</unientityalt><desc>Variant of 4B5C77 which maps to 9139</desc></character>
-<character hex="21 5C 78"><unientity>9149</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 79"><unientity>914B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 7A"><unientity>914A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 7B"><unientity>9152</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 7C"><unientity>914D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 7D"><unientity>914C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5C 7E"><unientity>9157</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 21"><unientity>9163</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 22"><unientity>9165</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 23"><unientity>916C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 24"><unientity>9169</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 25"><unientity>916A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 26"><unientity>9175</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 27"><unientity>9178</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 28"><unientity>9177</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 29"><unientity>9187</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2A"><unientity>9189</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2B"><unientity>918B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2C"><unientity>9183</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2D"><unientity>9192</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2E"><unientity>91A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 2F"><unientity>919E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 30"><unientity>919C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 31"><unientity>91AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 32"><unientity>91AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 33"><unientity>91BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 34"><unientity>91C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 35"><unientity>91C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 36"><unientity>91C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 37"><unientity>91C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 38"><unientity>91CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3A"><unientity>91CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3B"><unientity>91CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3C"><unientity>91CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3D"><unientity>91D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3E"><unientity>91D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 3F"><unientity>91DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 40"><unientity>91D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 41"><unientity>91D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 42"><unientity>91DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 43"><unientity>91F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 44"><unientity>91E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 45"><unientity>91E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 46"><unientity>91E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 47"><unientity>9223</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 48"><unientity>920D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 49"><unientity>9215</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 4A"><unientity>9209</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 4B"><unientity>9214</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 4C"><unientity>921E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 4D"><unientity>9210</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 4F"><unientity>9237</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 50"><unientity>9238</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 51"><unientity>923D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 52"><unientity>923E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 53"><unientity>9240</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 54"><unientity>924B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 55"><unientity>925B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 56"><unientity>9264</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 57"><unientity>9251</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 58"><unientity>E959</unientity><unientityalt>9234</unientityalt><desc>Variant of 4B5D58 which maps to 9234</desc></character>
-<character hex="21 5D 59"><unientity>9278</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5A"><unientity>9280</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5B"><unientity>92AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5C"><unientity>9285</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5D"><unientity>9298</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5E"><unientity>9296</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 5F"><unientity>927B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 60"><unientity>9293</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 61"><unientity>929C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 62"><unientity>92C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 63"><unientity>92BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 64"><unientity>92B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 65"><unientity>92EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 66"><unientity>92B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 67"><unientity>92C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 68"><unientity>92E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 69"><unientity>92BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6A"><unientity>92D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6B"><unientity>9320</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6C"><unientity>9336</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6D"><unientity>92F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6E"><unientity>9333</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 6F"><unientity>932F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 70"><unientity>9322</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 71"><unientity>92FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 72"><unientity>932B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 73"><unientity>931A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 74"><unientity>9304</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 75"><unientity>9310</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 76"><unientity>9326</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 77"><unientity>934D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 78"><unientity>9382</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 79"><unientity>9375</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 7A"><unientity>9365</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 7C"><unientity>934B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 7D"><unientity>9328</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5D 7E"><unientity>9370</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 21"><unientity>937E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 22"><unientity>9318</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 23"><unientity>936C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 24"><unientity>935B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 25"><unientity>938A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 26"><unientity>9394</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 27"><unientity>93AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 28"><unientity>9396</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 29"><unientity>93A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2A"><unientity>93B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2B"><unientity>93E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2C"><unientity>93D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2D"><unientity>93D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2E"><unientity>93C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 2F"><unientity>93DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 30"><unientity>93D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 31"><unientity>93C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 32"><unientity>93E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 33"><unientity>93DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 34"><unientity>93E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 35"><unientity>93DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 36"><unientity>93CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 37"><unientity>93D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 39"><unientity>9403</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3A"><unientity>942E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3B"><unientity>93FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3C"><unientity>9433</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3D"><unientity>9435</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3E"><unientity>943A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 3F"><unientity>9438</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 40"><unientity>9432</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 42"><unientity>9451</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 43"><unientity>9444</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 44"><unientity>9463</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 45"><unientity>9460</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 46"><unientity>9472</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 47"><unientity>9470</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 48"><unientity>947E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 49"><unientity>947C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4A"><unientity>947D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4B"><unientity>947F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4C"><unientity>9577</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4D"><unientity>9580</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4E"><unientity>9582</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 4F"><unientity>9583</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 50"><unientity>9589</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 51"><unientity>9594</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 52"><unientity>958F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 53"><unientity>958B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 54"><unientity>9591</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 55"><unientity>9593</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 56"><unientity>9592</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 57"><unientity>9598</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 58"><unientity>95A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 59"><unientity>95A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5A"><unientity>95A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5B"><unientity>95A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5C"><unientity>95A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5D"><unientity>95A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5E"><unientity>95B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 5F"><unientity>95AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 60"><unientity>95BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 61"><unientity>95CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 62"><unientity>95CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 63"><unientity>95CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 64"><unientity>95C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 65"><unientity>95C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 67"><unientity>95D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 68"><unientity>95D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 69"><unientity>95DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6A"><unientity>95E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6B"><unientity>95E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6C"><unientity>961C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6D"><unientity>9621</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6E"><unientity>9632</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 6F"><unientity>9631</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 70"><unientity>962E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 71"><unientity>962A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 72"><unientity>9640</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 73"><unientity>963F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 74"><unientity>963B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 75"><unientity>9644</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 76"><unientity>9650</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 77"><unientity>964C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 78"><unientity>964B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 79"><unientity>964D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 7A"><unientity>9662</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 7B"><unientity>9663</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 7C"><unientity>965B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 7D"><unientity>9661</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5E 7E"><unientity>965D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 21"><unientity>9664</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 22"><unientity>966A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 23"><unientity>9673</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 24"><unientity>9678</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 25"><unientity>9675</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 26"><unientity>9672</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 27"><unientity>9676</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 28"><unientity>9677</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 29"><unientity>9674</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2A"><unientity>9670</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2B"><unientity>968A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2C"><unientity>968E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2D"><unientity>968B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2E"><unientity>967D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 2F"><unientity>9685</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 30"><unientity>9686</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 31"><unientity>968D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 32"><unientity>9698</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 33"><unientity>9694</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 34"><unientity>9699</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 35"><unientity>9695</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 36"><unientity>969C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 37"><unientity>969B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 38"><unientity>96A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 39"><unientity>96A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3A"><unientity>96AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3B"><unientity>96B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3C"><unientity>96B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3D"><unientity>96B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3E"><unientity>96BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 3F"><unientity>96C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 40"><unientity>96C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 41"><unientity>96C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 42"><unientity>96C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 43"><unientity>96C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 44"><unientity>96C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 45"><unientity>96CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 46"><unientity>96CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 47"><unientity>96C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 48"><unientity>96CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 49"><unientity>96D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4A"><unientity>96D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4B"><unientity>96DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4C"><unientity>96DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4D"><unientity>96DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4E"><unientity>96D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 4F"><unientity>96E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 50"><unientity>E95A</unientity><unientityalt>96E3</unientityalt><desc>Variant of 4B5F50 which maps to 96E3</desc></character>
-<character hex="21 5F 51"><unientity>96E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 52"><unientity>96EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 53"><unientity>96EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 54"><unientity>96F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 55"><unientity>96FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 56"><unientity>96F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 57"><unientity>96F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 58"><unientity>96F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 59"><unientity>9700</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5A"><unientity>9707</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5B"><unientity>9704</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5C"><unientity>9709</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5D"><unientity>9706</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5E"><unientity>9711</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 5F"><unientity>970E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 60"><unientity>9716</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 61"><unientity>970F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 62"><unientity>970D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 63"><unientity>9713</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 64"><unientity>971C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 65"><unientity>971E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 66"><unientity>972A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 67"><unientity>9727</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 68"><unientity>9738</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 69"><unientity>9739</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6A"><unientity>9732</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6B"><unientity>973D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6C"><unientity>973E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6D"><unientity>9744</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6E"><unientity>9742</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 6F"><unientity>9748</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 70"><unientity>9751</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 71"><unientity>FA1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 72"><unientity>E95B</unientity><unientityalt>975B</unientityalt><desc>Variant of 4B5F72 which maps to 975B</desc></character>
-<character hex="21 5F 73"><unientity>975C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 74"><unientity>975E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 75"><unientity>9760</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 76"><unientity>9761</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 78"><unientity>9766</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 79"><unientity>9768</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 7A"><unientity>9769</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 7B"><unientity>9776</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 7C"><unientity>9774</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 7D"><unientity>977C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 5F 7E"><unientity>9785</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 21"><unientity>978D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 22"><unientity>978B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 23"><unientity>978F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 24"><unientity>9798</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 25"><unientity>97A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 26"><unientity>97A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 27"><unientity>97A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 28"><unientity>97AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 29"><unientity>97C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2A"><unientity>97C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2B"><unientity>97C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2C"><unientity>97CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2D"><unientity>97CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2E"><unientity>97D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 2F"><unientity>97DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 30"><unientity>97ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 31"><unientity>97F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 32"><unientity>7AE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 33"><unientity>7ADF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 34"><unientity>97F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 35"><unientity>97FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 36"><unientity>E95C</unientity><unientityalt>97FF</unientityalt><desc>Variant of 456036 which maps to 97FF</desc></character>
-<character hex="21 60 37"><unientity>9801</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 38"><unientity>9802</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 39"><unientity>9803</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3A"><unientity>9805</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3B"><unientity>9806</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3C"><unientity>9808</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3D"><unientity>9810</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3E"><unientity>980A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 3F"><unientity>9811</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 40"><unientity>9813</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 41"><unientity>9812</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 42"><unientity>980C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 43"><unientity>9817</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 44"><unientity>E95D</unientity><unientityalt>9818</unientityalt><desc>Variant of 4B6044 which maps to 9818</desc></character>
-<character hex="21 60 45"><unientity>9821</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 46"><unientity>982D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 47"><unientity>9830</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 48"><unientity>9838</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 49"><unientity>983B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4A"><unientity>9839</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4B"><unientity>9837</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4C"><unientity>9824</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4D"><unientity>9846</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4E"><unientity>9854</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 4F"><unientity>984D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 50"><unientity>984C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 51"><unientity>984E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 52"><unientity>9853</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 53"><unientity>E95E</unientity><unientityalt>985E</unientityalt><desc>Variant of 4B6053 which maps to 985E</desc></character>
-<character hex="21 60 54"><unientity>985A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 55"><unientity>9858</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 56"><unientity>9867</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 57"><unientity>986B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 58"><unientity>986F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 59"><unientity>9871</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5A"><unientity>9870</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5B"><unientity>98A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5C"><unientity>98AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5D"><unientity>98B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5E"><unientity>98B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 5F"><unientity>98B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 60"><unientity>98BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 61"><unientity>98BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 62"><unientity>98C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 63"><unientity>98DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 64"><unientity>98DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 65"><unientity>98E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 66"><unientity>98E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 67"><unientity>98E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 68"><unientity>98ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 69"><unientity>98EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6A"><unientity>98EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6B"><unientity>98EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6C"><unientity>98FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6D"><unientity>98F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6E"><unientity>98FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 6F"><unientity>98FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 70"><unientity>9903</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 71"><unientity>990A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 72"><unientity>990C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 73"><unientity>9909</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 74"><unientity>9910</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 75"><unientity>9912</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 76"><unientity>9918</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 77"><unientity>9913</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 78"><unientity>9905</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 79"><unientity>9928</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 7A"><unientity>991E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 7B"><unientity>991B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 7C"><unientity>9921</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 7D"><unientity>9935</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 60 7E"><unientity>993E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 21"><unientity>993F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 22"><unientity>993D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 23"><unientity>9945</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 24"><unientity>9952</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 25"><unientity>9951</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 26"><unientity>995C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 27"><unientity>995E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 28"><unientity>9996</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 29"><unientity>9999</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2A"><unientity>99A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2B"><unientity>99A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2C"><unientity>99AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2D"><unientity>99AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2E"><unientity>99AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 2F"><unientity>99B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 30"><unientity>99B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 31"><unientity>99B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 32"><unientity>99C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 33"><unientity>99D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 34"><unientity>99DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 35"><unientity>99D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 36"><unientity>99DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 37"><unientity>99DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 38"><unientity>99D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 39"><unientity>99D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3A"><unientity>99D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3B"><unientity>99ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3C"><unientity>99F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3D"><unientity>9A01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3E"><unientity>99FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 3F"><unientity>99E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 40"><unientity>9A0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 41"><unientity>9A19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 42"><unientity>9A16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 43"><unientity>9A2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 44"><unientity>9A30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 45"><unientity>9A37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 46"><unientity>9A43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 47"><unientity>9A45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 48"><unientity>9A40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 49"><unientity>9A3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4A"><unientity>9A55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4B"><unientity>9A5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4C"><unientity>9A5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4D"><unientity>9A57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4E"><unientity>9A5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 4F"><unientity>9A62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 50"><unientity>9A65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 51"><unientity>9A6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 52"><unientity>9AA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 53"><unientity>9AAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 54"><unientity>9AB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 55"><unientity>9AB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 56"><unientity>9AB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 57"><unientity>9ABC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 58"><unientity>9ACF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 59"><unientity>9AD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 5A"><unientity>9AD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 5B"><unientity>9AD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 5C"><unientity>9AD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 5D"><unientity>9AE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 5F"><unientity>9AEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 60"><unientity>9AFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 61"><unientity>9AED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 62"><unientity>9B03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 63"><unientity>9B06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 64"><unientity>9B0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 65"><unientity>9B1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 66"><unientity>9B22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 67"><unientity>9B25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 68"><unientity>9B27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6A"><unientity>9B31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6B"><unientity>9B32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6C"><unientity>9B3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6D"><unientity>9B41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6E"><unientity>9B42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 6F"><unientity>9B45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 70"><unientity>9B44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 71"><unientity>9B4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 72"><unientity>9B54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 73"><unientity>9B58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 74"><unientity>9B5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 75"><unientity>9B77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 76"><unientity>9B6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 77"><unientity>9B91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 78"><unientity>9BAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 79"><unientity>9BAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 7A"><unientity>9BAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 7B"><unientity>9BCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 7C"><unientity>9BC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 7D"><unientity>9BE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 61 7E"><unientity>9BE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 21"><unientity>9C13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 22"><unientity>9C0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 23"><unientity>9BFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 24"><unientity>9C2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 25"><unientity>9C25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 26"><unientity>9C31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 27"><unientity>9C3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 28"><unientity>9C3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 29"><unientity>9C54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2A"><unientity>9C57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2B"><unientity>9C56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2C"><unientity>9C49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2D"><unientity>9C77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2E"><unientity>9C78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 2F"><unientity>9CE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 30"><unientity>9CE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 31"><unientity>9CF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 32"><unientity>9CF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 33"><unientity>9CF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 34"><unientity>9D06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 35"><unientity>9D09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 36"><unientity>9D15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 37"><unientity>9D23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 38"><unientity>9D28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 39"><unientity>9D26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 3A"><unientity>9D1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 3B"><unientity>E95F</unientity><unientityalt>9D12</unientityalt><desc>Variant of 4B623B which maps to 9D12</desc></character>
-<character hex="21 62 3C"><unientity>9D3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 3D"><unientity>9D3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 3E"><unientity>9D61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 3F"><unientity>9D51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 40"><unientity>9D60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 41"><unientity>9D5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 42"><unientity>9D89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 43"><unientity>9D72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 44"><unientity>9D6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 45"><unientity>9D6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 46"><unientity>9DB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 47"><unientity>9DAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 48"><unientity>9DC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 49"><unientity>9DD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4A"><unientity>9DD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4B"><unientity>9DE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4C"><unientity>9DF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4D"><unientity>9DFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4E"><unientity>9E1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 4F"><unientity>9E1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 50"><unientity>9E79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 51"><unientity>9E7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 52"><unientity>9E7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 53"><unientity>9E7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 54"><unientity>9E82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 55"><unientity>9E8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 56"><unientity>9E97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 57"><unientity>9E92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 58"><unientity>9E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 59"><unientity>9E9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5A"><unientity>9E9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5B"><unientity>9EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5C"><unientity>9EA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5D"><unientity>9EB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5E"><unientity>9EB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 5F"><unientity>9EBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 60"><unientity>9EBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 61"><unientity>9EBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 62"><unientity>9EC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 63"><unientity>9ECD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 64"><unientity>9ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 65"><unientity>9ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 66"><unientity>9ED1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 67"><unientity>58A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 68"><unientity>9ED8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 69"><unientity>9ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6A"><unientity>9EDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6B"><unientity>9EDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6C"><unientity>9EDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6D"><unientity>9EDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6E"><unientity>9EE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 6F"><unientity>9EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 70"><unientity>9EEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 71"><unientity>9EF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 72"><unientity>9EF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 73"><unientity>9F07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 74"><unientity>9F0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 75"><unientity>9F13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 76"><unientity>9F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 77"><unientity>9F19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 78"><unientity>9F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 79"><unientity>9F2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 7A"><unientity>9F34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 7B"><unientity>9F3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 7C"><unientity>9F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 7D"><unientity>9F4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 62 7E"><unientity>9F4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 21"><unientity>9F52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 22"><unientity>9F5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 23"><unientity>9F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 24"><unientity>E960</unientity><unientityalt>9F61</unientityalt><desc>Variant of 456324 which maps to 9F61</desc></character>
-<character hex="21 63 25"><unientity>9F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 26"><unientity>9F5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 27"><unientity>9F6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 28"><unientity>9F6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 29"><unientity>9F77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 2A"><unientity>9F72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 2B"><unientity>9F8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 2C"><unientity>9F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 2D"><unientity>9F9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 63 30"><unientity>8288</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 24"><unientity>4E0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 25"><unientity>5187</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 29"><unientity>4E28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 2E"><unientity>4E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 31"><unientity>4E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 33"><unientity>4E3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 34"><unientity>4E42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 37"><unientity>738D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 3C"><unientity>4E5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 3F"><unientity>6C39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 46"><unientity>4E85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 50"><unientity>4EA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 51"><unientity>4EA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 52"><unientity>4EB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 55"><unientity>E961</unientity><unientityalt>4EB6</unientityalt><desc>Variant of 4B6455 which maps to 4EB6</desc></character>
-<character hex="21 64 58"><unientity>4EB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 5A"><unientity>4EBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 5E"><unientity>4EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 61"><unientity>4EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 62"><unientity>E9E2</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 64 63"><unientity>4EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 6B"><unientity>4EE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 72"><unientity>4F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 73"><unientity>4F0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 75"><unientity>4F03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 64 7C"><unientity>4F22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 27"><unientity>4EF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 28"><unientity>4F07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 2A"><unientity>4F00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 2C"><unientity>4F0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 32"><unientity>4F3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 36"><unientity>4F58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 37"><unientity>4F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 39"><unientity>4F64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 3A"><unientity>4F49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 3F"><unientity>4F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 40"><unientity>4F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 44"><unientity>4F67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 4D"><unientity>4F68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 4E"><unientity>4F5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 4F"><unientity>4F5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 56"><unientity>4F82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 57"><unientity>4F7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 5A"><unientity>4F98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 5B"><unientity>4F92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 5C"><unientity>4F7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 60"><unientity>4F80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 61"><unientity>4F74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 62"><unientity>4F76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 64"><unientity>4FA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 66"><unientity>4F91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 67"><unientity>4F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 6C"><unientity>4F4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 6D"><unientity>4F97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 6E"><unientity>4F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 70"><unientity>4F79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 71"><unientity>4F9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 72"><unientity>4F81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 73"><unientity>4F78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 76"><unientity>4F9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 77"><unientity>4F90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 7B"><unientity>4F7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 65 7C"><unientity>4FCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 22"><unientity>4FE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 26"><unientity>4FB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 27"><unientity>4FC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 29"><unientity>4FC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 2A"><unientity>4FE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 2C"><unientity>4FE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 33"><unientity>4FDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 35"><unientity>4FD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 37"><unientity>4FC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 3B"><unientity>4FDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 3E"><unientity>4FC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 43"><unientity>4FB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 46"><unientity>501E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 48"><unientity>503F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 49"><unientity>5005</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 4C"><unientity>5007</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 4D"><unientity>5013</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 4E"><unientity>5022</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 52"><unientity>4FF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 59"><unientity>4FF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 5B"><unientity>5037</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 5E"><unientity>502E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 61"><unientity>4FF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 62"><unientity>501C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 66"><unientity>502C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 69"><unientity>5010</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 66 79"><unientity>503D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 22"><unientity>506F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 23"><unientity>5050</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 25"><unientity>5070</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 29"><unientity>5053</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 2A"><unientity>506A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 2C"><unientity>5056</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 31"><unientity>506D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 38"><unientity>505D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 39"><unientity>5048</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 3B"><unientity>5058</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 3C"><unientity>5072</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 41"><unientity>5041</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 46"><unientity>5015</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 48"><unientity>507A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 4A"><unientity>506C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 4B"><unientity>505F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 4D"><unientity>506B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 4E"><unientity>5094</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 50"><unientity>509E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 52"><unientity>509B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 53"><unientity>509A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 57"><unientity>50A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 5A"><unientity>508C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 5C"><unientity>5088</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 62"><unientity>508E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 64"><unientity>5095</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 67"><unientity>50A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 6A"><unientity>5092</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 6C"><unientity>509C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 71"><unientity>50C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 75"><unientity>50C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 7B"><unientity>50CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 67 7C"><unientity>50B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 22"><unientity>50C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 2C"><unientity>50BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 2E"><unientity>50CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 32"><unientity>50D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 34"><unientity>50EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 35"><unientity>50E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 3A"><unientity>50F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 3B"><unientity>50CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 3C"><unientity>50DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 41"><unientity>50F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 42"><unientity>50E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 44"><unientity>50F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 46"><unientity>50D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 55"><unientity>50EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 5B"><unientity>510E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 5F"><unientity>5105</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 61"><unientity>50FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 65"><unientity>5106</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 66"><unientity>5107</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 67"><unientity>510F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 68"><unientity>50FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 69"><unientity>510B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 6A"><unientity>50FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 6D"><unientity>5101</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 71"><unientity>5115</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 72"><unientity>5113</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 78"><unientity>511A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 79"><unientity>9797</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 68 7E"><unientity>5126</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 29"><unientity>5124</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 2B"><unientity>5129</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 30"><unientity>5131</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 3E"><unientity>5135</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 40"><unientity>5133</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 44"><unientity>513A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 47"><unientity>5139</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 48"><unientity>513B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 51"><unientity>5159</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 52"><unientity>515B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 55"><unientity>515D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 56"><unientity>515E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 58"><unientity>515F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 59"><unientity>5161</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 5C"><unientity>5163</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 67"><unientity>5182</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 69"><unientity>5184</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 6E"><unientity>518F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 70"><unientity>5194</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 71"><unientity>5193</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 75"><unientity>5196</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 7B"><unientity>51A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 69 7C"><unientity>51A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 22"><unientity>51AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 23"><unientity>51AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 26"><unientity>51B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 35"><unientity>51BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 43"><unientity>51CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 46"><unientity>51C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 4E"><unientity>51D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 4F"><unientity>51D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 54"><unientity>51D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 63"><unientity>51D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 66"><unientity>51DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 68"><unientity>51E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 73"><unientity>5160</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 78"><unientity>51F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6A 79"><unientity>51F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 24"><unientity>5213</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 26"><unientity>5216</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 2A"><unientity>521C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 33"><unientity>5231</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 36"><unientity>5235</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 37"><unientity>5232</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 39"><unientity>5233</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 3E"><unientity>5244</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 43"><unientity>5249</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 47"><unientity>5260</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 4B"><unientity>525A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 4C"><unientity>5252</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 4D"><unientity>525E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 50"><unientity>525F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 53"><unientity>5255</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 5B"><unientity>526E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 5E"><unientity>5268</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 5F"><unientity>7B9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 6B"><unientity>5278</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 74"><unientity>5282</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 75"><unientity>5281</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 79"><unientity>528C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 7A"><unientity>528A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6B 7C"><unientity>5290</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 21"><unientity>5293</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 27"><unientity>5296</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 29"><unientity>5298</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 2B"><unientity>529A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 2C"><unientity>5299</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 2E"><unientity>52A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 31"><unientity>52AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 33"><unientity>52AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 37"><unientity>52BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 38"><unientity>52BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 3C"><unientity>52CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 3D"><unientity>52CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 40"><unientity>52D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 41"><unientity>52D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 46"><unientity>52D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 48"><unientity>52D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 4C"><unientity>52E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 4E"><unientity>52E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 50"><unientity>55E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 53"><unientity>52E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 58"><unientity>52F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 5A"><unientity>52F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 5E"><unientity>52F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 61"><unientity>52F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 62"><unientity>52FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 64"><unientity>52FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 69"><unientity>5307</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 6A"><unientity>5303</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 6B"><unientity>E9E3</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 6C 6E"><unientity>530A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 6F"><unientity>530B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 77"><unientity>5311</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6C 7B"><unientity>6706</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 23"><unientity>531A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 24"><unientity>531C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 25"><unientity>531F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 2E"><unientity>532D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 33"><unientity>5330</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 36"><unientity>5335</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 3A"><unientity>5338</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 3E"><unientity>533D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 41"><unientity>534C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 42"><unientity>534D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 4B"><unientity>535D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 4C"><unientity>5363</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 4E"><unientity>E9E4</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 6D 53"><unientity>536C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 57"><unientity>5372</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 58"><unientity>537A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 5D"><unientity>5380</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 64"><unientity>538E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 66"><unientity>5393</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 67"><unientity>5394</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 6D"><unientity>5399</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 74"><unientity>8652</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 7A"><unientity>53A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6D 7B"><unientity>53AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 2C"><unientity>53B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 2E"><unientity>53B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 3E"><unientity>53D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 48"><unientity>53DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 57"><unientity>53FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 58"><unientity>535F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 61"><unientity>5414</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 68"><unientity>5406</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 6C"><unientity>544C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 6D"><unientity>5445</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 6F"><unientity>541A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 70"><unientity>5432</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 76"><unientity>5421</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 78"><unientity>5430</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 79"><unientity>5454</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6E 7D"><unientity>543D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 21"><unientity>544F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 24"><unientity>542A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 26"><unientity>5422</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 27"><unientity>5423</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 2E"><unientity>545F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 2F"><unientity>549C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 35"><unientity>5488</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 37"><unientity>547F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 39"><unientity>5482</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 3A"><unientity>546D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 3B"><unientity>5491</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 42"><unientity>5494</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 43"><unientity>546B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 49"><unientity>548D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 4A"><unientity>5463</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 4B"><unientity>5474</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 52"><unientity>5466</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 53"><unientity>5464</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 55"><unientity>54A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 58"><unientity>54A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 5A"><unientity>54AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 5B"><unientity>54BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 5C"><unientity>54CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 5E"><unientity>54BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 60"><unientity>54A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 63"><unientity>54A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 64"><unientity>54B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 66"><unientity>54A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 67"><unientity>5472</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 68"><unientity>5470</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 69"><unientity>54BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 6A"><unientity>54B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 6B"><unientity>54DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 6C"><unientity>54D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 6D"><unientity>54AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 71"><unientity>54BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 74"><unientity>54C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 7B"><unientity>551A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 7C"><unientity>54E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 6F 7D"><unientity>5507</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 23"><unientity>5517</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 24"><unientity>54FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 25"><unientity>54E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 27"><unientity>54F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 2A"><unientity>54E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 2B"><unientity>550A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 2D"><unientity>54FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 2E"><unientity>5518</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 30"><unientity>5504</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 32"><unientity>54EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 34"><unientity>5508</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 38"><unientity>54F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 39"><unientity>54F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 3E"><unientity>550E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 44"><unientity>5523</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 46"><unientity>550F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 47"><unientity>5511</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 4B"><unientity>5575</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 4D"><unientity>5573</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 4E"><unientity>554C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 4F"><unientity>5576</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 50"><unientity>554D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 51"><unientity>555A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 53"><unientity>553C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 55"><unientity>5550</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 57"><unientity>5539</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 58"><unientity>5548</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 59"><unientity>552D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 5A"><unientity>5551</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 5D"><unientity>552A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 60"><unientity>5562</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 61"><unientity>5536</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 64"><unientity>5549</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 68"><unientity>5530</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 6A"><unientity>5540</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 6B"><unientity>5535</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 70"><unientity>5545</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 79"><unientity>553F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 7B"><unientity>5541</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 70 7D"><unientity>5565</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 23"><unientity>5591</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 25"><unientity>5577</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 26"><unientity>55A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 27"><unientity>55AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 2A"><unientity>5605</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 2D"><unientity>5593</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 2F"><unientity>5586</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 34"><unientity>5588</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 36"><unientity>55B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 43"><unientity>E962</unientity><unientityalt>55E2</unientityalt><desc>Variant of 2D7143 which maps to 55E2</desc></character>
-<character hex="21 71 44"><unientity>5581</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 45"><unientity>558E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 47"><unientity>55B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 49"><unientity>558F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 4B"><unientity>5559</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 50"><unientity>55A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 51"><unientity>5592</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 52"><unientity>5599</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 56"><unientity>55F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 58"><unientity>55CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 59"><unientity>55D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5A"><unientity>55DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5B"><unientity>55CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5C"><unientity>55DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5D"><unientity>55D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5E"><unientity>55C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 5F"><unientity>55C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 61"><unientity>55CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 62"><unientity>55DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 64"><unientity>55D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 65"><unientity>55C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 69"><unientity>55E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 6F"><unientity>55CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 70"><unientity>55D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 75"><unientity>55E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 77"><unientity>55D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 78"><unientity>55C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 79"><unientity>55F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 71 7E"><unientity>5627</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 24"><unientity>55FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 25"><unientity>5612</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 27"><unientity>55F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 28"><unientity>560F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 2B"><unientity>55F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 2E"><unientity>561E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 31"><unientity>560C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 34"><unientity>561C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 35"><unientity>5610</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 36"><unientity>5601</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 38"><unientity>5613</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 39"><unientity>55F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 3C"><unientity>5602</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 42"><unientity>561D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 44"><unientity>55FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 47"><unientity>5642</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 48"><unientity>564C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 4B"><unientity>564B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 52"><unientity>5640</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 55"><unientity>5635</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 57"><unientity>5649</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 58"><unientity>5641</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 5C"><unientity>5658</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 5D"><unientity>5620</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 5E"><unientity>5654</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 60"><unientity>562A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 61"><unientity>563D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 64"><unientity>562C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 67"><unientity>5638</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 69"><unientity>564D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 6B"><unientity>562B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 6C"><unientity>564F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 6E"><unientity>5670</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 6F"><unientity>565F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 70"><unientity>567C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 72"><unientity>5660</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 78"><unientity>5676</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 7A"><unientity>5666</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 7B"><unientity>5673</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 7C"><unientity>566D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 72 7E"><unientity>5672</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 25"><unientity>5693</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 28"><unientity>568C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 32"><unientity>56BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 34"><unientity>5686</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 35"><unientity>5684</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 36"><unientity>5691</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 37"><unientity>568A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 3E"><unientity>569E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 41"><unientity>569C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 42"><unientity>569A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 45"><unientity>5699</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 4B"><unientity>56AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 4C"><unientity>56A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 4E"><unientity>56AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 53"><unientity>56B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 5A"><unientity>56B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 5B"><unientity>56C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 60"><unientity>56C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 62"><unientity>56CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 67"><unientity>56CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 6A"><unientity>56D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 6B"><unientity>56D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 6D"><unientity>56DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 6F"><unientity>56E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 70"><unientity>56DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 75"><unientity>56EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 76"><unientity>56EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 77"><unientity>56E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 79"><unientity>56FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 73 7E"><unientity>56F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 21"><unientity>56F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 24"><unientity>56FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 27"><unientity>5705</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 28"><unientity>5704</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 29"><unientity>5702</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 2C"><unientity>570A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 2D"><unientity>5709</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 2E"><unientity>5707</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 30"><unientity>570C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 31"><unientity>5715</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 32"><unientity>5714</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 35"><unientity>571A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 36"><unientity>571B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 37"><unientity>571C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 39"><unientity>571D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 3A"><unientity>571E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 41"><unientity>5724</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 42"><unientity>572E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 43"><unientity>5729</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 48"><unientity>5738</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 4C"><unientity>572A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 63"><unientity>5749</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 65"><unientity>5745</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 68"><unientity>574B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 69"><unientity>574C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 6A"><unientity>573F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 70"><unientity>5768</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 75"><unientity>578A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 77"><unientity>576D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 79"><unientity>5774</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 74 7A"><unientity>5767</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 26"><unientity>5770</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 28"><unientity>5771</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 2A"><unientity>576E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 2D"><unientity>5776</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 2E"><unientity>5789</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 30"><unientity>577F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 31"><unientity>5775</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 32"><unientity>577B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 33"><unientity>5788</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 35"><unientity>5773</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 38"><unientity>579F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 39"><unientity>5790</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 3A"><unientity>5793</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 3F"><unientity>579E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 40"><unientity>57B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 43"><unientity>579A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 45"><unientity>5794</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 47"><unientity>57A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 48"><unientity>5799</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 49"><unientity>578C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 4B"><unientity>5797</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 4E"><unientity>579D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 52"><unientity>579C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 54"><unientity>57A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 57"><unientity>57A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 59"><unientity>EA00</unientity><desc>East Asian ideograph not found in unified han</desc></character>
-<character hex="21 75 5B"><unientity>5795</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 5F"><unientity>57B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 60"><unientity>57C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 6A"><unientity>5809</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 6C"><unientity>57BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 71"><unientity>57DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 73"><unientity>57D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 77"><unientity>57D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 75 7E"><unientity>57C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 22"><unientity>57C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 27"><unientity>70FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 29"><unientity>57E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 2A"><unientity>57FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 2B"><unientity>5803</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 2C"><unientity>57F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 2D"><unientity>57E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 31"><unientity>57ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 33"><unientity>5800</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 35"><unientity>57EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 36"><unientity>5807</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 39"><unientity>580E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 3B"><unientity>580F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 3D"><unientity>57F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 3E"><unientity>5810</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 40"><unientity>580D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 43"><unientity>57EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 48"><unientity>5801</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 49"><unientity>5812</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 4D"><unientity>57FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 4E"><unientity>57F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 50"><unientity>580C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 51"><unientity>5813</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 52"><unientity>57F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 56"><unientity>580B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 58"><unientity>57F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 59"><unientity>5804</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 5A"><unientity>57CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 5B"><unientity>57DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 5F"><unientity>5847</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 67"><unientity>581B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 69"><unientity>5819</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 6A"><unientity>5833</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 6C"><unientity>581E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 6D"><unientity>583F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 71"><unientity>5827</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 76"><unientity>5828</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 78"><unientity>582E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 7A"><unientity>581D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 76 7D"><unientity>5844</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 21"><unientity>5848</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 23"><unientity>5818</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 26"><unientity>57F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 29"><unientity>582D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 2B"><unientity>5820</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 30"><unientity>584E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 33"><unientity>585D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 35"><unientity>5859</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 37"><unientity>584B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 3D"><unientity>5865</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 40"><unientity>586C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 42"><unientity>5852</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 45"><unientity>5864</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 47"><unientity>5853</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 48"><unientity>584F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 49"><unientity>583D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 4D"><unientity>584D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 4E"><unientity>5856</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 55"><unientity>589A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 58"><unientity>5892</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 5A"><unientity>588E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 5C"><unientity>5889</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 5F"><unientity>5840</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 60"><unientity>589B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 61"><unientity>587C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 63"><unientity>5888</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 65"><unientity>5890</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 68"><unientity>5898</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 6B"><unientity>587D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 6F"><unientity>587F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 70"><unientity>5881</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 7B"><unientity>58A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 77 7E"><unientity>58A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 24"><unientity>58B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 2B"><unientity>58AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 2E"><unientity>58A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 30"><unientity>58A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 32"><unientity>58A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 3A"><unientity>58C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 41"><unientity>58BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 49"><unientity>58BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 4B"><unientity>58C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 4C"><unientity>58BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 50"><unientity>58D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 54"><unientity>58D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 56"><unientity>58CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 5A"><unientity>58E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 5E"><unientity>58DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 6C"><unientity>58FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 70"><unientity>5902</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 73"><unientity>5906</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 74"><unientity>6535</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 7A"><unientity>5910</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 78 7C"><unientity>8641</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 28"><unientity>592C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 2B"><unientity>592F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 30"><unientity>593C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 33"><unientity>5940</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 38"><unientity>594D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 43"><unientity>5953</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 4B"><unientity>595C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 4F"><unientity>5961</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 54"><unientity>596C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 55"><unientity>596D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 65"><unientity>597C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 69"><unientity>59A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 6B"><unientity>5998</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 6F"><unientity>599A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 71"><unientity>59A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 79 7C"><unientity>5997</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 21"><unientity>5990</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 24"><unientity>59C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 25"><unientity>59B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 28"><unientity>59CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 2A"><unientity>59BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 2C"><unientity>59B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 35"><unientity>59B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 3A"><unientity>59B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 3E"><unientity>59C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 43"><unientity>59F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 44"><unientity>59F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 4F"><unientity>59EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 50"><unientity>59F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 51"><unientity>5A00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 52"><unientity>59DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 56"><unientity>59FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 5D"><unientity>59F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 5E"><unientity>59DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 5F"><unientity>59FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 61"><unientity>59E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 6E"><unientity>5A2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 75"><unientity>5A16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 78"><unientity>5A09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7A 7E"><unientity>5A12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 2C"><unientity>5A60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 31"><unientity>5A67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 3A"><unientity>5A38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 3B"><unientity>5A5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 3C"><unientity>5A6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 3D"><unientity>5A35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 3E"><unientity>5A55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 41"><unientity>5A2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 48"><unientity>5A50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 49"><unientity>5A65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 52"><unientity>5A64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 65"><unientity>5A8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 69"><unientity>5ACF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 6A"><unientity>5A7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 71"><unientity>5A9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7B 75"><unientity>5AA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 21"><unientity>5AA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 22"><unientity>5A8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 24"><unientity>5AA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 25"><unientity>5A9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 26"><unientity>5AA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 27"><unientity>5A9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 28"><unientity>5A7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 29"><unientity>5A96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 30"><unientity>5A93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 31"><unientity>5AAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 34"><unientity>5AAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 35"><unientity>5A95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 36"><unientity>5AAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 39"><unientity>5AC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 3E"><unientity>5AB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 41"><unientity>5AC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 45"><unientity>5AB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 49"><unientity>5AD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 4A"><unientity>5A90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 4F"><unientity>5AB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 50"><unientity>5ABA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 52"><unientity>5AAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 59"><unientity>5AD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 5B"><unientity>5AB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 60"><unientity>5ADC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 6D"><unientity>5AE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 6E"><unientity>5AE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 72"><unientity>5AEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 7B"><unientity>5ADA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7C 7C"><unientity>5AEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 26"><unientity>5AFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 2A"><unientity>5AFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 2B"><unientity>5B08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 2E"><unientity>5B0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 38"><unientity>5B03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 3D"><unientity>5B17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 3E"><unientity>5B16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 40"><unientity>5B19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 47"><unientity>5B1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 48"><unientity>5B21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 52"><unientity>5B2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 59"><unientity>5B32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 63"><unientity>5B3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 6E"><unientity>5B45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 74"><unientity>5B4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 76"><unientity>5B4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7D 7C"><unientity>5B56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 21"><unientity>5B5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 23"><unientity>5B62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 24"><unientity>5B65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 25"><unientity>5B67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 27"><unientity>E9E5</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 7E 28"><unientity>5B6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 2A"><unientity>5B6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 30"><unientity>5B7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 31"><unientity>5B7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 32"><unientity>5B80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 34"><unientity>5B84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 35"><unientity>E9E6</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="21 7E 40"><unientity>5B95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 43"><unientity>5B93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 49"><unientity>5BAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 52"><unientity>5BA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 55"><unientity>5BB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 59"><unientity>5BC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 5B"><unientity>EA01</unientity><desc>East Asian ideography not found in unified han</desc></character>
-<character hex="21 7E 60"><unientity>5BC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 68"><unientity>5BD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 6A"><unientity>5BC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 6E"><unientity>5BD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 75"><unientity>5BD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 79"><unientity>5BE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="21 7E 7E"><unientity>5BEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 24"><unientity>5BF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 25"><unientity>5BEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 33"><unientity>5C00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 35"><unientity>5C57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 3C"><unientity>5C15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 46"><unientity>5C22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 48"><unientity>5C25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 4B"><unientity>5C2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 52"><unientity>5C2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 5B"><unientity>5C32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 63"><unientity>5C3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 65"><unientity>5C44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 67"><unientity>5C49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 79"><unientity>5C59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 7B"><unientity>5C5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 22 7C"><unientity>5C5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 23"><unientity>5C63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 29"><unientity>5C67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 2B"><unientity>5C68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 30"><unientity>5C6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 31"><unientity>5C6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 37"><unientity>5C74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 39"><unientity>5C73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 3B"><unientity>5C77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 3C"><unientity>5C7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 40"><unientity>5C7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 46"><unientity>5C8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 49"><unientity>5C88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 4B"><unientity>5C8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 4D"><unientity>5C99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 55"><unientity>5CA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 57"><unientity>5CA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 5C"><unientity>5CA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 60"><unientity>5CB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 61"><unientity>5CA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 66"><unientity>5CA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 67"><unientity>5CAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 6B"><unientity>5CA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 6C"><unientity>5CB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 6D"><unientity>5CC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 6F"><unientity>5CAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 70"><unientity>5CD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 78"><unientity>5CD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 23 79"><unientity>E9E7</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 24 26"><unientity>5CE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 28"><unientity>5CD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 29"><unientity>5CDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 2B"><unientity>5CCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 30"><unientity>5CC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 31"><unientity>5CDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 34"><unientity>5D00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 3B"><unientity>5CFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 3C"><unientity>5CEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 41"><unientity>5CF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 46"><unientity>5CF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 49"><unientity>5D1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 4A"><unientity>5D12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 50"><unientity>5D1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 52"><unientity>5D0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 53"><unientity>5D20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 54"><unientity>5D21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 57"><unientity>5D27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 58"><unientity>5D0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 5A"><unientity>5D26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 5D"><unientity>5D2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 69"><unientity>5D24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 71"><unientity>5D36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 72"><unientity>5D3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 74"><unientity>5D4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 76"><unientity>5D57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 24 77"><unientity>5D34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 25"><unientity>5D3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 26"><unientity>5D52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 27"><unientity>5D3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 28"><unientity>5D4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 2C"><unientity>5D59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 2D"><unientity>5D47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 2F"><unientity>5D32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 31"><unientity>5D42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 34"><unientity>5D74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 39"><unientity>5D6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 3A"><unientity>5D6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 3F"><unientity>5D75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 44"><unientity>5D4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 49"><unientity>5D6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 4A"><unientity>5D62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 4D"><unientity>5D82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 50"><unientity>5D79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 51"><unientity>5D8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 5A"><unientity>5D81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 60"><unientity>5D7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 66"><unientity>5D92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 68"><unientity>5D99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 69"><unientity>5D97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 6A"><unientity>5DA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 73"><unientity>5DA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 75"><unientity>5D93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 77"><unientity>5DA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 7B"><unientity>5D94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 25 7E"><unientity>5DAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 26"><unientity>5DA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 2A"><unientity>5DB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 2E"><unientity>5DB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 2F"><unientity>5DAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 30"><unientity>5DB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 32"><unientity>5DB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 34"><unientity>5DBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 36"><unientity>5DB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 3E"><unientity>5DC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 44"><unientity>5DC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 46"><unientity>5DC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 47"><unientity>5DCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 4E"><unientity>5DD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 50"><unientity>5DDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 52"><unientity>5DDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 56"><unientity>5DE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 62"><unientity>5E00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 64"><unientity>51E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 72"><unientity>5E14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 73"><unientity>5E17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 76"><unientity>5E19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 77"><unientity>5E12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 78"><unientity>5E1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 7A"><unientity>5E23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 26 7B"><unientity>5E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 22"><unientity>5E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 24"><unientity>5E28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 35"><unientity>5E44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 36"><unientity>5E43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 39"><unientity>5E42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 3F"><unientity>5E4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 47"><unientity>5E58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 48"><unientity>5E48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 57"><unientity>5E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 58"><unientity>5E61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 5D"><unientity>5E68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 5F"><unientity>5E6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 60"><unientity>5E6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 63"><unientity>5E6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 64"><unientity>5E6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 65"><unientity>5E70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 6D"><unientity>5E75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 77"><unientity>5E80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 27 7E"><unientity>5E8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 2F"><unientity>5EA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 35"><unientity>5EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 36"><unientity>5EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 42"><unientity>5EB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 4B"><unientity>5EB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 4C"><unientity>5EC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 51"><unientity>5ECC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 55"><unientity>5ECB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 57"><unientity>5ECD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 5A"><unientity>5ED2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 5B"><unientity>5ED1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 5C"><unientity>5ED5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 5F"><unientity>5ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 60"><unientity>5ED9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 61"><unientity>5ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 68"><unientity>5EE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 6D"><unientity>5EE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 71"><unientity>5EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 28 7C"><unientity>5EED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 21"><unientity>5EF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 23"><unientity>5EF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 35"><unientity>5F07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 3A"><unientity>5F0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 4A"><unientity>5F28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 4B"><unientity>5F22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 4C"><unientity>5F23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 4D"><unientity>5F24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 51"><unientity>5F33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 52"><unientity>5F30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 58"><unientity>5F38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 5C"><unientity>5F40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 5F"><unientity>5F44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 62"><unientity>5F4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 68"><unientity>5F50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 69"><unientity>5F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 6A"><unientity>5F56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 6C"><unientity>5F58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 70"><unientity>5F60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 71"><unientity>5F61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 72"><unientity>5F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 73"><unientity>809C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 74"><unientity>5F67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 78"><unientity>5F72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 79"><unientity>5F73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 29 7C"><unientity>5F74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 23"><unientity>5F82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 27"><unientity>5F89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 2B"><unientity>5F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 34"><unientity>EA02</unientity><desc>East Asian ideograph not found in unified han</desc></character>
-<character hex="22 2A 39"><unientity>5F9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 3D"><unientity>5F9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 46"><unientity>5FAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 50"><unientity>5FBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 57"><unientity>5FC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 5F"><unientity>5FD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 61"><unientity>5FD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 63"><unientity>5FD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 67"><unientity>5FCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 68"><unientity>5FED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 72"><unientity>5FEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 73"><unientity>5FF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 78"><unientity>5FE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2A 7B"><unientity>5FE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 24"><unientity>5FEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 2A"><unientity>6026</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 2C"><unientity>6029</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 2D"><unientity>602B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 30"><unientity>6019</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 31"><unientity>6008</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 36"><unientity>600A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 37"><unientity>600C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 38"><unientity>601B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 3C"><unientity>6017</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 3D"><unientity>6033</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 45"><unientity>600D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 46"><unientity>6010</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 4B"><unientity>6039</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 50"><unientity>6013</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 53"><unientity>6054</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 57"><unientity>605D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 5A"><unientity>6047</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 5E"><unientity>6049</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 5F"><unientity>6053</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 68"><unientity>6067</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 6F"><unientity>604C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 71"><unientity>6041</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 72"><unientity>6077</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 74"><unientity>6042</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 76"><unientity>605F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2B 7A"><unientity>6061</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 24"><unientity>608A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 2B"><unientity>6092</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 2C"><unientity>609D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 2D"><unientity>6081</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 2F"><unientity>609E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 30"><unientity>6083</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 32"><unientity>6097</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 34"><unientity>60A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 3A"><unientity>6095</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 3E"><unientity>60C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 42"><unientity>60B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 46"><unientity>60BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 47"><unientity>60D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 48"><unientity>60D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 4E"><unientity>60CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 51"><unientity>60CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 53"><unientity>60D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 54"><unientity>60B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 56"><unientity>60DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 5D"><unientity>60C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 60"><unientity>60B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 62"><unientity>60E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 66"><unientity>60E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 67"><unientity>60E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 69"><unientity>60DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 6E"><unientity>60E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 70"><unientity>6114</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 73"><unientity>6103</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 75"><unientity>6119</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 7C"><unientity>60FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2C 7D"><unientity>610D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 2A"><unientity>610A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 2C"><unientity>6110</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 32"><unientity>6112</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 34"><unientity>60F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 37"><unientity>6125</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 3B"><unientity>60F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 3F"><unientity>6121</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 41"><unientity>60FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 43"><unientity>6106</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 48"><unientity>6149</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 4A"><unientity>614A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 4E"><unientity>612B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 50"><unientity>6129</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 51"><unientity>6150</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 56"><unientity>53AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 58"><unientity>6130</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 5B"><unientity>6141</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 5E"><unientity>6137</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 61"><unientity>6146</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 66"><unientity>615E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 67"><unientity>6175</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 68"><unientity>6174</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 6B"><unientity>6183</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 70"><unientity>6171</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 74"><unientity>616A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 77"><unientity>6173</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 79"><unientity>6164</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2D 7B"><unientity>6153</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 23"><unientity>618B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 2C"><unientity>616F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 2D"><unientity>6165</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 2F"><unientity>615C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 32"><unientity>619D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 33"><unientity>61A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 3D"><unientity>61A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 40"><unientity>61A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 42"><unientity>619C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 43"><unientity>61AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 45"><unientity>6196</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 46"><unientity>6197</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 47"><unientity>61AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 4C"><unientity>6192</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 52"><unientity>61AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 55"><unientity>618D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 5A"><unientity>61CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 5C"><unientity>61CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 5D"><unientity>61C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 68"><unientity>61BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 6A"><unientity>61B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 71"><unientity>61E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 77"><unientity>61E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 7D"><unientity>61DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2E 7E"><unientity>61DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 29"><unientity>61F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 3D"><unientity>6201</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 41"><unientity>6204</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 43"><unientity>6207</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 44"><unientity>6209</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 47"><unientity>6214</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 56"><unientity>6223</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 5B"><unientity>6225</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 5D"><unientity>6224</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 61"><unientity>6229</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 67"><unientity>622D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 69"><unientity>97EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 6E"><unientity>6239</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 6F"><unientity>623A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 70"><unientity>623D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 75"><unientity>6243</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 77"><unientity>6246</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 78"><unientity>6245</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 79"><unientity>624A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 7A"><unientity>6250</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 2F 7C"><unientity>625E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 26"><unientity>6268</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 28"><unientity>6260</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 2B"><unientity>625A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 2C"><unientity>6262</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 2D"><unientity>6266</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 31"><unientity>6286</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 32"><unientity>628E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 41"><unientity>62A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 43"><unientity>6282</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 46"><unientity>6285</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 4B"><unientity>629D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 56"><unientity>62A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 57"><unientity>62D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 61"><unientity>62E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 69"><unientity>62B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 6A"><unientity>62C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 30 72"><unientity>630D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 25"><unientity>62F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 31"><unientity>630C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 32"><unientity>6360</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 37"><unientity>62F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 3A"><unientity>6331</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 42"><unientity>6345</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 44"><unientity>6343</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 45"><unientity>6335</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 47"><unientity>6353</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 48"><unientity>6364</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 49"><unientity>6336</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 4A"><unientity>6344</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 54"><unientity>6339</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 58"><unientity>6357</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 5A"><unientity>633C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 5B"><unientity>6358</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 5C"><unientity>634B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 5F"><unientity>6354</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 68"><unientity>637D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 6A"><unientity>63B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 6B"><unientity>6382</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 6C"><unientity>636C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 6E"><unientity>639F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 72"><unientity>639E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 73"><unientity>637F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 79"><unientity>6381</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 7B"><unientity>6397</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 31 7D"><unientity>63AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 25"><unientity>6387</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 26"><unientity>637A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 27"><unientity>638E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 2A"><unientity>6386</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 2F"><unientity>6375</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 30"><unientity>63AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 37"><unientity>63B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 38"><unientity>63B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 39"><unientity>63AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 3A"><unientity>637C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 3B"><unientity>6390</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 3D"><unientity>63AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 41"><unientity>636D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 43"><unientity>63DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 44"><unientity>63E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 47"><unientity>63D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 4F"><unientity>63BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 50"><unientity>63C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 52"><unientity>63F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 58"><unientity>63E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 5B"><unientity>63E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 5C"><unientity>63D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 5D"><unientity>63F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 5E"><unientity>63F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 5F"><unientity>63F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 66"><unientity>E9E8</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 32 6A"><unientity>63F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 70"><unientity>63BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 72"><unientity>63EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 73"><unientity>63DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 76"><unientity>E9E9</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 32 79"><unientity>63C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 7A"><unientity>63DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 7B"><unientity>63D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 32 7E"><unientity>6412</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 22"><unientity>6410</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 24"><unientity>6434</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 29"><unientity>641B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 2B"><unientity>6420</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 2C"><unientity>6424</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 2F"><unientity>6426</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 31"><unientity>640C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 36"><unientity>6415</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 37"><unientity>6418</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 38"><unientity>640E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 39"><unientity>EA03</unientity><desc>East Asian ideography not found in unified han</desc></character>
-<character hex="22 33 3B"><unientity>6422</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 3D"><unientity>6421</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 44"><unientity>6430</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 45"><unientity>6441</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 48"><unientity>6435</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 4C"><unientity>6409</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 51"><unientity>640A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 53"><unientity>6440</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 59"><unientity>6407</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 5B"><unientity>643B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 5D"><unientity>643F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 68"><unientity>645B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 6A"><unientity>644F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 6C"><unientity>646B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 6F"><unientity>6476</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 76"><unientity>6474</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 78"><unientity>647D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 33 7B"><unientity>6473</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 23"><unientity>644E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 24"><unientity>6464</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 27"><unientity>6482</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 28"><unientity>645E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 2C"><unientity>647B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 2E"><unientity>645C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 3C"><unientity>649D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 3F"><unientity>6499</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 42"><unientity>648F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 4D"><unientity>6496</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 4E"><unientity>64A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 54"><unientity>6490</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 5B"><unientity>64B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 61"><unientity>6498</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 62"><unientity>649F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 65"><unientity>E9EA</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 34 66"><unientity>64B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 6A"><unientity>64D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 6C"><unientity>64D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 74"><unientity>64BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 34 75"><unientity>64D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 2A"><unientity>64EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 2D"><unientity>64E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 2E"><unientity>64E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 31"><unientity>64EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 33"><unientity>64E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 36"><unientity>64ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 38"><unientity>64E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 42"><unientity>64F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 46"><unientity>6504</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 4B"><unientity>64FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 4F"><unientity>6508</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 53"><unientity>6509</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 59"><unientity>651A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 5B"><unientity>6516</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 61"><unientity>651B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 69"><unientity>6527</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 6D"><unientity>6522</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 6F"><unientity>6529</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 72"><unientity>6525</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 77"><unientity>652E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 35 7C"><unientity>6541</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 2C"><unientity>6538</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 34"><unientity>6542</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 36"><unientity>6549</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 3E"><unientity>6554</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 3F"><unientity>6555</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 45"><unientity>6567</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 47"><unientity>6561</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 4F"><unientity>656D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 54"><unientity>657A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 64"><unientity>6585</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 6E"><unientity>658C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 70"><unientity>6592</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 71"><unientity>6595</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 75"><unientity>659B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 77"><unientity>659D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 36 7A"><unientity>65A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 22"><unientity>65A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 23"><unientity>65A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 27"><unientity>65AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 2A"><unientity>65B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 2C"><unientity>65B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 2F"><unientity>65BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 31"><unientity>65C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 32"><unientity>65C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 33"><unientity>65C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 34"><unientity>65C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 3B"><unientity>65D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 3C"><unientity>65D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 44"><unientity>65DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 45"><unientity>65DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 47"><unientity>65DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 48"><unientity>65DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 4A"><unientity>65E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 4E"><unientity>65E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 54"><unientity>65F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 55"><unientity>65F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 5A"><unientity>6609</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 5B"><unientity>65FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 5C"><unientity>65FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 5E"><unientity>660A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 64"><unientity>6603</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 6A"><unientity>6611</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 6B"><unientity>6615</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 6D"><unientity>6604</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 6E"><unientity>6631</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 72"><unientity>6621</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 75"><unientity>662C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 77"><unientity>6635</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 7C"><unientity>661E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 37 7D"><unientity>663A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 27"><unientity>6633</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 28"><unientity>662B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 2B"><unientity>6634</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 2C"><unientity>6624</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 31"><unientity>6645</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 32"><unientity>665F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 3D"><unientity>6665</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 3E"><unientity>665C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 3F"><unientity>6661</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 48"><unientity>665B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 49"><unientity>6659</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 4A"><unientity>6667</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 4C"><unientity>665E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 4D"><unientity>6657</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 50"><unientity>667E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 51"><unientity>666C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 5A"><unientity>6678</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 60"><unientity>6673</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 66"><unientity>666D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 68"><unientity>6677</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 70"><unientity>6684</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 71"><unientity>668C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 72"><unientity>6693</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 75"><unientity>668B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 76"><unientity>6690</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 79"><unientity>6694</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 7A"><unientity>668A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 7C"><unientity>6698</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 38 7D"><unientity>668D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 24"><unientity>7A25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 2A"><unientity>66A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 30"><unientity>5C21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 32"><unientity>669D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 3A"><unientity>66B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 40"><unientity>66B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 41"><unientity>66AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 43"><unientity>66AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 47"><unientity>66B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 4E"><unientity>66C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 4F"><unientity>66BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 54"><unientity>66C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 55"><unientity>66C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 5A"><unientity>66BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 5C"><unientity>66C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 60"><unientity>66CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 71"><unientity>66DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 72"><unientity>66DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 73"><unientity>66E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 76"><unientity>66E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 78"><unientity>66E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 39 7C"><unientity>66E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 28"><unientity>6705</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 30"><unientity>670F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 31"><unientity>6710</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 33"><unientity>6712</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 34"><unientity>6713</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 38"><unientity>6719</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 39"><unientity>6718</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 47"><unientity>6723</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 4C"><unientity>673E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 4E"><unientity>673F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 58"><unientity>6757</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 5B"><unientity>6745</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 5C"><unientity>6747</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 60"><unientity>675D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 61"><unientity>6755</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 66"><unientity>674C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 67"><unientity>6759</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 68"><unientity>6748</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 6B"><unientity>6763</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 6E"><unientity>6753</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 71"><unientity>674A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 75"><unientity>6793</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 78"><unientity>677C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 7A"><unientity>679F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3A 7C"><unientity>6785</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 21"><unientity>677B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 22"><unientity>6792</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 23"><unientity>6776</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 25"><unientity>6791</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 26"><unientity>6799</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 28"><unientity>67A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 2E"><unientity>678F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 30"><unientity>6772</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 31"><unientity>E963</unientity><unientityalt>6798</unientityalt><desc>Variant of 4C3B31 which maps to 6798</desc></character>
-<character hex="22 3B 32"><unientity>676A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 39"><unientity>67AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 3B"><unientity>67A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 3F"><unientity>67A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 44"><unientity>67F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 48"><unientity>678D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 49"><unientity>678C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 4C"><unientity>67FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 4E"><unientity>6810</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 51"><unientity>67C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 54"><unientity>67CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 58"><unientity>67C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 5C"><unientity>67BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 5F"><unientity>67B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 60"><unientity>6803</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 61"><unientity>67F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 63"><unientity>67D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 64"><unientity>67B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 6D"><unientity>6802</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 6F"><unientity>67E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 70"><unientity>67D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 71"><unientity>67DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 72"><unientity>67B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 74"><unientity>67DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 75"><unientity>67F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 77"><unientity>67B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 78"><unientity>6806</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 79"><unientity>67AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 7A"><unientity>67F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 7C"><unientity>67EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 7D"><unientity>6AAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3B 7E"><unientity>67B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 21"><unientity>67B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 23"><unientity>67C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 24"><unientity>67E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 26"><unientity>67CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 28"><unientity>67CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 29"><unientity>67E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 2A"><unientity>67F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 2B"><unientity>67C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 2D"><unientity>67DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 2F"><unientity>67E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 30"><unientity>6849</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 31"><unientity>683E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 36"><unientity>6814</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 37"><unientity>684B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 38"><unientity>681E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 3B"><unientity>6833</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 40"><unientity>6831</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 41"><unientity>6832</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 42"><unientity>6835</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 43"><unientity>683B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 44"><unientity>684E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 47"><unientity>682B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 48"><unientity>682D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 4A"><unientity>684D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 4F"><unientity>6844</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 55"><unientity>685D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 56"><unientity>685E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 58"><unientity>6834</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 59"><unientity>6812</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 65"><unientity>685A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 68"><unientity>686B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 69"><unientity>686C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 6B"><unientity>6879</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 6E"><unientity>68B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 71"><unientity>689B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 72"><unientity>687E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 74"><unientity>68B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 76"><unientity>6882</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3C 7A"><unientity>6890</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 21"><unientity>6872</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 22"><unientity>689C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 25"><unientity>686D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 2E"><unientity>68A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 30"><unientity>6898</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 32"><unientity>688B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 33"><unientity>68A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 34"><unientity>686F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 39"><unientity>68A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 3B"><unientity>6874</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 3C"><unientity>6875</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 3F"><unientity>6877</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 40"><unientity>688F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 43"><unientity>687B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 44"><unientity>688E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 4B"><unientity>68B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 50"><unientity>692C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 51"><unientity>6917</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 53"><unientity>690C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 56"><unientity>690B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 58"><unientity>68D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 59"><unientity>6904</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 5B"><unientity>690A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 5C"><unientity>6909</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 5D"><unientity>6929</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 62"><unientity>68EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 63"><unientity>692A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 64"><unientity>68EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 65"><unientity>681F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 66"><unientity>7439</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 6A"><unientity>6910</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 6E"><unientity>68D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 6F"><unientity>68EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 73"><unientity>68F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 78"><unientity>68FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 79"><unientity>68FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 7B"><unientity>68F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3D 7C"><unientity>6913</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 21"><unientity>6907</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 23"><unientity>691A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 24"><unientity>6919</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 2A"><unientity>68DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 2B"><unientity>691B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 2D"><unientity>68FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 33"><unientity>68E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 37"><unientity>68D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 38"><unientity>68D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 39"><unientity>6908</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 3E"><unientity>68E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 3F"><unientity>68F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 40"><unientity>68C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 44"><unientity>6911</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 46"><unientity>68D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 47"><unientity>68EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 49"><unientity>68C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 4B"><unientity>68C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 53"><unientity>6974</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 55"><unientity>6938</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 58"><unientity>6962</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 5D"><unientity>6958</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 5F"><unientity>6957</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 60"><unientity>693F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 61"><unientity>6971</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 64"><unientity>6945</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 65"><unientity>695D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 66"><unientity>6932</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 69"><unientity>696E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 6A"><unientity>6963</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 6B"><unientity>6948</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 6E"><unientity>6939</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 70"><unientity>696A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 73"><unientity>6937</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 7A"><unientity>696C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 7B"><unientity>694E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 7D"><unientity>6980</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3E 7E"><unientity>6933</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 21"><unientity>6952</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 25"><unientity>695B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 2D"><unientity>6985</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 32"><unientity>693D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 35"><unientity>6978</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 37"><unientity>697B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 3A"><unientity>6934</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 3B"><unientity>6969</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 3D"><unientity>6944</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 3E"><unientity>696F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 44"><unientity>698A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 45"><unientity>69A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 46"><unientity>69B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 50"><unientity>69CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 51"><unientity>69CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 59"><unientity>698D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 5A"><unientity>6991</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 5C"><unientity>69AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 60"><unientity>69BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 61"><unientity>69A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 65"><unientity>699E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 68"><unientity>69D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 6A"><unientity>698E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 6D"><unientity>69D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 75"><unientity>69A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 77"><unientity>69BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 78"><unientity>69D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 7A"><unientity>69F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 3F 7E"><unientity>69D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 27"><unientity>69BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 2D"><unientity>69A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 2E"><unientity>69A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 34"><unientity>69D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 38"><unientity>69C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 3D"><unientity>6A12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 3E"><unientity>6A11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 41"><unientity>6A00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 46"><unientity>69E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 4B"><unientity>6A0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 4C"><unientity>69E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 4D"><unientity>69E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 50"><unientity>69FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 54"><unientity>6A17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 56"><unientity>69E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 57"><unientity>69EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 5B"><unientity>69F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 5E"><unientity>6A2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 5F"><unientity>69FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 60"><unientity>6A20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 64"><unientity>69ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 67"><unientity>6A1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 68"><unientity>6A2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 6E"><unientity>6A18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 72"><unientity>6A1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 75"><unientity>6A0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 76"><unientity>6A0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 40 7C"><unientity>69EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 23"><unientity>69F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 24"><unientity>69F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 28"><unientity>6A14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 29"><unientity>6A63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 37"><unientity>6A67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 39"><unientity>6A43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 3A"><unientity>6A33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 3B"><unientity>6A32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 3C"><unientity>6A5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 3F"><unientity>6A28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 40"><unientity>6A48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 41"><unientity>6A50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 42"><unientity>6A52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 43"><unientity>6A72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 45"><unientity>6A3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 46"><unientity>6A77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 47"><unientity>6A5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 4A"><unientity>6A5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 4B"><unientity>6A5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 4F"><unientity>6A51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 51"><unientity>6A56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 53"><unientity>6A36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 56"><unientity>6A7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 58"><unientity>6A3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 6C"><unientity>69F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 6D"><unientity>6A64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 73"><unientity>6A8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 75"><unientity>6AA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 77"><unientity>6AA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 79"><unientity>6A96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 41 7E"><unientity>6A7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 22"><unientity>6A7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 23"><unientity>6A89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 24"><unientity>6A91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 26"><unientity>6A9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 2A"><unientity>6A92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 2B"><unientity>6AA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 34"><unientity>6A99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 35"><unientity>6A9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 36"><unientity>6A7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 37"><unientity>6A9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 42"><unientity>6AA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 47"><unientity>6A90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 49"><unientity>6A9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 4A"><unientity>6A87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 4B"><unientity>6A8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 51"><unientity>6AAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 55"><unientity>6AC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 57"><unientity>6AAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 5D"><unientity>6ABF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 64"><unientity>6ACA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 68"><unientity>6AB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 79"><unientity>6AE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 42 7E"><unientity>6AED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 25"><unientity>6ACC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 28"><unientity>6AD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 33"><unientity>6ADF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 34"><unientity>6ACD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 35"><unientity>6ADE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 37"><unientity>6AEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 39"><unientity>6AF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 3A"><unientity>6AE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 3F"><unientity>6AEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 40"><unientity>6AEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 44"><unientity>6AF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 45"><unientity>6AE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 48"><unientity>6AF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 4E"><unientity>6AFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 50"><unientity>6AFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 52"><unientity>6B01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 58"><unientity>6B03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 59"><unientity>6AF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 5F"><unientity>6B0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 60"><unientity>6B09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 61"><unientity>6B0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 67"><unientity>6B11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 6D"><unientity>6B19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 6E"><unientity>6B17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 72"><unientity>6B1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 43 7E"><unientity>6B2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 2A"><unientity>6B35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 2C"><unientity>6B37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 2D"><unientity>6B3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 32"><unientity>6B39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 35"><unientity>6B3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 37"><unientity>6B46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 38"><unientity>6B41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 3A"><unientity>6B40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 3B"><unientity>6B42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 3C"><unientity>6B43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 3E"><unientity>6B48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 3F"><unientity>6B4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 46"><unientity>E964</unientity><unientityalt>6B4E</unientityalt><desc>Variant of 4C4446 which maps to 6B4E</desc></character>
-<character hex="22 44 4A"><unientity>6B57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 4C"><unientity>6B54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 4E"><unientity>6B55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 51"><unientity>6B5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 53"><unientity>6B5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 54"><unientity>6B60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 5B"><unientity>6B6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 5D"><unientity>6B6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 5F"><unientity>6B6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 61"><unientity>6B71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 6B"><unientity>6B7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 71"><unientity>6B82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 73"><unientity>6B84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 79"><unientity>6B8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 44 7B"><unientity>6B95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 25"><unientity>6B99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 29"><unientity>6B9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 35"><unientity>6BA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 36"><unientity>6BA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 38"><unientity>6BAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 39"><unientity>6BAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 3B"><unientity>6BAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 3D"><unientity>6BB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 3F"><unientity>6BB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 47"><unientity>6BBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 4D"><unientity>6996</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 54"><unientity>6BC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 5B"><unientity>6BD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 60"><unientity>6BDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 62"><unientity>6BDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 63"><unientity>6BDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 65"><unientity>6BDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 6F"><unientity>6BE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 70"><unientity>6BEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 45 71"><unientity>6BE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 2A"><unientity>6BF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 2C"><unientity>6BF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 33"><unientity>6BF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 37"><unientity>6BFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 38"><unientity>6BF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 42"><unientity>6BFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 44"><unientity>6C06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 48"><unientity>6C04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 4A"><unientity>6C05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 4C"><unientity>6C08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 51"><unientity>6C0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 52"><unientity>6C0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 59"><unientity>6C15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 5A"><unientity>6C18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 5B"><unientity>6C19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 5C"><unientity>6C1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 5E"><unientity>6C1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 60"><unientity>6C20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 62"><unientity>6C21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 64"><unientity>6C2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 66"><unientity>6C2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 67"><unientity>6C30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 68"><unientity>6C2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 69"><unientity>E9EB</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 46 70"><unientity>6C3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 74"><unientity>6C3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 78"><unientity>6C46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 7A"><unientity>6C52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 7B"><unientity>6C62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 46 7C"><unientity>6C4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 24"><unientity>6C5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 26"><unientity>6C5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 27"><unientity>6C4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 2B"><unientity>6C4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 2C"><unientity>6C54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 2D"><unientity>6C63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 30"><unientity>6C78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 31"><unientity>6C74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 32"><unientity>6C86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 33"><unientity>6C76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 38"><unientity>6C6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 39"><unientity>6C67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 3B"><unientity>6C84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 3E"><unientity>6C94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 40"><unientity>6C8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 42"><unientity>6C65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 47"><unientity>6C6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 49"><unientity>6C9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 4A"><unientity>6C69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 4B"><unientity>6C9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 4C"><unientity>6C6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 4D"><unientity>6C93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 51"><unientity>6C87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 52"><unientity>6C6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 56"><unientity>6C95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 5A"><unientity>6C82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 5C"><unientity>6CA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 62"><unientity>6CEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 63"><unientity>6CEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 64"><unientity>6CC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 66"><unientity>6CEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 67"><unientity>6CAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 6E"><unientity>E965</unientity><unientityalt>6CAD</unientityalt><desc>Variant of 4C476E which maps to 6CAD</desc></character>
-<character hex="22 47 70"><unientity>6CAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 72"><unientity>6CF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 7A"><unientity>6CBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 7B"><unientity>7553</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 47 7D"><unientity>6CC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 24"><unientity>6CD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 26"><unientity>6CC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 28"><unientity>6CCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 29"><unientity>6CE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 2D"><unientity>6CF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 2F"><unientity>6CE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 30"><unientity>6CD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 32"><unientity>6CD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 33"><unientity>6CB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 37"><unientity>6D1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 3B"><unientity>6D28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 44"><unientity>6D39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 4D"><unientity>6D26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 4E"><unientity>6D27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 4F"><unientity>6D0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 50"><unientity>6D0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 51"><unientity>6D3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 5A"><unientity>6D07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 5B"><unientity>6D04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 5C"><unientity>6CDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 60"><unientity>6D2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 61"><unientity>6D35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 62"><unientity>6D3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 64"><unientity>6D19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 67"><unientity>6D0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 6A"><unientity>6D2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 6B"><unientity>6D11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 6C"><unientity>6D00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 6D"><unientity>6D24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 6F"><unientity>6D33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 73"><unientity>6D63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 77"><unientity>6DA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 48 7D"><unientity>6D92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 25"><unientity>6D6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 26"><unientity>6D6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 28"><unientity>6D61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 29"><unientity>6D91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 2C"><unientity>6D81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 2E"><unientity>6D8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 2F"><unientity>E966</unientity><unientityalt>6D34</unientityalt><desc>Variant of 34492F which maps to 6D34</desc></character>
-<character hex="22 49 34"><unientity>6D79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 35"><unientity>6DEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 39"><unientity>6D7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 3B"><unientity>6D85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 3C"><unientity>6D65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 3E"><unientity>6D5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 40"><unientity>6D67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 43"><unientity>6D94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 46"><unientity>6D60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 48"><unientity>6D98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 4B"><unientity>6D7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 4C"><unientity>6D70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 4F"><unientity>6D96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 59"><unientity>6DAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 5A"><unientity>6DB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 5C"><unientity>6DAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 60"><unientity>6DEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 6A"><unientity>6DAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 6B"><unientity>6DB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 6C"><unientity>6DE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 6D"><unientity>6DD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 6E"><unientity>6DE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 71"><unientity>6DF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 79"><unientity>6E0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 49 7B"><unientity>6DBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 2A"><unientity>6DDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 2D"><unientity>6DD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 32"><unientity>6DFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 35"><unientity>6DDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 36"><unientity>6DDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 39"><unientity>6DDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 3D"><unientity>6DA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 44"><unientity>6E12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 46"><unientity>6DF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 4A"><unientity>6DE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 4C"><unientity>6E1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 50"><unientity>6E27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 55"><unientity>6E49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 58"><unientity>6E3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 60"><unientity>6E8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 62"><unientity>6E4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 66"><unientity>6E62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 6A"><unientity>6E51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 6B"><unientity>6E44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 6D"><unientity>6E63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 71"><unientity>6E73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 74"><unientity>6E4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4A 77"><unientity>6E4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 22"><unientity>6E28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 24"><unientity>6E5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 26"><unientity>6E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 28"><unientity>6E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 2C"><unientity>6E84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 2E"><unientity>6E2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 30"><unientity>6E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 31"><unientity>6E5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 32"><unientity>6E72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 33"><unientity>6E30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 34"><unientity>6E53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 36"><unientity>6E39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 37"><unientity>6E71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 38"><unientity>6E69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 39"><unientity>6E6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 3B"><unientity>6E8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 3E"><unientity>6E76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 40"><unientity>6E2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 41"><unientity>6E4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 42"><unientity>6E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 43"><unientity>6ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 45"><unientity>6E9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 46"><unientity>6E9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 48"><unientity>6EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 49"><unientity>6ED8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 4A"><unientity>6E8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 4D"><unientity>6E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 4F"><unientity>6EA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 51"><unientity>6EB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 57"><unientity>6EA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 59"><unientity>6E92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 5A"><unientity>6EA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 5E"><unientity>6E8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 60"><unientity>6ED9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 61"><unientity>6EBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 63"><unientity>6EC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 69"><unientity>6EBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 6A"><unientity>6EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 6C"><unientity>6EB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 6D"><unientity>6EB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 75"><unientity>6EA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 79"><unientity>6ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 7C"><unientity>6ECA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4B 7D"><unientity>6ED5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 21"><unientity>6EC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 24"><unientity>6EB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 26"><unientity>6EB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 29"><unientity>6EB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 2E"><unientity>6EF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 30"><unientity>6F37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 34"><unientity>6EFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 35"><unientity>6F09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 3C"><unientity>6F3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 3D"><unientity>6F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 3E"><unientity>6F12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 3F"><unientity>6F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 41"><unientity>6F1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 42"><unientity>6EF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 43"><unientity>6F19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 44"><unientity>6F00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 4B"><unientity>6F24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 51"><unientity>6F18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 57"><unientity>6F1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 5A"><unientity>6F0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 5E"><unientity>6F36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 60"><unientity>6EF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 61"><unientity>6EEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 62"><unientity>6F41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 64"><unientity>6F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 65"><unientity>6F2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 67"><unientity>6F34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 6B"><unientity>6F49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 6D"><unientity>6F30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 76"><unientity>6EFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 77"><unientity>6EEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 78"><unientity>6F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 79"><unientity>6F0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4C 7B"><unientity>6F35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 23"><unientity>6F7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 24"><unientity>6F9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 27"><unientity>6F87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 2B"><unientity>6F6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 2F"><unientity>6F5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 30"><unientity>6F60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 35"><unientity>6F90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 37"><unientity>6F8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 39"><unientity>6F92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 3A"><unientity>6F89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 3C"><unientity>6F8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 3D"><unientity>E967</unientity><unientityalt>6F62</unientityalt><desc>Variant of 4C4D3D which maps to 6F62</desc></character>
-<character hex="22 4D 44"><unientity>6F0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 4B"><unientity>6F6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 4D"><unientity>6F8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 58"><unientity>6E88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 5A"><unientity>6F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 5F"><unientity>6F72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 62"><unientity>6F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 63"><unientity>6F5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 68"><unientity>6F5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 73"><unientity>6FB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 74"><unientity>6F9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 79"><unientity>6FA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 7C"><unientity>6FC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4D 7D"><unientity>6FBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 21"><unientity>6FAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 25"><unientity>6FBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 26"><unientity>6FC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 2D"><unientity>6FC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 2E"><unientity>6F5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 2F"><unientity>6FC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 30"><unientity>6FA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 32"><unientity>6FCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 35"><unientity>6FB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 37"><unientity>6FAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 3C"><unientity>6FA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 40"><unientity>6FA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 41"><unientity>6FB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 42"><unientity>6FAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 43"><unientity>6FD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 44"><unientity>6FDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 50"><unientity>6FD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 56"><unientity>6FE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 57"><unientity>6FF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 5D"><unientity>6FDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 5E"><unientity>6FEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 62"><unientity>6FF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 66"><unientity>7005</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 67"><unientity>700C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 6A"><unientity>700D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4E 72"><unientity>7026</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 24"><unientity>7020</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 26"><unientity>7027</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 2B"><unientity>E968</unientity><unientityalt>701E</unientityalt><desc>Variant of 4C4F2B which maps to 701E</desc></character>
-<character hex="22 4F 2F"><unientity>702E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 31"><unientity>702D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 35"><unientity>7021</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 39"><unientity>7018</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 3A"><unientity>7023</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 41"><unientity>703C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 44"><unientity>7035</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 51"><unientity>7034</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 53"><unientity>7039</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 54"><unientity>703A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 5D"><unientity>7043</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 61"><unientity>7044</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 67"><unientity>7047</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 69"><unientity>7049</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 6B"><unientity>7055</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 71"><unientity>7052</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 73"><unientity>705C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 78"><unientity>7059</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 7B"><unientity>705E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 7C"><unientity>7061</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 4F 7D"><unientity>705D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 21"><unientity>9E02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 25"><unientity>7066</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 27"><unientity>7065</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 28"><unientity>7068</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 29"><unientity>7054</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 39"><unientity>7074</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 3B"><unientity>707A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 40"><unientity>7093</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 42"><unientity>7086</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 48"><unientity>E9EC</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 50 49"><unientity>7084</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 4A"><unientity>7081</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 56"><unientity>7088</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 57"><unientity>7098</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 59"><unientity>708C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 5C"><unientity>70B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 62"><unientity>70A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 63"><unientity>70A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 68"><unientity>7551</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 6F"><unientity>70A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 70"><unientity>79CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 71"><unientity>70B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 72"><unientity>70BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 73"><unientity>70A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 78"><unientity>70EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 7B"><unientity>70E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 7C"><unientity>70DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 50 7D"><unientity>70D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 22"><unientity>70DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 23"><unientity>70E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 26"><unientity>70E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 28"><unientity>70E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 2B"><unientity>70D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 2E"><unientity>70D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 38"><unientity>70CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 3A"><unientity>70D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 3B"><unientity>70C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 3C"><unientity>70DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 3D"><unientity>70C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 3F"><unientity>70FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 42"><unientity>70F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 44"><unientity>7104</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 48"><unientity>70F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 4A"><unientity>7110</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 4C"><unientity>7103</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 50"><unientity>70F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 55"><unientity>7111</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 56"><unientity>7112</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 5C"><unientity>710C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 60"><unientity>70F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 66"><unientity>7113</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 67"><unientity>70EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 68"><unientity>7100</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 6C"><unientity>711E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 6D"><unientity>7134</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 6E"><unientity>7120</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 6F"><unientity>713F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 74"><unientity>7131</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 51 75"><unientity>712D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 27"><unientity>7139</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 28"><unientity>7135</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 2C"><unientity>713B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 2E"><unientity>711C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 32"><unientity>713D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 35"><unientity>712F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 3B"><unientity>7129</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 43"><unientity>712E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 48"><unientity>7177</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 51"><unientity>7146</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 52"><unientity>7152</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 54"><unientity>714F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 55"><unientity>715D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 56"><unientity>7141</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 57"><unientity>7160</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 59"><unientity>7175</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 5A"><unientity>7173</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 5C"><unientity>7143</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 5D"><unientity>715A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 5E"><unientity>7176</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 60"><unientity>714B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 62"><unientity>7147</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 65"><unientity>7168</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 66"><unientity>7171</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 67"><unientity>715F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 69"><unientity>7150</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 6B"><unientity>7153</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 70"><unientity>7144</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 76"><unientity>7172</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 78"><unientity>7178</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 7B"><unientity>7187</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 52 7C"><unientity>717B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 23"><unientity>7192</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 2B"><unientity>7180</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 2C"><unientity>7189</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 32"><unientity>7185</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 33"><unientity>7196</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 36"><unientity>717C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 39"><unientity>7198</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 3C"><unientity>7197</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 3E"><unientity>71B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 3F"><unientity>71A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 42"><unientity>71A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 46"><unientity>719E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 47"><unientity>71B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 4A"><unientity>719B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 4E"><unientity>71AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 51"><unientity>71A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 52"><unientity>71A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 55"><unientity>719A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 57"><unientity>71B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 59"><unientity>71B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 67"><unientity>71D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 69"><unientity>71C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 6A"><unientity>71B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 6D"><unientity>71CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 6F"><unientity>71CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 70"><unientity>71D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 72"><unientity>71BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 75"><unientity>71C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 77"><unientity>71C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 7A"><unientity>71BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 53 7C"><unientity>71B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 21"><unientity>71DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 22"><unientity>71C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 24"><unientity>71C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 26"><unientity>71D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 29"><unientity>71CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 2A"><unientity>71DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 32"><unientity>71EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 36"><unientity>71E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 3A"><unientity>71F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 3D"><unientity>71F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 3F"><unientity>71E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 47"><unientity>71E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 4B"><unientity>720C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 4F"><unientity>71FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 56"><unientity>71F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 5B"><unientity>720E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 5C"><unientity>5911</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 5E"><unientity>720A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 60"><unientity>7217</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 61"><unientity>7207</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 66"><unientity>7215</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 69"><unientity>7213</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 6E"><unientity>7218</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 71"><unientity>720B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 79"><unientity>721A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 54 7D"><unientity>721F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 21"><unientity>721D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 29"><unientity>7225</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 2A"><unientity>7226</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 41"><unientity>723F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 43"><unientity>7241</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 44"><unientity>7242</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 4F"><unientity>7250</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 51"><unientity>724F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 52"><unientity>7253</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 53"><unientity>7255</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 56"><unientity>725A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 59"><unientity>7263</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 61"><unientity>7273</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 63"><unientity>726E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 66"><unientity>7276</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 68"><unientity>7277</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 6B"><unientity>727E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 6D"><unientity>727C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 71"><unientity>727F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 74"><unientity>7289</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 55 7C"><unientity>728B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 22"><unientity>728D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 28"><unientity>728F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 48"><unientity>72A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 4C"><unientity>72AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 4E"><unientity>72B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 4F"><unientity>72B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 51"><unientity>72C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 52"><unientity>72B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 56"><unientity>72BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 58"><unientity>72C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 5B"><unientity>72C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 60"><unientity>72D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 64"><unientity>72D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 67"><unientity>72C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 6C"><unientity>72CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 6E"><unientity>72DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 6F"><unientity>72CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 73"><unientity>72E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 76"><unientity>72EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 79"><unientity>72E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 56 7E"><unientity>72FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 24"><unientity>72F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 25"><unientity>72FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 29"><unientity>7302</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 2C"><unientity>72FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 2D"><unientity>7301</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 2E"><unientity>72F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 31"><unientity>731D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 35"><unientity>730B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 36"><unientity>7317</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 3B"><unientity>7307</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 3E"><unientity>7318</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 42"><unientity>731E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 46"><unientity>7331</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 49"><unientity>7338</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 4A"><unientity>7322</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 4C"><unientity>7332</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 4D"><unientity>732C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 4E"><unientity>7327</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 4F"><unientity>732B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 52"><unientity>732F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 55"><unientity>7328</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 5A"><unientity>7347</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 5B"><unientity>7348</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 5C"><unientity>7349</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 5F"><unientity>733B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 62"><unientity>733A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 65"><unientity>7340</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 68"><unientity>734D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 6B"><unientity>7352</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 72"><unientity>735E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 74"><unientity>735D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 79"><unientity>7360</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 7B"><unientity>7358</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 57 7E"><unientity>7362</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 21"><unientity>734B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 25"><unientity>7367</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 29"><unientity>736C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 2B"><unientity>736B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 2F"><unientity>736F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 36"><unientity>737C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 38"><unientity>737E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 3B"><unientity>7381</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 3F"><unientity>7388</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 42"><unientity>738E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 46"><unientity>7395</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 47"><unientity>7392</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 48"><unientity>7397</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 4C"><unientity>7393</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 4D"><unientity>7394</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 51"><unientity>739E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 52"><unientity>73A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 5D"><unientity>73A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 62"><unientity>73A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 63"><unientity>73A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 67"><unientity>73B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 68"><unientity>73CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 6A"><unientity>73C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 6B"><unientity>73D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 6F"><unientity>73BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 70"><unientity>73C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 58 7D"><unientity>73CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 21"><unientity>73D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 27"><unientity>73EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 28"><unientity>73E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 2A"><unientity>73D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 2B"><unientity>73EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 2F"><unientity>73D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 30"><unientity>73DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 32"><unientity>73D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 35"><unientity>73BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 36"><unientity>73E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 38"><unientity>73E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 3A"><unientity>73DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 3C"><unientity>73E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 3F"><unientity>73E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 45"><unientity>73F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 47"><unientity>73FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 4A"><unientity>73F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 54"><unientity>73F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 5A"><unientity>73FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 5C"><unientity>7407</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 5E"><unientity>7412</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 63"><unientity>743C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 66"><unientity>742E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 67"><unientity>742F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 69"><unientity>7414</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 6A"><unientity>742C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 6C"><unientity>7430</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 6E"><unientity>742B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 70"><unientity>73F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 71"><unientity>741A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 78"><unientity>7416</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 59 7A"><unientity>7426</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 21"><unientity>7428</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 23"><unientity>7429</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 28"><unientity>7420</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 2A"><unientity>741B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 2B"><unientity>7424</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 2C"><unientity>7432</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 2D"><unientity>742D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 30"><unientity>7415</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 32"><unientity>743B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 36"><unientity>7444</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 40"><unientity>7447</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 43"><unientity>7458</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 45"><unientity>7442</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 47"><unientity>744B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 4A"><unientity>744A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 4F"><unientity>7452</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 55"><unientity>7457</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 56"><unientity>7451</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 5A"><unientity>745D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 5B"><unientity>7454</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 5D"><unientity>7440</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 60"><unientity>746D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 61"><unientity>7462</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 62"><unientity>7473</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 68"><unientity>7474</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 69"><unientity>746E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 6A"><unientity>7471</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 6B"><unientity>7468</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 78"><unientity>7460</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 79"><unientity>7472</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 7A"><unientity>7484</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 7B"><unientity>7487</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5A 7E"><unientity>7488</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 21"><unientity>7489</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 22"><unientity>747C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 27"><unientity>7482</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 28"><unientity>747E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 2A"><unientity>748A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 2D"><unientity>7486</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 30"><unientity>747A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 38"><unientity>7480</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 3C"><unientity>7481</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 3E"><unientity>747D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 3F"><unientity>7485</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 40"><unientity>7497</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 43"><unientity>7498</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 45"><unientity>749A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 4D"><unientity>74A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 54"><unientity>749F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 55"><unientity>749D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 56"><unientity>748D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 57"><unientity>749E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 59"><unientity>74A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 5D"><unientity>74A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 60"><unientity>74B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 61"><unientity>74B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 66"><unientity>74B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 67"><unientity>74AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 69"><unientity>74AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 6A"><unientity>7490</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 6C"><unientity>74A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 6E"><unientity>74A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 76"><unientity>74B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5B 7A"><unientity>74C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 25"><unientity>74BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 28"><unientity>74B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 29"><unientity>74BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 30"><unientity>74C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 31"><unientity>74C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 32"><unientity>74CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 38"><unientity>74D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 3A"><unientity>74D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 3D"><unientity>74D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 40"><unientity>74DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 41"><unientity>74DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 47"><unientity>74DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 50"><unientity>74E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 52"><unientity>74E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 54"><unientity>74E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 58"><unientity>74F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 5A"><unientity>74F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 5C"><unientity>74EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 61"><unientity>74F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 63"><unientity>74F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 66"><unientity>74FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 67"><unientity>74FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 71"><unientity>7505</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 77"><unientity>7503</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5C 7D"><unientity>7507</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 25"><unientity>750E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 28"><unientity>750D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 2C"><unientity>7511</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 2D"><unientity>750F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 32"><unientity>7512</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 33"><unientity>7513</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 39"><unientity>7517</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 42"><unientity>7521</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 44"><unientity>7524</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 49"><unientity>752F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 4D"><unientity>753A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 4F"><unientity>753F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 51"><unientity>7540</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 52"><unientity>753E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 55"><unientity>754A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 57"><unientity>754E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 58"><unientity>7547</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 59"><unientity>754B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 5A"><unientity>7548</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 5F"><unientity>755F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 60"><unientity>755B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 62"><unientity>7564</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 67"><unientity>7563</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 69"><unientity>756F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 6B"><unientity>756C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 6D"><unientity>7579</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 6E"><unientity>757A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 71"><unientity>7577</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 75"><unientity>7571</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 79"><unientity>757D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5D 7E"><unientity>757F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 25"><unientity>7583</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 2C"><unientity>7590</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 2D"><unientity>7592</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 2E"><unientity>7594</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 31"><unientity>7595</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 35"><unientity>7598</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 37"><unientity>75A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 3B"><unientity>75A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 3E"><unientity>75BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 43"><unientity>75B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 44"><unientity>75C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 46"><unientity>75BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 47"><unientity>75B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 4A"><unientity>75C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 4E"><unientity>75C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 50"><unientity>75B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 51"><unientity>75C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 58"><unientity>75CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 5C"><unientity>75CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 5E"><unientity>75CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 5F"><unientity>75D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 63"><unientity>75E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 66"><unientity>75E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 67"><unientity>75E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 71"><unientity>75E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 72"><unientity>75E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 73"><unientity>75D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 7A"><unientity>7602</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5E 7E"><unientity>7603</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 21"><unientity>75F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 22"><unientity>75FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 29"><unientity>7616</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 2C"><unientity>7608</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 2D"><unientity>7615</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 2E"><unientity>760C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 2F"><unientity>760F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 3B"><unientity>7610</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 3C"><unientity>760A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 3E"><unientity>7625</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 3F"><unientity>761A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 40"><unientity>761B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 47"><unientity>7619</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 48"><unientity>761E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 4C"><unientity>761D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 50"><unientity>7622</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 51"><unientity>762F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 54"><unientity>762D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 5C"><unientity>7633</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 5E"><unientity>763B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 5F"><unientity>7630</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 60"><unientity>763C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 62"><unientity>7635</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 67"><unientity>7648</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 68"><unientity>764E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 69"><unientity>7647</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 6A"><unientity>7643</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 6E"><unientity>764D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 6F"><unientity>7649</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 75"><unientity>7654</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 7A"><unientity>765C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 5F 7B"><unientity>7657</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 22"><unientity>7664</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 24"><unientity>7659</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 2B"><unientity>765F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 32"><unientity>7667</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 35"><unientity>766A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 37"><unientity>766D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 38"><unientity>766F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 3A"><unientity>7670</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 40"><unientity>7676</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 41"><unientity>7677</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 48"><unientity>7680</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 4A"><unientity>768B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 52"><unientity>7695</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 55"><unientity>656B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 59"><unientity>7699</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 5D"><unientity>769C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 5F"><unientity>769D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 65"><unientity>76A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 66"><unientity>76A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 67"><unientity>76A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 6A"><unientity>76AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 6D"><unientity>76AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 74"><unientity>76B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 60 77"><unientity>76BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 23"><unientity>76CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 26"><unientity>76CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 3B"><unientity>76E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 3C"><unientity>76E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 40"><unientity>76EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 44"><unientity>76ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 48"><unientity>76F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 4B"><unientity>7704</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 4F"><unientity>7708</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 50"><unientity>7707</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 53"><unientity>76F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 54"><unientity>770A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 59"><unientity>76FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 5E"><unientity>772B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 60"><unientity>770E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 62"><unientity>771B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 63"><unientity>7724</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 6C"><unientity>7722</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 6D"><unientity>771A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 6F"><unientity>7721</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 74"><unientity>7740</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 75"><unientity>7739</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 76"><unientity>772F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 61 77"><unientity>7731</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 22"><unientity>7725</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 25"><unientity>7735</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 26"><unientity>7734</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 2D"><unientity>7747</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 31"><unientity>7745</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 32"><unientity>774D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 33"><unientity>774A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 35"><unientity>7743</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 37"><unientity>774E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 3A"><unientity>775F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 3D"><unientity>7760</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 3E"><unientity>7752</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 42"><unientity>7758</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 44"><unientity>7756</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 45"><unientity>775A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 4F"><unientity>7762</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 52"><unientity>7780</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 56"><unientity>776F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 5D"><unientity>777E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 5F"><unientity>7785</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 60"><unientity>777A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 66"><unientity>E969</unientity><unientityalt>778B</unientityalt><desc>Variant of 4C6266 which maps to 778B</desc></character>
-<character hex="22 62 6A"><unientity>778D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 72"><unientity>7798</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 73"><unientity>7796</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 75"><unientity>77A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 76"><unientity>7799</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 7A"><unientity>77B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 62 7D"><unientity>77B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 23"><unientity>77B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 29"><unientity>77BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 2B"><unientity>77B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 2C"><unientity>77BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 35"><unientity>77CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 3A"><unientity>77D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 45"><unientity>77DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 46"><unientity>77DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 4F"><unientity>77E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 52"><unientity>77E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 55"><unientity>77EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 59"><unientity>77F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 5A"><unientity>77F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 5C"><unientity>77F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 60"><unientity>77FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 67"><unientity>77F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 68"><unientity>77FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 70"><unientity>7809</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 71"><unientity>7806</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 73"><unientity>7819</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 74"><unientity>7811</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 63 78"><unientity>7812</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 24"><unientity>781B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 26"><unientity>782C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 27"><unientity>7823</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 28"><unientity>782B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 2A"><unientity>7829</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 2D"><unientity>7822</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 31"><unientity>7835</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 32"><unientity>7833</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 33"><unientity>782E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 35"><unientity>7820</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 38"><unientity>783D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 3B"><unientity>781F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 3D"><unientity>7831</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 44"><unientity>784D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 48"><unientity>7848</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 49"><unientity>7853</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 4A"><unientity>7854</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 4B"><unientity>7845</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 4C"><unientity>7852</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 4E"><unientity>7850</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 4F"><unientity>7858</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 50"><unientity>7826</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 52"><unientity>7847</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 56"><unientity>784C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 5A"><unientity>7868</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 5B"><unientity>786D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 60"><unientity>7864</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 61"><unientity>785C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 64"><unientity>7876</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 66"><unientity>786A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 69"><unientity>7886</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 6B"><unientity>789A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 6C"><unientity>787F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 6D"><unientity>7887</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 70"><unientity>7894</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 76"><unientity>788F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 64 7E"><unientity>7899</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 29"><unientity>7893</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 2C"><unientity>7892</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 2D"><unientity>7896</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 2F"><unientity>78B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 31"><unientity>78A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 32"><unientity>78B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 39"><unientity>78B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 3B"><unientity>78A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 3E"><unientity>78B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 40"><unientity>78AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 41"><unientity>78A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 43"><unientity>789E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 44"><unientity>78A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 48"><unientity>78AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 4E"><unientity>78BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 55"><unientity>78CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 56"><unientity>78C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 58"><unientity>78D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 5A"><unientity>78D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 5E"><unientity>78C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 60"><unientity>78D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 68"><unientity>78DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 6A"><unientity>78E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 6E"><unientity>78DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 6F"><unientity>78E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 73"><unientity>78E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 76"><unientity>78EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 77"><unientity>78E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 79"><unientity>78F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 65 7E"><unientity>7905</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 21"><unientity>78F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 22"><unientity>78FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 27"><unientity>78FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 29"><unientity>78FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 2B"><unientity>7904</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 2E"><unientity>7912</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 32"><unientity>790C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 34"><unientity>7913</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 35"><unientity>7911</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 43"><unientity>791E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 46"><unientity>7922</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 4C"><unientity>7924</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 4D"><unientity>7927</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 50"><unientity>7929</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 55"><unientity>7931</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 5D"><unientity>7934</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 60"><unientity>7936</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 65"><unientity>793D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 67"><unientity>7942</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 68"><unientity>793F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 6A"><unientity>794A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 6B"><unientity>794D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 75"><unientity>7946</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 77"><unientity>7958</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 79"><unientity>795B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 7A"><unientity>795C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 7B"><unientity>794F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 7C"><unientity>7953</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 66 7D"><unientity>E9D0</unientity><unientityalt>7953</unientityalt><desc>Unrelated variant of EACC 22667C which maps to 7953</desc></character>
-<character hex="22 67 21"><unientity>7951</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 23"><unientity>7954</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 2A"><unientity>7967</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 2D"><unientity>796B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 30"><unientity>7972</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 3E"><unientity>797C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 4A"><unientity>7998</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 4B"><unientity>798A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 4D"><unientity>7999</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 4E"><unientity>7995</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 4F"><unientity>798B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 50"><unientity>7996</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 54"><unientity>7994</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 55"><unientity>7993</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 5C"><unientity>799A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 5F"><unientity>79A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 60"><unientity>799B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 61"><unientity>79A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 64"><unientity>799D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 6E"><unientity>79A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 70"><unientity>79AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 71"><unientity>79A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 75"><unientity>79B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 7A"><unientity>79B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 67 7B"><unientity>79B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 22"><unientity>79B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 23"><unientity>79BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 25"><unientity>79BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 28"><unientity>79C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 2A"><unientity>79C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 2D"><unientity>79D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 2E"><unientity>79D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 32"><unientity>79D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 3D"><unientity>79EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 3E"><unientity>E96A</unientity><unientityalt>79EB</unientityalt><desc>Variant of 4C683E which maps to 79EB</desc></character>
-<character hex="22 68 42"><unientity>79E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 44"><unientity>79DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 45"><unientity>79ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 48"><unientity>79F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 4F"><unientity>7A02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 50"><unientity>7A0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 54"><unientity>7A09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 5C"><unientity>7A03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 61"><unientity>7A0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 6B"><unientity>7A11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 6C"><unientity>7A18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 6F"><unientity>E96B</unientity><unientityalt>7A19</unientityalt><desc>Variant of 2E686F which maps to 7A19</desc></character>
-<character hex="22 68 71"><unientity>7A1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 76"><unientity>7A17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 68 7E"><unientity>7A2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 22"><unientity>7A2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 39"><unientity>7A48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 3D"><unientity>7A4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 3E"><unientity>7A47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 3F"><unientity>7A44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 40"><unientity>7A5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 4D"><unientity>7A5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 4F"><unientity>7A60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 57"><unientity>7A6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 5F"><unientity>7A70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 66"><unientity>7A75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 69"><unientity>7A78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 6B"><unientity>7A80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 70"><unientity>7A85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 75"><unientity>7A86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 78"><unientity>7A8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 7A"><unientity>7A94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 69 7E"><unientity>68A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 28"><unientity>7AA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 2B"><unientity>7A9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 2C"><unientity>7AA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 2E"><unientity>7AA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 31"><unientity>7AAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 36"><unientity>7AB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 3A"><unientity>7ABD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 3C"><unientity>7AB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 3D"><unientity>7AB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 3E"><unientity>7AB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 3F"><unientity>7ABB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 43"><unientity>7ABF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 49"><unientity>7ACD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 4B"><unientity>7ACF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 4F"><unientity>7AD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 51"><unientity>7AD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 52"><unientity>7AD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 54"><unientity>7AD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 55"><unientity>7ADA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 5A"><unientity>7AE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 5E"><unientity>7AE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 66"><unientity>7AEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 6B"><unientity>7AF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 76"><unientity>7AF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6A 7C"><unientity>7AFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 27"><unientity>7B39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 2D"><unientity>7B0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 2E"><unientity>7B08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 33"><unientity>7B0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 35"><unientity>7B35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 36"><unientity>7B25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 39"><unientity>7B38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 3B"><unientity>7B3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 3F"><unientity>7B24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 40"><unientity>7B33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 42"><unientity>7B2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 44"><unientity>7B18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 47"><unientity>7B31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 4A"><unientity>7B2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 4B"><unientity>7B37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 4D"><unientity>7B1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 52"><unientity>7B4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 53"><unientity>E9ED</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 6B 54"><unientity>E96C</unientity><unientityalt>7B04</unientityalt><desc>Variant of 2E6B54 which maps to 7B04</desc></character>
-<character hex="22 6B 55"><unientity>7B47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 59"><unientity>7B58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 5B"><unientity>7B6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 60"><unientity>7B48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 61"><unientity>7B45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 62"><unientity>7B4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 63"><unientity>7B4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 68"><unientity>7B66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 6C"><unientity>7B64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 6E"><unientity>7B69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 70"><unientity>7B6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 74"><unientity>7B62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 75"><unientity>7B6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 76"><unientity>7B74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 79"><unientity>7B72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 7A"><unientity>7B78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 7B"><unientity>7B6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 7C"><unientity>7B67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6B 7E"><unientity>7B65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 26"><unientity>7B71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 27"><unientity>7B70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 29"><unientity>7B73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 2D"><unientity>7B9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 33"><unientity>7B92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 34"><unientity>7B91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 35"><unientity>7B90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 38"><unientity>7BA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 3A"><unientity>7B8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 41"><unientity>7B85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 43"><unientity>7B8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 44"><unientity>7B98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 46"><unientity>7B86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 48"><unientity>7B99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 52"><unientity>7BB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 58"><unientity>7BCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 59"><unientity>7BB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 5A"><unientity>7BCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 5C"><unientity>7BD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 60"><unientity>7BBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6C 6F"><unientity>7BCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 22"><unientity>7BDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 24"><unientity>7BE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 29"><unientity>7BE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 2E"><unientity>7BF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 2F"><unientity>7BD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 32"><unientity>7BDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 35"><unientity>7BD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 37"><unientity>E9D1</unientity><unientityalt>7BEA</unientityalt><desc>Unrelated variant of EACC 3A6A7C which maps to 7BEA</desc></character>
-<character hex="22 6D 3B"><unientity>7C06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 3E"><unientity>7BF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 41"><unientity>7C0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 46"><unientity>7C0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 47"><unientity>7C00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 4B"><unientity>7C0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 4F"><unientity>7BF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 54"><unientity>7BF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 5A"><unientity>7C09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 5B"><unientity>7C03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 5C"><unientity>7BFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 5F"><unientity>7C1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 61"><unientity>7C26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 62"><unientity>7C28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 63"><unientity>7C20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 66"><unientity>7C1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 68"><unientity>7C2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6D 75"><unientity>7C30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 27"><unientity>7C35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 2A"><unientity>7C40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 30"><unientity>7C39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 34"><unientity>7C3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 35"><unientity>7C34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 3B"><unientity>7C42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 46"><unientity>7C4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 54"><unientity>7C5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 56"><unientity>7C5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 57"><unientity>7C5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 58"><unientity>7C5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 59"><unientity>7C59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 5B"><unientity>7C5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 5C"><unientity>7C67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 5E"><unientity>7C63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 61"><unientity>7C68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 62"><unientity>7C65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 6F"><unientity>7C6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 75"><unientity>7C75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 79"><unientity>7C7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 7A"><unientity>7C78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6E 7D"><unientity>7C7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 21"><unientity>7C81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 28"><unientity>7C8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 29"><unientity>7C91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 2A"><unientity>7C83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 2C"><unientity>7C8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 3A"><unientity>7C99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 3B"><unientity>7C98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 3E"><unientity>7C9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 40"><unientity>7C95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 42"><unientity>7CA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 43"><unientity>7CA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 45"><unientity>7C9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 46"><unientity>7CA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 48"><unientity>7CA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 49"><unientity>7CA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 4A"><unientity>7CAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 4C"><unientity>7CA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 54"><unientity>7CB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 58"><unientity>7CBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 59"><unientity>7CBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 5E"><unientity>7CBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 5F"><unientity>7CBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 64"><unientity>7CC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 66"><unientity>7CCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 68"><unientity>7CC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 69"><unientity>7CC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 6D"><unientity>7CCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 6F"><unientity>7CC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 71"><unientity>7CD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 75"><unientity>7CD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 77"><unientity>7CE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 6F 7B"><unientity>E96D</unientity><unientityalt>7CE8</unientityalt><desc>Variant of 4C6F7B which maps to 7CE8</desc></character>
-<character hex="22 70 22"><unientity>7CDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 28"><unientity>7CED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 2E"><unientity>7CF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 30"><unientity>7CF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 35"><unientity>7CF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 39"><unientity>7CF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 42"><unientity>7D06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 44"><unientity>7D03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 45"><unientity>7D08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 49"><unientity>7D0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 4A"><unientity>7D13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 50"><unientity>7D18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 51"><unientity>7D1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 52"><unientity>7D1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 59"><unientity>7D35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 5A"><unientity>7D3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 61"><unientity>7D3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 62"><unientity>7D32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 65"><unientity>7D31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 68"><unientity>7D45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 6A"><unientity>7D3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 6C"><unientity>7D29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 6F"><unientity>7D41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 71"><unientity>7D3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 7A"><unientity>7D5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 7C"><unientity>7D53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 70 7E"><unientity>7D5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 22"><unientity>7D70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 29"><unientity>7D67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 2B"><unientity>7D6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 2C"><unientity>7D6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 30"><unientity>7D73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 34"><unientity>7D4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 37"><unientity>7D8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 39"><unientity>7D88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 3B"><unientity>7D85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 3D"><unientity>7D8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 42"><unientity>7D7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 44"><unientity>7D86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 48"><unientity>7D8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 4B"><unientity>7D9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 4D"><unientity>7D83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 4F"><unientity>7D7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 54"><unientity>7D7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 58"><unientity>7D7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 59"><unientity>7D96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 5A"><unientity>7D5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 5B"><unientity>7D8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 61"><unientity>7DA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 62"><unientity>7DAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 67"><unientity>7DCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 69"><unientity>7DAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 6A"><unientity>7DCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 6B"><unientity>7DC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 6E"><unientity>7DC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 6F"><unientity>7DA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 74"><unientity>7DC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 78"><unientity>7DAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 71 7D"><unientity>7DB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 22"><unientity>7D9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 29"><unientity>7DE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 2A"><unientity>7DD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 2B"><unientity>7DE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 31"><unientity>7DD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 36"><unientity>7DF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 3A"><unientity>7E06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 3C"><unientity>7DF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 3E"><unientity>7DE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 46"><unientity>7DDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 47"><unientity>7DF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 48"><unientity>7DF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 49"><unientity>7DE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 4B"><unientity>7DF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 50"><unientity>7E17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 51"><unientity>7E1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 52"><unientity>7E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 53"><unientity>7E0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 55"><unientity>7E12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 56"><unientity>7E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 5B"><unientity>7E20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 5D"><unientity>7E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 5E"><unientity>7E09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 5F"><unientity>7E1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 65"><unientity>7E15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 69"><unientity>7E10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 6A"><unientity>7E0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 6D"><unientity>7E3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 71"><unientity>7E34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 72"><unientity>7E2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 73"><unientity>7E2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 75"><unientity>7E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 77"><unientity>7E3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 79"><unientity>7E39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 72 7D"><unientity>7E44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 21"><unientity>7E35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 26"><unientity>7E3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 28"><unientity>7E47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 2D"><unientity>7E52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 2F"><unientity>7E51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 33"><unientity>7E50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 34"><unientity>7E67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 37"><unientity>7E56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 48"><unientity>7E68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 49"><unientity>7E6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 4E"><unientity>7E70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 51"><unientity>7E6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 52"><unientity>7E73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 58"><unientity>7E7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 59"><unientity>7E7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 5B"><unientity>7E81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 5D"><unientity>7E8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 5E"><unientity>7E87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 60"><unientity>7E88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 64"><unientity>7E86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 6A"><unientity>7E91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 6B"><unientity>7E95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 6D"><unientity>7E94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 70"><unientity>7E9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 71"><unientity>7E9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 73"><unientity>7E99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 73 74"><unientity>7E98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 25"><unientity>7F43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 27"><unientity>7F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 28"><unientity>7F45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 2B"><unientity>7F4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 2E"><unientity>7F4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 2F"><unientity>7F4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 31"><unientity>7F4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 32"><unientity>7F4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 3E"><unientity>7F60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 3F"><unientity>7F61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 43"><unientity>7F5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 45"><unientity>7F5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 47"><unientity>7F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 50"><unientity>7F65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 51"><unientity>7F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 53"><unientity>7F6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 54"><unientity>7F6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 55"><unientity>7F67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 57"><unientity>7F68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 5E"><unientity>7F71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 60"><unientity>7F73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 63"><unientity>7F76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 6A"><unientity>7F7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 6B"><unientity>7F7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 6C"><unientity>7F7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 72"><unientity>7F86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 7A"><unientity>7F91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 74 7E"><unientity>7F96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 23"><unientity>7F97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 24"><unientity>7F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 2C"><unientity>7FA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 33"><unientity>7FA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 3B"><unientity>7FB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 3C"><unientity>7FAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 3F"><unientity>7FB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 40"><unientity>7FB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 42"><unientity>7FB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 4A"><unientity>7FBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 4C"><unientity>7FBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 51"><unientity>7FC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 57"><unientity>7FCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 67"><unientity>7FDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 68"><unientity>7FE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 6C"><unientity>7FE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 6F"><unientity>7FE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 72"><unientity>7FEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 73"><unientity>7FEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 77"><unientity>7FEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 75 7A"><unientity>7FEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 29"><unientity>7FFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 2A"><unientity>7FFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 2C"><unientity>7FFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 2E"><unientity>8004</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 31"><unientity>8008</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 33"><unientity>800B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 34"><unientity>800E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 35"><unientity>8011</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 36"><unientity>800F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 37"><unientity>8014</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 39"><unientity>8016</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 3B"><unientity>801F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 3D"><unientity>801E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 3E"><unientity>801D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 4B"><unientity>8025</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 4C"><unientity>8026</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 4D"><unientity>802A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 4E"><unientity>8029</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 4F"><unientity>8028</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 5B"><unientity>8030</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 5D"><unientity>8031</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 60"><unientity>8035</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 69"><unientity>8039</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 6B"><unientity>8041</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 70"><unientity>8043</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 7B"><unientity>8052</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 76 7E"><unientity>8062</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 28"><unientity>8063</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 32"><unientity>806C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 39"><unientity>8075</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 3E"><unientity>807B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 3F"><unientity>8079</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 47"><unientity>808A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 49"><unientity>808E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 4E"><unientity>809F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 5C"><unientity>670A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 60"><unientity>80A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 61"><unientity>80B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 68"><unientity>80B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 69"><unientity>80B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 6A"><unientity>80A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 73"><unientity>80E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 75"><unientity>6711</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 7B"><unientity>80DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 77 7D"><unientity>80C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 27"><unientity>80D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 2A"><unientity>80DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 2D"><unientity>80CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 2F"><unientity>80CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 30"><unientity>80D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 33"><unientity>80F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 34"><unientity>80FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 38"><unientity>80FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 3C"><unientity>8103</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 40"><unientity>80F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 41"><unientity>80EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 42"><unientity>80D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 49"><unientity>811D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 4B"><unientity>8118</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 50"><unientity>8130</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 54"><unientity>8124</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 55"><unientity>811B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 60"><unientity>812A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 61"><unientity>811E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 64"><unientity>8121</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 66"><unientity>8117</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 69"><unientity>813A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 6A"><unientity>815A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 6D"><unientity>8148</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 77"><unientity>814C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 7C"><unientity>8153</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 78 7D"><unientity>8141</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 25"><unientity>814D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 2E"><unientity>6720</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 32"><unientity>8160</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 3B"><unientity>8169</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 3C"><unientity>817C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 41"><unientity>8161</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 46"><unientity>8176</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 47"><unientity>8174</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 48"><unientity>8167</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 4B"><unientity>816F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 4D"><unientity>8182</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 51"><unientity>818B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 52"><unientity>8186</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 59"><unientity>8183</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 6A"><unientity>819F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 6B"><unientity>81A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 70"><unientity>8198</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 75"><unientity>8195</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 77"><unientity>8197</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 7C"><unientity>81AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 7D"><unientity>81A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 79 7E"><unientity>6725</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 2C"><unientity>81B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 2E"><unientity>81B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 2F"><unientity>81B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 33"><unientity>81B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 37"><unientity>81BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 38"><unientity>81C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 39"><unientity>81CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 3A"><unientity>81CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 3B"><unientity>81C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 40"><unientity>81D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 41"><unientity>81CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 43"><unientity>81D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 4B"><unientity>81DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 4F"><unientity>81DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 53"><unientity>81DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 56"><unientity>81E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 57"><unientity>81E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 5B"><unientity>81E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 60"><unientity>81EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 65"><unientity>81F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 68"><unientity>81F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 70"><unientity>8201</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 72"><unientity>E9EE</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="22 7A 74"><unientity>8203</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 75"><unientity>8204</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7A 77"><unientity>820B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 27"><unientity>821D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 29"><unientity>8220</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 2E"><unientity>822D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 2F"><unientity>822F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 32"><unientity>8238</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 34"><unientity>823A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 35"><unientity>8233</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 36"><unientity>8234</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 3A"><unientity>8232</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 42"><unientity>8248</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 43"><unientity>8249</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 45"><unientity>8244</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 47"><unientity>8240</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 48"><unientity>8241</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 4A"><unientity>8245</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 4B"><unientity>824B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 50"><unientity>824F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 53"><unientity>824E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 56"><unientity>8256</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 57"><unientity>8257</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 5E"><unientity>825A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 62"><unientity>825F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 67"><unientity>8262</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 6B"><unientity>8268</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 6F"><unientity>826D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 77"><unientity>8278</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7B 7D"><unientity>827F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 24"><unientity>828E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 25"><unientity>8291</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 27"><unientity>828F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 28"><unientity>8284</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 2D"><unientity>8283</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 2E"><unientity>828A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 31"><unientity>82AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 34"><unientity>82A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 38"><unientity>82AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 3A"><unientity>82B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 3C"><unientity>82A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 3F"><unientity>829A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 42"><unientity>82A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 44"><unientity>82B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 45"><unientity>E96E</unientity><unientityalt>82AE</unientityalt><desc>Variant of 4C7C45 which maps to 82AE</desc></character>
-<character hex="22 7C 46"><unientity>82A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 49"><unientity>82BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 4C"><unientity>82A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 4E"><unientity>82B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 50"><unientity>82A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 53"><unientity>82AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 55"><unientity>82D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 57"><unientity>82FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 5A"><unientity>82E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 5B"><unientity>82D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 5C"><unientity>8300</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 5F"><unientity>82EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 60"><unientity>82F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 62"><unientity>82EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 63"><unientity>833A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 64"><unientity>82E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 65"><unientity>82D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 67"><unientity>8307</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 68"><unientity>82FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 69"><unientity>82F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 6A"><unientity>82E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 6D"><unientity>82D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 6E"><unientity>8314</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 71"><unientity>82EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 72"><unientity>82D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 73"><unientity>82E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 75"><unientity>82F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 7B"><unientity>8310</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7C 7C"><unientity>82F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 21"><unientity>830C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 22"><unientity>82FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 24"><unientity>82FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 26"><unientity>8333</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 29"><unientity>8328</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 2B"><unientity>8344</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 2E"><unientity>8351</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 35"><unientity>831B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 3B"><unientity>8356</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 3F"><unientity>8322</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 40"><unientity>832C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 48"><unientity>833C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 4A"><unientity>834D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 4D"><unientity>E96F</unientity><unientityalt>8343</unientityalt><desc>Variant of 4C7D4D which maps to 8343</desc></character>
-<character hex="22 7D 52"><unientity>832F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 53"><unientity>8348</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 54"><unientity>8312</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 56"><unientity>8316</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 58"><unientity>831A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 5F"><unientity>8347</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 62"><unientity>83A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 67"><unientity>83AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 6D"><unientity>8373</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 72"><unientity>83B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 76"><unientity>831D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 7A"><unientity>838F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 7C"><unientity>8395</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7D 7E"><unientity>8375</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 21"><unientity>837F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 22"><unientity>8399</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 23"><unientity>83A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 25"><unientity>8387</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 26"><unientity>83B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 2B"><unientity>83A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 2F"><unientity>839B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 33"><unientity>83AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 37"><unientity>839C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 38"><unientity>839F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 41"><unientity>83CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 43"><unientity>83F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 45"><unientity>8421</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 51"><unientity>8423</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 52"><unientity>83EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 53"><unientity>8413</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 56"><unientity>83FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 57"><unientity>83F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 59"><unientity>8410</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 5A"><unientity>83E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 60"><unientity>83C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 61"><unientity>8407</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 63"><unientity>83EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 6A"><unientity>83BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 6B"><unientity>83E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 6D"><unientity>8401</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 71"><unientity>83D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 72"><unientity>83E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 74"><unientity>8418</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 79"><unientity>83CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 7B"><unientity>83D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="22 7E 7D"><unientity>83D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 23"><unientity>83FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 25"><unientity>841E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 29"><unientity>83C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 2A"><unientity>83DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 2C"><unientity>841F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 2E"><unientity>840F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 30"><unientity>8411</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 36"><unientity>839A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 3C"><unientity>83F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 43"><unientity>83D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 48"><unientity>8453</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 4A"><unientity>848E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 4C"><unientity>8439</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 4D"><unientity>8476</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 4E"><unientity>8479</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 5C"><unientity>8451</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 5F"><unientity>847D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 62"><unientity>845A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 66"><unientity>8459</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 69"><unientity>8473</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 6E"><unientity>843E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 71"><unientity>846D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 78"><unientity>847A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 7B"><unientity>8484</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 22 7C"><unientity>8478</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 24"><unientity>8432</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 29"><unientity>845C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 2D"><unientity>842A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 2E"><unientity>8429</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 32"><unientity>8471</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 35"><unientity>845F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 36"><unientity>8460</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 37"><unientity>846E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 3A"><unientity>8446</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 3C"><unientity>8452</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 3F"><unientity>844A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 45"><unientity>844E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 49"><unientity>8497</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 50"><unientity>84A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 53"><unientity>849F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 56"><unientity>84BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 58"><unientity>84B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 5C"><unientity>84B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 5E"><unientity>84C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 5F"><unientity>84BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 68"><unientity>84CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 70"><unientity>84B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 71"><unientity>849D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 72"><unientity>84D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 75"><unientity>8494</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 79"><unientity>84C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 7A"><unientity>84BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 23 7C"><unientity>84C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 21"><unientity>8495</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 27"><unientity>84AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 29"><unientity>84AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 32"><unientity>84A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 33"><unientity>84D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 35"><unientity>84DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 3A"><unientity>8493</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 3F"><unientity>84CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 41"><unientity>84CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 46"><unientity>8506</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 47"><unientity>850B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 4D"><unientity>8500</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 59"><unientity>851F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 5C"><unientity>853B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 5F"><unientity>84EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 66"><unientity>84F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 6A"><unientity>850C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 72"><unientity>852F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 75"><unientity>8515</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 77"><unientity>84F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 7A"><unientity>84FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 7C"><unientity>84EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 24 7D"><unientity>84FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 24"><unientity>851E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 2A"><unientity>8518</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 2D"><unientity>8526</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 2E"><unientity>E970</unientity><unientityalt>8507</unientityalt><desc>Variant of 2F252E which maps to 8507</desc></character>
-<character hex="23 25 2F"><unientity>84E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 34"><unientity>84F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 35"><unientity>84EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 36"><unientity>8556</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 46"><unientity>8541</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 4B"><unientity>8558</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 4D"><unientity>8553</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 4E"><unientity>8561</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 4F"><unientity>8540</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 5A"><unientity>8546</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 5C"><unientity>8564</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 5D"><unientity>855E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 5E"><unientity>8573</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 5F"><unientity>8551</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 64"><unientity>8562</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 6B"><unientity>8563</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 6C"><unientity>848D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 6D"><unientity>8542</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 71"><unientity>854E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 74"><unientity>8555</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 76"><unientity>855D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 25 77"><unientity>858C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 25"><unientity>8580</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 28"><unientity>858F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 2D"><unientity>8579</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 32"><unientity>857F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 33"><unientity>8577</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 34"><unientity>8578</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 35"><unientity>8598</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 36"><unientity>857B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 3D"><unientity>85A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 42"><unientity>857A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 44"><unientity>8597</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 45"><unientity>8557</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 49"><unientity>85A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 4E"><unientity>8586</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 50"><unientity>8599</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 51"><unientity>858A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 52"><unientity>85A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 54"><unientity>8590</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 56"><unientity>8585</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 57"><unientity>8588</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 5A"><unientity>85B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 5D"><unientity>85C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 61"><unientity>85BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 68"><unientity>85CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 6A"><unientity>85C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 6B"><unientity>85B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 6C"><unientity>85B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 6E"><unientity>85B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 6F"><unientity>85BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 70"><unientity>85C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 72"><unientity>85BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 75"><unientity>85BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 26 7E"><unientity>85B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 24"><unientity>8624</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 28"><unientity>85F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 2C"><unientity>85E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 2E"><unientity>85D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 31"><unientity>85ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 39"><unientity>85DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 43"><unientity>85DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 45"><unientity>85D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 4C"><unientity>85DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 4E"><unientity>85F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 52"><unientity>8622</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 54"><unientity>8610</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 57"><unientity>85FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 5B"><unientity>85FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 5E"><unientity>85FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 60"><unientity>8600</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 68"><unientity>8604</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 71"><unientity>8605</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 27 75"><unientity>862B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 22"><unientity>8627</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 26"><unientity>8629</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 32"><unientity>8637</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 38"><unientity>8636</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 3E"><unientity>863C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 3F"><unientity>8640</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 40"><unientity>863A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 4C"><unientity>8645</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 59"><unientity>864D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 5A"><unientity>8653</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 5E"><unientity>8659</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 66"><unientity>8661</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 69"><unientity>8662</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 6A"><unientity>8663</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 71"><unientity>8669</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 78"><unientity>866C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 7B"><unientity>8672</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 7C"><unientity>866F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 28 7E"><unientity>867B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 25"><unientity>867A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 26"><unientity>8673</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 27"><unientity>867C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 2E"><unientity>8696</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 2F"><unientity>86A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 36"><unientity>8691</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 37"><unientity>869C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 39"><unientity>8698</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 3C"><unientity>868D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 3D"><unientity>868B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 40"><unientity>86A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 42"><unientity>869D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 46"><unientity>86A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 48"><unientity>86A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 4B"><unientity>86BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 58"><unientity>86BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 59"><unientity>86B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 60"><unientity>86B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 62"><unientity>86C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 63"><unientity>86B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 67"><unientity>86D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 6E"><unientity>86E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 6F"><unientity>86E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 71"><unientity>86EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 74"><unientity>86D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 77"><unientity>86D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 7A"><unientity>86D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 29 7E"><unientity>86DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 25"><unientity>870B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 2F"><unientity>86FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 33"><unientity>86F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 34"><unientity>8706</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 36"><unientity>870E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 38"><unientity>8709</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 3A"><unientity>870A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 3E"><unientity>870D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 42"><unientity>874A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 43"><unientity>8723</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 44"><unientity>8737</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 45"><unientity>8728</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 49"><unientity>8740</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 4B"><unientity>872E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 4C"><unientity>873D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 4E"><unientity>871E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 53"><unientity>8743</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 55"><unientity>8744</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 57"><unientity>873E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 59"><unientity>8729</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 5A"><unientity>8739</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 5F"><unientity>871A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 64"><unientity>8731</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 65"><unientity>8711</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 66"><unientity>8712</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 6B"><unientity>874F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 6C"><unientity>8771</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 6D"><unientity>8763</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 71"><unientity>8764</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 73"><unientity>8765</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 74"><unientity>877D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 79"><unientity>8758</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2A 7B"><unientity>877B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 21"><unientity>8761</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 24"><unientity>876A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 27"><unientity>874E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 28"><unientity>875F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 2D"><unientity>876F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 2E"><unientity>875D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 30"><unientity>876E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 33"><unientity>874D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 35"><unientity>8753</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 3A"><unientity>87A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 3D"><unientity>8793</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 45"><unientity>8799</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 48"><unientity>8788</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 4C"><unientity>8798</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 53"><unientity>8785</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 54"><unientity>878B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 55"><unientity>8784</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 58"><unientity>87A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 5D"><unientity>8789</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 60"><unientity>87AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 66"><unientity>87BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 6E"><unientity>87C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 6F"><unientity>87AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 72"><unientity>87AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 78"><unientity>87AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2B 7E"><unientity>87BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 24"><unientity>87BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 2C"><unientity>87EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 30"><unientity>87F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 31"><unientity>87F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 34"><unientity>87EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 36"><unientity>87DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 37"><unientity>87E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 39"><unientity>87EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 3A"><unientity>87D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 3F"><unientity>87F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 47"><unientity>87E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 48"><unientity>87D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 49"><unientity>87DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 4C"><unientity>87E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 4D"><unientity>8801</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 4F"><unientity>8803</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 50"><unientity>880A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 55"><unientity>87F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 57"><unientity>87F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 5C"><unientity>880B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 5D"><unientity>8806</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 5F"><unientity>87FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 61"><unientity>8810</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 63"><unientity>8819</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 64"><unientity>8811</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 66"><unientity>8818</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 6A"><unientity>8813</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 6B"><unientity>8816</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 72"><unientity>8834</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 73"><unientity>881C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2C 7A"><unientity>881B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 23"><unientity>8828</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 2A"><unientity>8832</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 2E"><unientity>882E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 32"><unientity>882D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 3C"><unientity>883C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 41"><unientity>8841</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 42"><unientity>E9EF</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="23 2D 44"><unientity>8844</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 4B"><unientity>8847</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 51"><unientity>884A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 53"><unientity>884E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 56"><unientity>8852</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 57"><unientity>8850</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 59"><unientity>8856</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 5A"><unientity>8855</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 5E"><unientity>885C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 5F"><unientity>885A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 69"><unientity>8869</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 6D"><unientity>886D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 6E"><unientity>887A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 71"><unientity>8875</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 75"><unientity>8872</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 79"><unientity>887D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 7C"><unientity>8879</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 7D"><unientity>887F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2D 7E"><unientity>887E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 28"><unientity>88A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 2A"><unientity>88A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 2F"><unientity>88AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 34"><unientity>889A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 3A"><unientity>8890</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 3B"><unientity>888C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 3D"><unientity>88A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 40"><unientity>8899</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 45"><unientity>8897</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 48"><unientity>88C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 49"><unientity>88BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 4A"><unientity>88BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 4F"><unientity>88C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 51"><unientity>88B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 54"><unientity>88BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 57"><unientity>88B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 59"><unientity>88BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 5A"><unientity>88C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 5E"><unientity>88CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 60"><unientity>88CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 62"><unientity>88DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 64"><unientity>88CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 68"><unientity>88D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 71"><unientity>88F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 72"><unientity>88FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 75"><unientity>88F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 78"><unientity>8900</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2E 7A"><unientity>88F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 21"><unientity>88FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 23"><unientity>88EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 24"><unientity>8903</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 2D"><unientity>8909</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 2F"><unientity>8918</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 35"><unientity>8906</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 36"><unientity>890C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 37"><unientity>8919</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 3D"><unientity>890A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 43"><unientity>8915</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 45"><unientity>892F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 47"><unientity>8930</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 4E"><unientity>8921</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 4F"><unientity>8927</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 51"><unientity>891F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 53"><unientity>8931</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 54"><unientity>891E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 56"><unientity>8926</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 57"><unientity>8922</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 5A"><unientity>8935</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 5D"><unientity>8941</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 60"><unientity>8933</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 66"><unientity>8954</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 6F"><unientity>894F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 72"><unientity>8947</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 7A"><unientity>894C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 2F 7B"><unientity>8946</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 21"><unientity>894D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 23"><unientity>8962</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 24"><unientity>895A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 25"><unientity>895E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 29"><unientity>895B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 2C"><unientity>895C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 2D"><unientity>895D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 31"><unientity>8966</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 37"><unientity>896D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 3A"><unientity>896B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 3B"><unientity>896E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 3C"><unientity>896C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 41"><unientity>8976</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 42"><unientity>8974</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 49"><unientity>897B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 4A"><unientity>897C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 53"><unientity>8984</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 55"><unientity>8985</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 62"><unientity>8991</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 64"><unientity>8997</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 66"><unientity>8998</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 6B"><unientity>899C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 6F"><unientity>89A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 76"><unientity>89A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 79"><unientity>89A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 30 7D"><unientity>89AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 2A"><unientity>89B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 2B"><unientity>89B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 2C"><unientity>89B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 2F"><unientity>89BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 32"><unientity>89BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 3A"><unientity>89D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 3B"><unientity>89D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 3F"><unientity>89DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 43"><unientity>89E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 45"><unientity>89DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 47"><unientity>89E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 4C"><unientity>89E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 4D"><unientity>89EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 53"><unientity>89ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 58"><unientity>89F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 5C"><unientity>89F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 5E"><unientity>89F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 60"><unientity>89F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 64"><unientity>89F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 6B"><unientity>89FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 6C"><unientity>8A06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 6D"><unientity>8A07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 6E"><unientity>8A04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 70"><unientity>8A0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 71"><unientity>8A11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 72"><unientity>8A12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 73"><unientity>8A0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 7A"><unientity>8A27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 31 7D"><unientity>8A29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 25"><unientity>8A22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 27"><unientity>8A51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 28"><unientity>8A4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 2A"><unientity>8A4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 30"><unientity>8A56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 37"><unientity>8A57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 39"><unientity>8A48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 3B"><unientity>8A58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 3C"><unientity>8A52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 40"><unientity>8A3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 42"><unientity>8A45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 4F"><unientity>8A7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 50"><unientity>8A86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 56"><unientity>8A61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 58"><unientity>8A3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 59"><unientity>8A82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 5D"><unientity>8A84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 5E"><unientity>8A75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 69"><unientity>8A8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 6F"><unientity>8A96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 71"><unientity>8A9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 32 7E"><unientity>8AB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 21"><unientity>8ABE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 25"><unientity>8ACF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 27"><unientity>8AC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 2C"><unientity>8AD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 2D"><unientity>8AD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 31"><unientity>8AAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 33"><unientity>8AD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 36"><unientity>8ACD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 38"><unientity>8AB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 3B"><unientity>8ADB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 3F"><unientity>8AD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 40"><unientity>8AD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 44"><unientity>8AF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 45"><unientity>8AE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 49"><unientity>8B4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 4C"><unientity>8ADD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 4E"><unientity>8AF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 4F"><unientity>8AF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 50"><unientity>8AF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 53"><unientity>8ADF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 56"><unientity>8B03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 57"><unientity>8AE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 59"><unientity>8B14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 5D"><unientity>8AFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 62"><unientity>8ADE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 63"><unientity>8AE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 64"><unientity>8B07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 6B"><unientity>8B0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 6F"><unientity>8B1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 73"><unientity>8B16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 76"><unientity>8B1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 78"><unientity>8B0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 79"><unientity>8B06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 7A"><unientity>8B05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 7C"><unientity>8B0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 33 7D"><unientity>8B10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 22"><unientity>8B2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 2A"><unientity>8B37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 2D"><unientity>8B26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 30"><unientity>8B33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 38"><unientity>8B3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 3A"><unientity>8B29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 42"><unientity>8B48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 44"><unientity>8B54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 48"><unientity>8B53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 49"><unientity>8B4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 4A"><unientity>8B46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 4D"><unientity>8B56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 4F"><unientity>8B3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 59"><unientity>8B59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 5F"><unientity>8B4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 68"><unientity>8B6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 6B"><unientity>8B6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 70"><unientity>8B78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 73"><unientity>8B45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 78"><unientity>8B85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 79"><unientity>8B81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 34 7B"><unientity>8B7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 23"><unientity>8B8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 26"><unientity>8B87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 2D"><unientity>8B95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 2E"><unientity>8B94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 37"><unientity>8B9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 3A"><unientity>8B9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 3D"><unientity>8C3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 44"><unientity>8C40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 45"><unientity>8C42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 4B"><unientity>8C47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 4D"><unientity>8C4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 50"><unientity>8C4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 52"><unientity>8C55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 54"><unientity>8C57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 55"><unientity>8C5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 56"><unientity>8C5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 5C"><unientity>86C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 63"><unientity>8C68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 65"><unientity>8C6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 6D"><unientity>8C73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 6F"><unientity>8C74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 71"><unientity>8C75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 73"><unientity>8C77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 74"><unientity>8C76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 7B"><unientity>8C78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 35 7D"><unientity>8C7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 2A"><unientity>8C86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 2D"><unientity>8C85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 2E"><unientity>8C88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 39"><unientity>8C94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 41"><unientity>8C9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 43"><unientity>8C9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 44"><unientity>8CA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 4E"><unientity>8CB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 51"><unientity>8CBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 52"><unientity>8CB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 53"><unientity>8CB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 57"><unientity>8CCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 5E"><unientity>8CD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 5F"><unientity>8CD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 67"><unientity>8CE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 68"><unientity>8CE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 6A"><unientity>8CE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 6F"><unientity>8CEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 70"><unientity>8CDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 72"><unientity>8CDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 74"><unientity>8CD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 76"><unientity>8CEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 7B"><unientity>8CF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 7C"><unientity>8CF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 36 7E"><unientity>8CFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 21"><unientity>8CF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 25"><unientity>8D04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 26"><unientity>8CFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 2B"><unientity>8D07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 2D"><unientity>8D09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 32"><unientity>8D0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 39"><unientity>8D11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 3A"><unientity>8D10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 3B"><unientity>8D12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 3D"><unientity>8D14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 3E"><unientity>8D18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 48"><unientity>8D6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 52"><unientity>8D78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 5C"><unientity>8D7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 61"><unientity>8D84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 71"><unientity>8D94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 37 75"><unientity>8D8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 22"><unientity>8D96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 2F"><unientity>8DA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 33"><unientity>8DA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 52"><unientity>8DAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 59"><unientity>8DAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 5A"><unientity>8DB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 66"><unientity>8DB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 6E"><unientity>8DBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 6F"><unientity>8DBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 70"><unientity>8DB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 71"><unientity>8DC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 72"><unientity>8DC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 38 73"><unientity>8DBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 21"><unientity>8DCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 22"><unientity>8DD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 27"><unientity>8DD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 2B"><unientity>8DC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 2F"><unientity>8DE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 34"><unientity>8DEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 35"><unientity>8DEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 36"><unientity>8DF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 38"><unientity>8DE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 3A"><unientity>8DE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 3B"><unientity>8DE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 3D"><unientity>8DE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 3E"><unientity>8DF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 3F"><unientity>8E09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 41"><unientity>8DFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 44"><unientity>8DFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 46"><unientity>8E05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 49"><unientity>8E01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 4E"><unientity>8E04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 50"><unientity>8E06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 52"><unientity>8E2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 54"><unientity>8E23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 57"><unientity>8E2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 58"><unientity>8E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 5C"><unientity>8E1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 64"><unientity>8E16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 66"><unientity>8E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 67"><unientity>8E27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 68"><unientity>8E14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 69"><unientity>8E18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 6F"><unientity>8E41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 77"><unientity>8E40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 79"><unientity>8E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 39 7E"><unientity>8E3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 21"><unientity>8E30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 24"><unientity>8E47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 26"><unientity>8E46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 2E"><unientity>8E4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 30"><unientity>8E50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 32"><unientity>8E4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 34"><unientity>8E5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 35"><unientity>8E62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 36"><unientity>8E60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 3A"><unientity>8E54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 3B"><unientity>8E67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 3E"><unientity>8E5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 3F"><unientity>8E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 40"><unientity>8E55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 41"><unientity>8E61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 43"><unientity>8E5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 44"><unientity>8E75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 45"><unientity>8E74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 46"><unientity>8E95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 48"><unientity>8E6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 4B"><unientity>8E69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 52"><unientity>8E83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 53"><unientity>8E84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 57"><unientity>8E8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 5D"><unientity>8E94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 5E"><unientity>8E9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 5F"><unientity>8E92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 60"><unientity>8E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 62"><unientity>8E90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 63"><unientity>8E98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 64"><unientity>8E9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 6B"><unientity>8EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 6F"><unientity>8EA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 71"><unientity>8EA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 72"><unientity>8E99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 78"><unientity>8EB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 7A"><unientity>8EBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3A 7D"><unientity>8EB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 2E"><unientity>8EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 2F"><unientity>8ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 31"><unientity>8ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 33"><unientity>8ED5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 3F"><unientity>8EFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 42"><unientity>8EF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 4B"><unientity>8EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 4F"><unientity>8EEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 51"><unientity>8EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 56"><unientity>8F00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 59"><unientity>8F05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 5A"><unientity>8F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 5B"><unientity>8F07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 63"><unientity>8F27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 64"><unientity>8F2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 6B"><unientity>8F1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 6D"><unientity>8F25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 6E"><unientity>8F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 75"><unientity>8F17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 78"><unientity>8F36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 79"><unientity>8F2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 7A"><unientity>8F33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3B 7D"><unientity>8F2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 26"><unientity>8F39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 27"><unientity>8F34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 2D"><unientity>8F40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 30"><unientity>8F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 31"><unientity>8F4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 33"><unientity>8F47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 3D"><unientity>8F52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 48"><unientity>8F56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 49"><unientity>8F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 4B"><unientity>8F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 4C"><unientity>8F58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 4D"><unientity>8F5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 4E"><unientity>8F5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 53"><unientity>8F5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 57"><unientity>8F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 59"><unientity>8F63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 5A"><unientity>8F64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 65"><unientity>8FA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 66"><unientity>8FA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 6C"><unientity>8FB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 6D"><unientity>8FB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 6E"><unientity>8FBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 70"><unientity>8FBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 74"><unientity>8FBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 75"><unientity>8FD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 77"><unientity>8FCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 7A"><unientity>8FCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 7B"><unientity>8FD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3C 7D"><unientity>8FCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 21"><unientity>8FDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 22"><unientity>8FD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 2F"><unientity>8FE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 30"><unientity>8FEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 35"><unientity>8FF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 3C"><unientity>8FFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 3F"><unientity>9004</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 40"><unientity>9008</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 44"><unientity>9011</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 45"><unientity>900B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 48"><unientity>900C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 49"><unientity>9021</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 4A"><unientity>902D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 4E"><unientity>902C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 56"><unientity>9037</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 57"><unientity>9034</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 58"><unientity>902F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 59"><unientity>9036</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 5B"><unientity>9046</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 5D"><unientity>9052</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 67"><unientity>9049</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 6A"><unientity>9044</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 74"><unientity>9062</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 75"><unientity>905D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 78"><unientity>905B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3D 7B"><unientity>906B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 21"><unientity>9070</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 25"><unientity>906F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 26"><unientity>9079</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 28"><unientity>9076</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 2A"><unientity>907B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 2C"><unientity>9085</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 34"><unientity>9083</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 37"><unientity>9088</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 3A"><unientity>908B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 3F"><unientity>9099</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 40"><unientity>9097</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 43"><unientity>909B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 44"><unientity>909C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 48"><unientity>90A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 51"><unientity>90A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 54"><unientity>90A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 58"><unientity>90AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 59"><unientity>90B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 5B"><unientity>90B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 5D"><unientity>90B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 5F"><unientity>90AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 61"><unientity>90B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 68"><unientity>90C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 6A"><unientity>90BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 6F"><unientity>90D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 72"><unientity>90BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 75"><unientity>90C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 78"><unientity>90C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3E 79"><unientity>90C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 22"><unientity>90DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 23"><unientity>90DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 26"><unientity>90E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 27"><unientity>90D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 28"><unientity>90DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 2A"><unientity>90DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 2C"><unientity>90D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 2D"><unientity>90E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 2E"><unientity>90EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 2F"><unientity>90EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 32"><unientity>90F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 33"><unientity>90F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 34"><unientity>90F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 3E"><unientity>90EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 3F"><unientity>90F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 46"><unientity>90FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 47"><unientity>90FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 49"><unientity>9104</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 4A"><unientity>90FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 4C"><unientity>9106</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 4E"><unientity>9100</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 50"><unientity>9107</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 57"><unientity>910F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 58"><unientity>9111</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 5A"><unientity>9116</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 5C"><unientity>9114</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 60"><unientity>910B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 63"><unientity>9118</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 64"><unientity>911C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 66"><unientity>9120</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 67"><unientity>9122</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 6A"><unientity>911E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 71"><unientity>9124</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 72"><unientity>911A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 74"><unientity>9125</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 77"><unientity>912F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 3F 79"><unientity>912B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 21"><unientity>9132</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 24"><unientity>9126</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 2B"><unientity>9134</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 2C"><unientity>9136</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 31"><unientity>913A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 32"><unientity>913B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 3B"><unientity>9143</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 3E"><unientity>9146</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 3F"><unientity>9145</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 40"><unientity>9148</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 41"><unientity>9147</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 42"><unientity>9150</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 43"><unientity>914E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 48"><unientity>9159</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 49"><unientity>915C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 4D"><unientity>9156</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 50"><unientity>9158</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 52"><unientity>915A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 53"><unientity>9161</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 56"><unientity>9164</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 61"><unientity>916F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 62"><unientity>916E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 66"><unientity>917A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 68"><unientity>9172</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 69"><unientity>9179</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 6A"><unientity>9176</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 6B"><unientity>9174</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 6C"><unientity>9173</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 6D"><unientity>9185</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 6F"><unientity>9182</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 70"><unientity>918A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 71"><unientity>9186</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 72"><unientity>918C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 73"><unientity>9181</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 7B"><unientity>9191</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 7D"><unientity>9190</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 40 7E"><unientity>918E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 24"><unientity>918D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 25"><unientity>9193</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 2B"><unientity>919D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 2C"><unientity>919A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 30"><unientity>91A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 34"><unientity>E971</unientity><unientityalt>919B</unientityalt><desc>Variant of 4D4134 which maps to 919B</desc></character>
-<character hex="23 41 37"><unientity>91A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 3D"><unientity>91AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 41"><unientity>91AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 42"><unientity>91B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 47"><unientity>91AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 48"><unientity>91AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 4B"><unientity>91B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 4C"><unientity>91B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 4D"><unientity>91B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 56"><unientity>91BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 57"><unientity>91BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 5A"><unientity>91C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 5B"><unientity>91C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 5C"><unientity>91C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 61"><unientity>91D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 62"><unientity>91D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 63"><unientity>91D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 64"><unientity>91D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 68"><unientity>91E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 69"><unientity>91ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 6A"><unientity>91F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 6B"><unientity>91FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 6F"><unientity>91F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 71"><unientity>91E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 72"><unientity>91F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 73"><unientity>91EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 74"><unientity>91F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 77"><unientity>91F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 79"><unientity>91E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 41 7A"><unientity>91F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 21"><unientity>91F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 22"><unientity>91E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 23"><unientity>9204</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 25"><unientity>9201</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 26"><unientity>922B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 27"><unientity>920A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 28"><unientity>9225</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 2A"><unientity>9292</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 2C"><unientity>9228</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 2E"><unientity>9207</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 2F"><unientity>9203</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 31"><unientity>9200</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 32"><unientity>9218</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 33"><unientity>91FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 36"><unientity>9208</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 37"><unientity>9226</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 38"><unientity>921C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 3B"><unientity>9224</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 43"><unientity>9212</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 48"><unientity>91FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 4A"><unientity>9216</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 4B"><unientity>9211</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 4E"><unientity>9206</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 4F"><unientity>92A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 51"><unientity>9230</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 52"><unientity>9249</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 54"><unientity>924D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 55"><unientity>9248</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 58"><unientity>923A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 5C"><unientity>922E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 5F"><unientity>9233</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 61"><unientity>9266</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 64"><unientity>925E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 68"><unientity>9235</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 6B"><unientity>9250</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 6C"><unientity>926B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 6D"><unientity>9239</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 6F"><unientity>926D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 70"><unientity>926C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 71"><unientity>924F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 74"><unientity>923F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 77"><unientity>9260</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 42 7E"><unientity>9236</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 23"><unientity>924E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 26"><unientity>924C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 27"><unientity>9256</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 2B"><unientity>925A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 2E"><unientity>9241</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 2F"><unientity>9283</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 31"><unientity>92A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 33"><unientity>9282</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 35"><unientity>92A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 37"><unientity>927C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 38"><unientity>92A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 3E"><unientity>9276</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 3F"><unientity>928D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 40"><unientity>92EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 42"><unientity>9288</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 43"><unientity>927A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 45"><unientity>928E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 46"><unientity>92A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 47"><unientity>9277</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 49"><unientity>92AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 50"><unientity>92A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 54"><unientity>927E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 55"><unientity>929A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 58"><unientity>92AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 5B"><unientity>9291</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 5D"><unientity>929B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 62"><unientity>927F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 64"><unientity>92A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 66"><unientity>92C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 6A"><unientity>92C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 6F"><unientity>92D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 71"><unientity>92F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 72"><unientity>92DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 75"><unientity>92E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 76"><unientity>92B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 77"><unientity>92C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 79"><unientity>92BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 7A"><unientity>92D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 43 7E"><unientity>92D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 21"><unientity>92C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 25"><unientity>92F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 27"><unientity>92CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 2A"><unientity>92B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 2C"><unientity>92E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 2D"><unientity>92C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 2E"><unientity>92F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 2F"><unientity>92DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 30"><unientity>92DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 31"><unientity>92D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 33"><unientity>92E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 35"><unientity>92DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 39"><unientity>92D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 3A"><unientity>92CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 3C"><unientity>92C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 3E"><unientity>92CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 40"><unientity>92EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 41"><unientity>92E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 43"><unientity>92EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 45"><unientity>92F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 48"><unientity>92F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 4C"><unientity>9303</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 4D"><unientity>9307</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 4E"><unientity>931E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 4F"><unientity>9344</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 53"><unientity>931D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 54"><unientity>92FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 58"><unientity>931F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 5A"><unientity>9331</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 5B"><unientity>9306</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 5D"><unientity>92F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 5F"><unientity>930F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 62"><unientity>9302</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 64"><unientity>9324</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 66"><unientity>9312</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 69"><unientity>9338</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 6A"><unientity>9323</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 6C"><unientity>9321</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 71"><unientity>9340</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 72"><unientity>9301</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 74"><unientity>9315</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 76"><unientity>9329</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 78"><unientity>932E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 79"><unientity>932A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 7B"><unientity>933F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 7C"><unientity>933A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 44 7E"><unientity>9335</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 22"><unientity>9314</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 28"><unientity>92FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 2F"><unientity>9342</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 31"><unientity>9341</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 32"><unientity>9319</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 35"><unientity>934C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 41"><unientity>9379</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 44"><unientity>9386</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 47"><unientity>936A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 48"><unientity>935C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 4C"><unientity>934F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 4D"><unientity>9347</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 51"><unientity>937A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 53"><unientity>9356</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 54"><unientity>9371</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 56"><unientity>937C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 5C"><unientity>9377</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 5D"><unientity>9349</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 5E"><unientity>9358</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 5F"><unientity>935A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 60"><unientity>E9F0</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="23 45 62"><unientity>935F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 64"><unientity>9376</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 66"><unientity>9355</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 67"><unientity>9354</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 6A"><unientity>9348</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 6B"><unientity>9374</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 6E"><unientity>9351</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 6F"><unientity>9364</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 71"><unientity>936B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 72"><unientity>936D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 73"><unientity>9360</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 77"><unientity>936E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 79"><unientity>938F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 7A"><unientity>93AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 7B"><unientity>9395</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 45 7E"><unientity>938B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 21"><unientity>93B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 22"><unientity>938C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 23"><unientity>9388</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 25"><unientity>93B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 27"><unientity>93A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 28"><unientity>93B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 29"><unientity>93A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 2A"><unientity>93B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 2B"><unientity>939B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 2D"><unientity>9398</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 3C"><unientity>9389</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 3D"><unientity>93A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 40"><unientity>93BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 42"><unientity>93A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 44"><unientity>93BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 47"><unientity>93A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 48"><unientity>939A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 4A"><unientity>93AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 4D"><unientity>939E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 4F"><unientity>9397</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 51"><unientity>93BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 53"><unientity>93F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 56"><unientity>93DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 57"><unientity>93EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 5A"><unientity>93C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 5B"><unientity>93F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 5D"><unientity>93D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 5F"><unientity>93E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 62"><unientity>93F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 63"><unientity>93CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 64"><unientity>93C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 66"><unientity>93E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 67"><unientity>93E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 72"><unientity>93DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 73"><unientity>93D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 74"><unientity>93EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 75"><unientity>93DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 46 7C"><unientity>93CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 2C"><unientity>93D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 2F"><unientity>93A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 30"><unientity>93E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 32"><unientity>940B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 34"><unientity>9413</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 3B"><unientity>940F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 3C"><unientity>E9F1</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="23 47 3D"><unientity>93FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 49"><unientity>93FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 4D"><unientity>9419</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 4E"><unientity>940D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 50"><unientity>9426</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 51"><unientity>9427</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 55"><unientity>9409</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 58"><unientity>9414</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 59"><unientity>9404</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 5C"><unientity>9422</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 5D"><unientity>9406</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 60"><unientity>9410</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 62"><unientity>9423</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 67"><unientity>93F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 69"><unientity>93F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 6A"><unientity>9407</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 6F"><unientity>940E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 71"><unientity>9411</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 74"><unientity>943F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 79"><unientity>9429</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 47 7C"><unientity>943D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 27"><unientity>93F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 28"><unientity>9436</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 2B"><unientity>943B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 2D"><unientity>9424</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 30"><unientity>9437</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 32"><unientity>9440</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 35"><unientity>942B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 36"><unientity>942D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 37"><unientity>9441</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 38"><unientity>9431</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 3D"><unientity>9467</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 3E"><unientity>944C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 40"><unientity>9445</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 42"><unientity>9450</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 4A"><unientity>944A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 53"><unientity>9466</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 57"><unientity>9464</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 58"><unientity>9462</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 5C"><unientity>9465</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 5D"><unientity>9455</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 5E"><unientity>945E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 62"><unientity>946A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 68"><unientity>946B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 69"><unientity>946D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 6C"><unientity>946F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 6D"><unientity>9471</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 71"><unientity>9477</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 7B"><unientity>9482</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 48 7C"><unientity>9481</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 2E"><unientity>9585</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 30"><unientity>9588</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 31"><unientity>958C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 34"><unientity>9597</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 36"><unientity>958E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 38"><unientity>959F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 3A"><unientity>95A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 42"><unientity>95AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 44"><unientity>95AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 48"><unientity>95BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 49"><unientity>95BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 4A"><unientity>95CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 4D"><unientity>95B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 4E"><unientity>95BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 4F"><unientity>95B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 50"><unientity>95BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 52"><unientity>95BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 59"><unientity>95C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 5D"><unientity>95CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 60"><unientity>95D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 62"><unientity>95D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 63"><unientity>95D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 64"><unientity>95D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 65"><unientity>95C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 66"><unientity>95DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 69"><unientity>95DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 6A"><unientity>95E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 6F"><unientity>95E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 72"><unientity>95E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 76"><unientity>95E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 7A"><unientity>961E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 7B"><unientity>9624</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 49 7C"><unientity>9622</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 21"><unientity>9627</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 2F"><unientity>9642</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 30"><unientity>963D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 32"><unientity>963C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 3C"><unientity>9651</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 42"><unientity>9660</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 44"><unientity>965C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 46"><unientity>9658</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 4A"><unientity>965F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 4B"><unientity>9656</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 51"><unientity>966C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 5D"><unientity>967B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 5E"><unientity>967F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 62"><unientity>967E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 63"><unientity>9684</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 65"><unientity>9688</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 6C"><unientity>9689</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 6D"><unientity>9682</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 6E"><unientity>9683</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 79"><unientity>9696</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4A 7A"><unientity>9697</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 2F"><unientity>96A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 35"><unientity>96A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 37"><unientity>96AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 3B"><unientity>96B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 3C"><unientity>96B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 3E"><unientity>96B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 48"><unientity>96B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 49"><unientity>96BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 52"><unientity>96CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 53"><unientity>96CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 57"><unientity>96D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 64"><unientity>96DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 66"><unientity>96D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 67"><unientity>96DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 71"><unientity>96E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 74"><unientity>96F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 76"><unientity>96F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 77"><unientity>96F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 78"><unientity>96FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4B 7A"><unientity>96F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 22"><unientity>96FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 27"><unientity>9702</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 29"><unientity>9708</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 2A"><unientity>9705</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 38"><unientity>971B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 3D"><unientity>971D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 3E"><unientity>9719</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 47"><unientity>9723</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 49"><unientity>9722</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 4A"><unientity>9724</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 4E"><unientity>9728</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 50"><unientity>9726</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 52"><unientity>9731</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 58"><unientity>9730</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 5C"><unientity>9736</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 6A"><unientity>9741</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 6B"><unientity>9747</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 6C"><unientity>9746</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 6E"><unientity>9749</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 75"><unientity>9758</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 76"><unientity>975A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 78"><unientity>975D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 7B"><unientity>975F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4C 7D"><unientity>9764</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 25"><unientity>9767</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 2C"><unientity>976B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 30"><unientity>976E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 31"><unientity>9777</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 32"><unientity>9778</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 35"><unientity>9773</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 37"><unientity>9783</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 38"><unientity>977A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 3A"><unientity>9780</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 3C"><unientity>9781</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 40"><unientity>9784</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 43"><unientity>977F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 49"><unientity>9789</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 54"><unientity>9794</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 59"><unientity>979B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 5A"><unientity>979F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 5C"><unientity>979A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 62"><unientity>979C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 6A"><unientity>97AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 70"><unientity>97AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 71"><unientity>97A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 74"><unientity>97AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 78"><unientity>97A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 7A"><unientity>97B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4D 7C"><unientity>97B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 24"><unientity>97B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 26"><unientity>97B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 29"><unientity>97B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 2D"><unientity>97B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 35"><unientity>97BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 38"><unientity>97C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 3B"><unientity>97C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 43"><unientity>97C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 4B"><unientity>97CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 4C"><unientity>97CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 4E"><unientity>97D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 51"><unientity>97D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 53"><unientity>97D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 54"><unientity>97D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 59"><unientity>97DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 5C"><unientity>97DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 5E"><unientity>97E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 60"><unientity>97E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 6C"><unientity>97F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 73"><unientity>97FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 79"><unientity>9807</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 7B"><unientity>980F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4E 7E"><unientity>980D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 23"><unientity>980E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 26"><unientity>9816</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 2C"><unientity>9826</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 2D"><unientity>981E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 34"><unientity>982B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 37"><unientity>9820</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 38"><unientity>981F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 3D"><unientity>9833</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 40"><unientity>982E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 44"><unientity>982F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 45"><unientity>9832</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 4B"><unientity>9847</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 4E"><unientity>9844</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 60"><unientity>9852</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 62"><unientity>984B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 66"><unientity>983F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 6A"><unientity>985C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 6B"><unientity>9859</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 6F"><unientity>9857</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 72"><unientity>9856</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 77"><unientity>9862</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 4F 7E"><unientity>9868</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 21"><unientity>9865</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 22"><unientity>9866</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 29"><unientity>986C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 30"><unientity>9873</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 31"><unientity>9874</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 39"><unientity>98AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 40"><unientity>98B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 48"><unientity>98B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 4A"><unientity>98BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 4D"><unientity>98BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 4E"><unientity>98C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 53"><unientity>98C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 5F"><unientity>98E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 60"><unientity>98E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 61"><unientity>98E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 63"><unientity>98E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 68"><unientity>98F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 50 6C"><unientity>98EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 24"><unientity>9907</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 28"><unientity>9902</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 2F"><unientity>9916</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 30"><unientity>9914</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 31"><unientity>9917</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 32"><unientity>9911</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 38"><unientity>9915</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 3A"><unientity>9924</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 3B"><unientity>991F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 40"><unientity>991C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 43"><unientity>9929</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 45"><unientity>9927</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 47"><unientity>991A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 4F"><unientity>992E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 50"><unientity>992C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 51"><unientity>992A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 53"><unientity>9933</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 54"><unientity>E972</unientity><unientityalt>9942</unientityalt><desc>Variant of 4D5154 which maps to 9942</desc></character>
-<character hex="23 51 55"><unientity>9932</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 56"><unientity>992B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 58"><unientity>9931</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 5C"><unientity>993B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 60"><unientity>993A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 61"><unientity>9941</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 64"><unientity>9940</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 66"><unientity>993C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 6A"><unientity>9948</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 6C"><unientity>9947</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 6D"><unientity>9949</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 70"><unientity>9943</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 71"><unientity>994D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 72"><unientity>994C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 73"><unientity>994E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 74"><unientity>9950</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 7A"><unientity>9958</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 7B"><unientity>9954</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 51 7E"><unientity>9955</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 22"><unientity>E973</unientity><unientityalt>9957</unientityalt><desc>Variant of 475222 which maps to 9957</desc></character>
-<character hex="23 52 29"><unientity>995D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 2B"><unientity>995F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 2F"><unientity>9997</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 30"><unientity>9998</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 3B"><unientity>99A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 3C"><unientity>99A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 3E"><unientity>99A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 41"><unientity>99A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 42"><unientity>99AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 49"><unientity>99B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 4D"><unientity>99BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 4E"><unientity>99BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 4F"><unientity>99C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 53"><unientity>99B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 54"><unientity>99BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 61"><unientity>99D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 63"><unientity>99D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 65"><unientity>99C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 69"><unientity>99D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 74"><unientity>99EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 7A"><unientity>99F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 7B"><unientity>99E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 52 7C"><unientity>99EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 24"><unientity>9A02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 29"><unientity>99F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 2A"><unientity>99F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 30"><unientity>99FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 31"><unientity>99FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 3D"><unientity>9A0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 3E"><unientity>9A0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 3F"><unientity>9A09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 44"><unientity>9A04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 45"><unientity>9A11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 47"><unientity>9A05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 48"><unientity>9A10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 4C"><unientity>9A24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 4D"><unientity>9A22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 4F"><unientity>9A20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 52"><unientity>9A27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 59"><unientity>9A2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 5A"><unientity>9A38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 60"><unientity>9A2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 61"><unientity>9A35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 64"><unientity>9A32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 69"><unientity>9A36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 6A"><unientity>9A2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 70"><unientity>9A41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 74"><unientity>9A3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 79"><unientity>9A42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 7A"><unientity>9A44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 7D"><unientity>9A48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 53 7E"><unientity>9A4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 22"><unientity>9A4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 24"><unientity>9A52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 27"><unientity>9A4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 2A"><unientity>9A58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 2C"><unientity>9A56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 33"><unientity>9A64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 34"><unientity>9A66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 3A"><unientity>9A6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 3F"><unientity>9AAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 41"><unientity>9AAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 43"><unientity>9AB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 45"><unientity>9AB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 49"><unientity>9AB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 4C"><unientity>9ABB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 50"><unientity>9ABA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 54"><unientity>9ABD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 57"><unientity>9AC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 59"><unientity>9AC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 5A"><unientity>9AC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 5D"><unientity>9AC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 66"><unientity>9AD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 6A"><unientity>9AD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 6D"><unientity>9AD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 72"><unientity>9ADC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 74"><unientity>9ADF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 76"><unientity>9AE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 54 77"><unientity>9AE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 21"><unientity>9AE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 27"><unientity>9AEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 28"><unientity>9AF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 2A"><unientity>9AEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 32"><unientity>9AF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 35"><unientity>9AFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 36"><unientity>9B01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 38"><unientity>9B02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 3B"><unientity>9B00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 3C"><unientity>9B08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 3E"><unientity>9B04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 41"><unientity>9B05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 43"><unientity>9B0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 47"><unientity>9B0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 4E"><unientity>9B11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 4F"><unientity>9B10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 54"><unientity>9B18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 56"><unientity>9B1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 5E"><unientity>9B1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 66"><unientity>9B23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 6C"><unientity>9B29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 73"><unientity>9B2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 74"><unientity>E9F2</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="23 55 76"><unientity>9B2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 55 7D"><unientity>9B34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 22"><unientity>9B35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 23"><unientity>9B37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 36"><unientity>9B43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 3A"><unientity>9B48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 3C"><unientity>9B4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 3E"><unientity>9B4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 41"><unientity>9B4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 47"><unientity>9B51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 5D"><unientity>9B74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 63"><unientity>9B68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 72"><unientity>9B80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 73"><unientity>9B8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 7A"><unientity>9B95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 56 7B"><unientity>9B7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 21"><unientity>9B83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 29"><unientity>9B8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 2B"><unientity>9B90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 2E"><unientity>9B93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 2F"><unientity>9B97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 31"><unientity>9B92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 32"><unientity>9B98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 36"><unientity>9B9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 39"><unientity>9B9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 3C"><unientity>9BAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 3D"><unientity>9B9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 3F"><unientity>9BA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 42"><unientity>9B9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 43"><unientity>9B99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 49"><unientity>9B86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 4E"><unientity>9BA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 56"><unientity>9BC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 59"><unientity>9BD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 5D"><unientity>9BC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 5E"><unientity>9BBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 5F"><unientity>9BC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 66"><unientity>9BB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 6B"><unientity>9BBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 6C"><unientity>9BD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 6E"><unientity>9BC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 72"><unientity>9BC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 77"><unientity>9BD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 7A"><unientity>9BD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 57 7C"><unientity>9BEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 23"><unientity>9BD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 27"><unientity>9BE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 2B"><unientity>9BF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 2C"><unientity>9BE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 2D"><unientity>9BDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 2F"><unientity>9BE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 31"><unientity>9BF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 34"><unientity>9BD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 3E"><unientity>9BFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 43"><unientity>9C06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 44"><unientity>9C15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 49"><unientity>9C0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 4B"><unientity>9C08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 4C"><unientity>9C14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 4D"><unientity>9C04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 52"><unientity>9C02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 54"><unientity>9C10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 59"><unientity>9C12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 5C"><unientity>9C09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 66"><unientity>9C1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 69"><unientity>9C2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 6E"><unientity>9C23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 70"><unientity>9C2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 71"><unientity>9C28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 78"><unientity>9C21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 79"><unientity>9C24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 58 7E"><unientity>9C46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 25"><unientity>9C32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 26"><unientity>9C44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 28"><unientity>9C48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 29"><unientity>9C39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 2A"><unientity>9C33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 30"><unientity>9C47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 32"><unientity>9C35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 34"><unientity>9C37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 38"><unientity>9C52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 3B"><unientity>9C58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 45"><unientity>9C51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 49"><unientity>9C63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 4F"><unientity>9C67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 55"><unientity>9C5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 56"><unientity>9C60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 58"><unientity>9C6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 5B"><unientity>9C68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 5C"><unientity>9C6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 5E"><unientity>9C6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 6B"><unientity>9C7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 73"><unientity>9CE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 74"><unientity>9CF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 59 77"><unientity>9CF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 21"><unientity>9D02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 22"><unientity>9D03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 23"><unientity>9CF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 24"><unientity>9D04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 28"><unientity>9D07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 2C"><unientity>9CF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 2F"><unientity>9D2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 30"><unientity>9D25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 3F"><unientity>9D1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 44"><unientity>9D1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 48"><unientity>9D1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 4F"><unientity>9D41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 53"><unientity>9D36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 63"><unientity>9D3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 65"><unientity>9D30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 68"><unientity>9D42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 69"><unientity>9D40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 6B"><unientity>9D3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 70"><unientity>9D5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 75"><unientity>9D53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5A 7B"><unientity>9D59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 26"><unientity>9D5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 2A"><unientity>9D52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 2C"><unientity>9D77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 2E"><unientity>9D8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 2F"><unientity>9D7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 35"><unientity>9D87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 3F"><unientity>9D78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 42"><unientity>9D7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 47"><unientity>9D69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 4D"><unientity>9D7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 4F"><unientity>9D83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 52"><unientity>9D6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 59"><unientity>9DA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 5E"><unientity>9D92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 60"><unientity>9D98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 66"><unientity>9DA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 67"><unientity>9DAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 6A"><unientity>9DA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 6B"><unientity>9D9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 70"><unientity>9D96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 74"><unientity>9DB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 76"><unientity>9DB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 77"><unientity>9DBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 79"><unientity>9DC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 7A"><unientity>9DC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 7B"><unientity>9DB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 7C"><unientity>9DBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5B 7E"><unientity>9DCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 22"><unientity>9DC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 27"><unientity>9DC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 28"><unientity>9DBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 32"><unientity>9DB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 34"><unientity>9DAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 36"><unientity>9DB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 3A"><unientity>9DDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 3E"><unientity>9DD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 45"><unientity>9DD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 46"><unientity>9DDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 4F"><unientity>9DE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 57"><unientity>9DF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 5B"><unientity>9DF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 5C"><unientity>9DFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 5F"><unientity>9DEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 65"><unientity>9DEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 6A"><unientity>9DED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 6C"><unientity>9DE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 6D"><unientity>9DEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 71"><unientity>9E07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5C 7E"><unientity>9DFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 27"><unientity>9E0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 2B"><unientity>9E11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 36"><unientity>9E15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 37"><unientity>9E18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 39"><unientity>9E1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 3A"><unientity>9E1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 3B"><unientity>9E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 3C"><unientity>9E75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 42"><unientity>9E7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 43"><unientity>9E7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 47"><unientity>9E80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 48"><unientity>9E83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 49"><unientity>9E84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 4B"><unientity>9E88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 4F"><unientity>9E87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 55"><unientity>9E90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 58"><unientity>9E8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 5A"><unientity>9E95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 5C"><unientity>9E91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 5D"><unientity>9E9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 66"><unientity>9E9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 77"><unientity>9EAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 79"><unientity>9EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5D 7A"><unientity>9EB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 30"><unientity>9EC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 35"><unientity>9EC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 37"><unientity>9EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 42"><unientity>9ECC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 4A"><unientity>9ED0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 4C"><unientity>9ED3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 53"><unientity>9EDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 55"><unientity>9EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 57"><unientity>9EE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 59"><unientity>9EE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 5C"><unientity>9EE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 60"><unientity>9EEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 66"><unientity>9EF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 6F"><unientity>9EF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 74"><unientity>9EF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 76"><unientity>9EFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 77"><unientity>9EFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 7A"><unientity>9EFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 7B"><unientity>E9F3</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="23 5E 7C"><unientity>9EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5E 7D"><unientity>9F02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 2F"><unientity>9F0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 31"><unientity>9F10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 32"><unientity>9F12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 33"><unientity>9F16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 34"><unientity>9F17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 37"><unientity>9F1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 45"><unientity>9F22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 48"><unientity>9F2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 49"><unientity>9F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 53"><unientity>9F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 5E"><unientity>9F39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 5F"><unientity>9F37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 64"><unientity>9F3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 69"><unientity>9F41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 6D"><unientity>9F45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 6F"><unientity>9F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 71"><unientity>9F48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 73"><unientity>9F49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 79"><unientity>9F4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 7B"><unientity>9F4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 7C"><unientity>9F54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 5F 7E"><unientity>9F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 23"><unientity>9F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 28"><unientity>9F60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 3F"><unientity>9F6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 40"><unientity>9F6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 47"><unientity>9F76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 5B"><unientity>9F8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 61"><unientity>9F93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 62"><unientity>9F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 6B"><unientity>9FA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 71"><unientity>9FA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="23 60 72"><unientity>9FA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 30 32"><unientity>5E76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 30 4C"><unientity>5E72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 30 4D"><unientity>4E71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 30 58"><unientity>4E9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 38"><unientity>5E03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 3C"><unientity>5360</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 4C"><unientity>6765</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 4F"><unientity>4ED1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 5D"><unientity>4FA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 69"><unientity>E901</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 31 6C"><unientity>4ED3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 73"><unientity>4EEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 31 79"><unientity>4FE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 24"><unientity>4E2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 26"><unientity>4F25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 2D"><unientity>4F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 2E"><unientity>E902</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 32 33"><unientity>4F1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 35"><unientity>4FA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 38"><unientity>4FA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 3E"><unientity>5BB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 40"><unientity>5907</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 41"><unientity>6770</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 43"><unientity>4F27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 44"><unientity>4F1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 46"><unientity>4F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 47"><unientity>503A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 49"><unientity>4EC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 4A"><unientity>503E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 4C"><unientity>4F24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 51"><unientity>4FA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 55"><unientity>4EC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 56"><unientity>4F2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 57"><unientity>8C61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 58"><unientity>4FA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 59"><unientity>4EEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 5A"><unientity>4EBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 5D"><unientity>4EF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 5E"><unientity>4FAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 60"><unientity>4FA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 61"><unientity>4FED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 62"><unientity>50A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 63"><unientity>E903</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 32 65"><unientity>4FE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 66"><unientity>4F18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 67"><unientity>507F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 69"><unientity>50A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 6A"><unientity>4FEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 6B"><unientity>4FE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 73"><unientity>51F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 7A"><unientity>513F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 32 7B"><unientity>5156</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 23"><unientity>4E24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 40"><unientity>51BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 48"><unientity>51EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 6B"><unientity>514B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 6D"><unientity>5219</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 70"><unientity>521A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 76"><unientity>5240</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 78"><unientity>521B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 7C"><unientity>5212</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 33 7E"><unientity>5267</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 21"><unientity>5251</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 22"><unientity>5218</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 23"><unientity>5242</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 2F"><unientity>52B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 33"><unientity>52A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 34"><unientity>52A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 35"><unientity>52B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 36"><unientity>52CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 37"><unientity>80DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 38"><unientity>52BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 3C"><unientity>52B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 3D"><unientity>529D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 51"><unientity>6C47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 52"><unientity>532E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 55"><unientity>533A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 5F"><unientity>5346</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 60"><unientity>534F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 7A"><unientity>538C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 7B"><unientity>5389</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 34 7D"><unientity>53C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 35 2B"><unientity>4E1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 3E"><unientity>5458</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 48"><unientity>95EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 49"><unientity>54D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 63"><unientity>4E27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 68"><unientity>5355</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 6D"><unientity>5524</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 6F"><unientity>4E54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 71"><unientity>54DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 78"><unientity>556C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 36 7A"><unientity>5417</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 21"><unientity>545C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 22"><unientity>545B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 27"><unientity>5567</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 2C"><unientity>53F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 2E"><unientity>5455</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 30"><unientity>5C1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 31"><unientity>55BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 32"><unientity>5520</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 33"><unientity>5578</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 3D"><unientity>5480</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 40"><unientity>53FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 44"><unientity>5428</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 45"><unientity>55B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 46"><unientity>E904</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 37 47"><unientity>54DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 4B"><unientity>55F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 4E"><unientity>549B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 51"><unientity>5413</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 54"><unientity>565C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 55"><unientity>5411</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 56"><unientity>5499</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 5A"><unientity>4E25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 5B"><unientity>5624</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 5C"><unientity>556D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 5D"><unientity>55EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 5E"><unientity>56A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 61"><unientity>E905</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 37 62"><unientity>5453</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 64"><unientity>5631</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 6F"><unientity>56EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 70"><unientity>56F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 71"><unientity>56ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 72"><unientity>5706</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 73"><unientity>56E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 37 74"><unientity>56FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 3B"><unientity>6267</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 3E"><unientity>57A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 44"><unientity>62A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 45"><unientity>5C27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 4A"><unientity>573A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 4D"><unientity>6D82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 55"><unientity>575E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 56"><unientity>5757</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 59"><unientity>5C18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 5A"><unientity>57AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 5B"><unientity>5811</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 60"><unientity>575F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 61"><unientity>5760</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 62"><unientity>5815</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 64"><unientity>575B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 67"><unientity>57A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 69"><unientity>538B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 6B"><unientity>5739</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 6C"><unientity>5792</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 6D"><unientity>5784</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 6E"><unientity>574F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 6F"><unientity>575C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 71"><unientity>575D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 74"><unientity>58EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 76"><unientity>58F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 38 77"><unientity>5BFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 23"><unientity>4F19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 24"><unientity>68A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 2E"><unientity>5939</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 3F"><unientity>5941</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 40"><unientity>593A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 41"><unientity>594B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 39 53"><unientity>5986</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 27"><unientity>5987</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 28"><unientity>5A04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 36"><unientity>5988</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 3B"><unientity>59AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 41"><unientity>5A34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 43"><unientity>5A75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 44"><unientity>5A07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 45"><unientity>59A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 48"><unientity>5AD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 4A"><unientity>5A74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 4B"><unientity>5A76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 5B"><unientity>5B59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 5F"><unientity>5B5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 60"><unientity>5B66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3A 63"><unientity>5B6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 2E"><unientity>5BDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 31"><unientity>5B9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 32"><unientity>5B81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 35"><unientity>5BBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 36"><unientity>5BA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 37"><unientity>5199</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 38"><unientity>5BA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 39"><unientity>5B9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 3F"><unientity>4E13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 40"><unientity>5C06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 42"><unientity>5BFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 43"><unientity>5BF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 44"><unientity>5BFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 4C"><unientity>5C34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 60"><unientity>5C61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 61"><unientity>5C42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 63"><unientity>5C5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 6E"><unientity>5188</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 74"><unientity>5CE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3B 79"><unientity>5C9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 28"><unientity>5C9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 2A"><unientity>5D2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 2B"><unientity>5C96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 2D"><unientity>5C7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 2E"><unientity>5CB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 31"><unientity>5CE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 32"><unientity>5DC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 33"><unientity>5CA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 4F"><unientity>5E05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 51"><unientity>5E08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 52"><unientity>5E10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 53"><unientity>5E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 58"><unientity>5E27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 5C"><unientity>5E3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 5E"><unientity>5E01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 60"><unientity>5E1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 61"><unientity>5E2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 6B"><unientity>51E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 76"><unientity>5E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 77"><unientity>5750</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3C 7E"><unientity>5395</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 27"><unientity>5E9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2A"><unientity>5E7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2B"><unientity>5E99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2C"><unientity>5382</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2D"><unientity>5E9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2E"><unientity>5E90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 2F"><unientity>5385</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 47"><unientity>5F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 4B"><unientity>5F39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 4C"><unientity>5F25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 4D"><unientity>5F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 4F"><unientity>E906</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 3D 65"><unientity>540E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 67"><unientity>5F84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 6C"><unientity>4ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 6F"><unientity>590D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 74"><unientity>5F7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3D 76"><unientity>5F81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 57"><unientity>5FF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 5C"><unientity>95F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 5E"><unientity>6005</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 61"><unientity>6076</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 6C"><unientity>60EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 70"><unientity>607B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 77"><unientity>7231</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3E 7E"><unientity>607C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 28"><unientity>6001</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 29"><unientity>5FFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 2B"><unientity>6006</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 2E"><unientity>5E86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 31"><unientity>60ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 33"><unientity>5FE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 36"><unientity>8651</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 38"><unientity>60E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 39"><unientity>60EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 3A"><unientity>6078</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 3B"><unientity>6002</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 3C"><unientity>6B32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 3E"><unientity>5BAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 3F"><unientity>51ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 41"><unientity>60AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 42"><unientity>6124</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 44"><unientity>60EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 45"><unientity>6187</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 47"><unientity>60EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 48"><unientity>5FC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 4A"><unientity>5E94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 4B"><unientity>601C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 4E"><unientity>6073</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 54"><unientity>6000</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 55"><unientity>61D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 56"><unientity>60AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 58"><unientity>5FCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 59"><unientity>6151</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 5B"><unientity>60E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 5C"><unientity>604B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 6E"><unientity>6218</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 3F 6F"><unientity>620F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 40 6C"><unientity>631F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 40 7B"><unientity>5377</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 40 7D"><unientity>626B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 40 7E"><unientity>626A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 23"><unientity>6302</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 36"><unientity>62A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 3C"><unientity>62E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 3F"><unientity>626C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 42"><unientity>6325</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 4F"><unientity>635F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 53"><unientity>6363</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 55"><unientity>62A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 5A"><unientity>5C4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 5B"><unientity>631A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 5F"><unientity>6402</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 60"><unientity>63B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 65"><unientity>635E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 66"><unientity>62E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 68"><unientity>6320</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 6E"><unientity>6251</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 71"><unientity>629A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 74"><unientity>62E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 76"><unientity>51FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 77"><unientity>631E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 7A"><unientity>6321</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 7C"><unientity>636E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 7D"><unientity>63B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 41 7E"><unientity>62E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 22"><unientity>62C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 24"><unientity>6361</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 25"><unientity>6324</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 26"><unientity>62E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 28"><unientity>62DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 29"><unientity>6401</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 2A"><unientity>6269</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 2B"><unientity>63B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 2C"><unientity>64B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 2E"><unientity>6270</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 2F"><unientity>64DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 30"><unientity>6446</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 31"><unientity>62E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 33"><unientity>62E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 34"><unientity>6400</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 35"><unientity>6444</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 37"><unientity>631B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 38"><unientity>644A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 3A"><unientity>6405</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 3B"><unientity>63FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 47"><unientity>8D25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 4F"><unientity>542F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 52"><unientity>654C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 54"><unientity>6570</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 56"><unientity>655B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 57"><unientity>6BD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 63"><unientity>65A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 42 66"><unientity>65AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 2D"><unientity>65F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 32"><unientity>663C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 40"><unientity>6656</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 41"><unientity>6655</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 43"><unientity>7545</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 44"><unientity>6682</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 48"><unientity>6653</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 49"><unientity>E907</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 43 4B"><unientity>66A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 4D"><unientity>65F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 55"><unientity>4E66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 5A"><unientity>4F1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 43 66"><unientity>80E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 26"><unientity>4E1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 63"><unientity>6761</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 68"><unientity>67AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 69"><unientity>6800</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 6D"><unientity>5F03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 6E"><unientity>6816</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 71"><unientity>680B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 76"><unientity>6808</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 7A"><unientity>67A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 44 7C"><unientity>832D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 26"><unientity>6781</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 2A"><unientity>6768</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 2B"><unientity>6862</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 2D"><unientity>4E1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 2F"><unientity>67AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 37"><unientity>8363</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 39"><unientity>6784</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 40"><unientity>67AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 44"><unientity>6837</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 46"><unientity>6869</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 47"><unientity>6807</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 49"><unientity>67A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 4A"><unientity>697C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 4C"><unientity>6868</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 4E"><unientity>4E50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 4F"><unientity>679E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 53"><unientity>692D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 55"><unientity>6811</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 57"><unientity>6866</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 58"><unientity>6734</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 5B"><unientity>6865</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 5D"><unientity>673A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 5F"><unientity>6863</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 61"><unientity>68C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 62"><unientity>6867</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 63"><unientity>67E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 64"><unientity>69DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 65"><unientity>67DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 66"><unientity>69DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6A"><unientity>6988</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6B"><unientity>691F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6C"><unientity>6809</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6D"><unientity>6A79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6E"><unientity>680F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 6F"><unientity>6A31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 70"><unientity>6743</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 71"><unientity>6984</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 78"><unientity>94A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 7A"><unientity>E908</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 45 7C"><unientity>6B27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 45 7E"><unientity>6B24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 21"><unientity>6B22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 29"><unientity>5C81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 2A"><unientity>5386</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 2B"><unientity>5F52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 33"><unientity>6B8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 35"><unientity>6B87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 36"><unientity>6B93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 37"><unientity>6BA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 38"><unientity>6B7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 3B"><unientity>6740</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 3C"><unientity>58F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 40"><unientity>6BB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 55"><unientity>6C14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 46 58"><unientity>6C22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 4E"><unientity>6CFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 59"><unientity>6CEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 68"><unientity>6D45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 74"><unientity>6E0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 77"><unientity>6CA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 47 7D"><unientity>6D8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 2D"><unientity>6C64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 30"><unientity>6D4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 31"><unientity>6DA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 33"><unientity>6D51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 3D"><unientity>6C9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 41"><unientity>6C85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 42"><unientity>706D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 44"><unientity>6E7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 48"><unientity>6CA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 4B"><unientity>51C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 4F"><unientity>6CAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 54"><unientity>6E0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 55"><unientity>6DA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 57"><unientity>6C49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 58"><unientity>6EE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 59"><unientity>6D9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 5A"><unientity>6E10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 5F"><unientity>6EDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 63"><unientity>6D46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 64"><unientity>6E17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 65"><unientity>6E14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 6C"><unientity>6CFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 6D"><unientity>6DA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 6E"><unientity>6DA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 6F"><unientity>6D01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 71"><unientity>6D47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 78"><unientity>6E83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 7B"><unientity>6DC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 48 7C"><unientity>6D53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 21"><unientity>6CFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 22"><unientity>6D4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 26"><unientity>6D4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 27"><unientity>6CDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 28"><unientity>6EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 2B"><unientity>6EE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 2D"><unientity>6D9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 2E"><unientity>6DA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 31"><unientity>6C88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 32"><unientity>6CFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 33"><unientity>6E0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 34"><unientity>6E85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 36"><unientity>6EE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 37"><unientity>6D4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 3A"><unientity>6FD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 3B"><unientity>6CA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 3C"><unientity>6FD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 3D"><unientity>6F47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 3F"><unientity>6F9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 41"><unientity>6D12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 42"><unientity>6EE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 43"><unientity>6E7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 44"><unientity>6EE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 4A"><unientity>707E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 51"><unientity>4E3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 5D"><unientity>4E4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 66"><unientity>65E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 6A"><unientity>70BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 6D"><unientity>70E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 6F"><unientity>7080</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 75"><unientity>6247</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 7D"><unientity>70ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 49 7E"><unientity>70EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 21"><unientity>70BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 22"><unientity>7096</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 24"><unientity>706F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 25"><unientity>7116</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 26"><unientity>70E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 2E"><unientity>8425</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 30"><unientity>70DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 31"><unientity>707F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 33"><unientity>70E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 36"><unientity>70C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 37"><unientity>7089</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 38"><unientity>70C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 42"><unientity>7237</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 45"><unientity>5C14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 46"><unientity>5899</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 4C"><unientity>724D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 53"><unientity>5B83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 5A"><unientity>7275</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 5E"><unientity>8366</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 61"><unientity>728A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 62"><unientity>727A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 68"><unientity>72B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 70"><unientity>72ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 72"><unientity>72C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 79"><unientity>72B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4A 7E"><unientity>72F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 22"><unientity>72EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 23"><unientity>72EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 27"><unientity>72EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 28"><unientity>72DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 29"><unientity>83B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2A"><unientity>72B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2B"><unientity>517D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2C"><unientity>730E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2D"><unientity>736D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2E"><unientity>732E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 2F"><unientity>7321</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 47"><unientity>73B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 57"><unientity>73F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 5E"><unientity>739B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 5F"><unientity>7410</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 64"><unientity>7391</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 67"><unientity>73AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 68"><unientity>7477</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 69"><unientity>73BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 6B"><unientity>73D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 74"><unientity>74EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4B 7A"><unientity>4EA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 2D"><unientity>4EA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 31"><unientity>7544</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 33"><unientity>6BD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 34"><unientity>5F02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 36"><unientity>753B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 39"><unientity>5F53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 3B"><unientity>7574</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 3C"><unientity>8FED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 56"><unientity>75C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 60"><unientity>75A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 61"><unientity>759F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 62"><unientity>75EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 63"><unientity>75AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 6A"><unientity>75AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 6D"><unientity>75E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 6E"><unientity>7597</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 71"><unientity>75A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 73"><unientity>75D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 75"><unientity>765E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 76"><unientity>763E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 77"><unientity>7663</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 78"><unientity>762B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 79"><unientity>766B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4C 7B"><unientity>53D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 29"><unientity>7691</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 2D"><unientity>76B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 3A"><unientity>76CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 3C"><unientity>5C3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 3D"><unientity>76D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 3E"><unientity>76D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 3F"><unientity>5362</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 56"><unientity>4F17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 57"><unientity>56F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 5D"><unientity>7750</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 73"><unientity>4E86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4D 7C"><unientity>77A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 27"><unientity>77EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 3B"><unientity>781A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 3E"><unientity>7815</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 45"><unientity>7855</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 49"><unientity>786E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 4C"><unientity>7801</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 53"><unientity>7816</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 58"><unientity>77F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 59"><unientity>7840</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 5A"><unientity>788D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 5B"><unientity>77FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 5C"><unientity>77FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 5D"><unientity>783A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 5E"><unientity>783E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 6F"><unientity>E909</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 4E 77"><unientity>7978</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 78"><unientity>796F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 7B"><unientity>7985</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 7C"><unientity>793C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4E 7D"><unientity>7977</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 22"><unientity>4E07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 25"><unientity>53B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 36"><unientity>5E0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 3C"><unientity>79F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 3D"><unientity>79CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 40"><unientity>8C37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 44"><unientity>79EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 46"><unientity>7A23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 49"><unientity>7A51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 4A"><unientity>79FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 4B"><unientity>E90A</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 4F 4C"><unientity>7A33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 5C"><unientity>6D3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 5D"><unientity>7A9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 5F"><unientity>7A77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 60"><unientity>7AA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 61"><unientity>7A8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 62"><unientity>7A9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 63"><unientity>7AA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 64"><unientity>7A83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 6B"><unientity>7ADE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 4F 70"><unientity>E90B</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 4F 79"><unientity>7B14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 21"><unientity>7B0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 23"><unientity>8345</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 2A"><unientity>94B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 2B"><unientity>7B3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 30"><unientity>8303</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 33"><unientity>8282</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 38"><unientity>7BAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 39"><unientity>7B03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 3A"><unientity>7B51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 3C"><unientity>7B5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 3E"><unientity>7BD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 41"><unientity>7B80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 42"><unientity>7BAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 45"><unientity>7BAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 46"><unientity>7BD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 48"><unientity>5E18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 4B"><unientity>7B7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 4C"><unientity>7BEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 4D"><unientity>7B79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 50"><unientity>7B3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 51"><unientity>7C41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 52"><unientity>E90C</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 50 53"><unientity>7BF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 54"><unientity>7BA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 55"><unientity>5401</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 60"><unientity>7C8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 62"><unientity>E90D</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 50 68"><unientity>7CAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 6B"><unientity>7CAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 6F"><unientity>7EA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 70"><unientity>7EAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 71"><unientity>7EA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 72"><unientity>7EA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 73"><unientity>7EAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 74"><unientity>7EA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 75"><unientity>7EA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 76"><unientity>7EBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 77"><unientity>7EB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 7A"><unientity>7EAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 7C"><unientity>7EB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 7D"><unientity>7EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 50 7E"><unientity>7EBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 21"><unientity>7EB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 22"><unientity>7EB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 23"><unientity>7EA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 24"><unientity>7EB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 25"><unientity>7EB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 26"><unientity>7ECA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 28"><unientity>7ECB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 29"><unientity>624E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 2A"><unientity>7ECD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 2B"><unientity>7EC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 2C"><unientity>7EC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 2D"><unientity>7EC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 2F"><unientity>7ECC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 30"><unientity>7EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 31"><unientity>7EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 32"><unientity>7EDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 33"><unientity>7ED2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 34"><unientity>7ED3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 36"><unientity>7EDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 37"><unientity>7EDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 38"><unientity>7EDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 39"><unientity>7ED9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 3B"><unientity>4E1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 3C"><unientity>7ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 3D"><unientity>6346</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 3E"><unientity>7EE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 3F"><unientity>7EE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 40"><unientity>7ED1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 41"><unientity>7EFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 42"><unientity>7EFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 43"><unientity>7EFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 44"><unientity>7D27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 45"><unientity>7EEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 46"><unientity>7F00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 48"><unientity>7F51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 49"><unientity>7EB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 4A"><unientity>7EF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 4C"><unientity>7EFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 4D"><unientity>7EF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 4E"><unientity>7EF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 4F"><unientity>7EF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 50"><unientity>7EB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 51"><unientity>7F01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 52"><unientity>7F14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 53"><unientity>7EAC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 54"><unientity>7EC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 55"><unientity>7EEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 56"><unientity>7F04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 57"><unientity>7F05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 58"><unientity>7F09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 59"><unientity>7F13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5A"><unientity>7F18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5B"><unientity>7F16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5C"><unientity>7EBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5D"><unientity>7F0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5E"><unientity>7F0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 5F"><unientity>7F23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 60"><unientity>7F22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 61"><unientity>8426</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 62"><unientity>7F1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 63"><unientity>81F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 64"><unientity>E974</unientity><unientityalt>53BF</unientityalt><desc>Variant of 455164 which maps to 53BF</desc></character>
-<character hex="27 51 65"><unientity>7F29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 66"><unientity>7EE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 67"><unientity>7F2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 68"><unientity>7F15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 69"><unientity>7F27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 6C"><unientity>7F1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 6D"><unientity>603B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 6E"><unientity>7EB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 6F"><unientity>7F2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 70"><unientity>7F2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 71"><unientity>7EC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 72"><unientity>7EE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 73"><unientity>7ED5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 74"><unientity>7F2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 75"><unientity>E90E</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 51 76"><unientity>7EF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 77"><unientity>8327</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 78"><unientity>7ECE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 79"><unientity>7ED8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 7A"><unientity>8FAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 7B"><unientity>7F24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 7D"><unientity>7EE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 51 7E"><unientity>7F20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 21"><unientity>7EED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 22"><unientity>7F28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 23"><unientity>7EA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 24"><unientity>7F06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 33"><unientity>7F5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 34"><unientity>9A82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 35"><unientity>7F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 37"><unientity>7F57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 38"><unientity>7F81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 42"><unientity>4E49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 4D"><unientity>4E60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 51"><unientity>7FC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 58"><unientity>7FD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 6F"><unientity>5723</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 71"><unientity>95FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 74"><unientity>58F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 75"><unientity>8038</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 76"><unientity>806A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 77"><unientity>8054</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 78"><unientity>804C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 79"><unientity>8042</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 7A"><unientity>804B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 52 7B"><unientity>542C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 21"><unientity>8083</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 44"><unientity>80C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 4A"><unientity>8090</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 4D"><unientity>8109</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 58"><unientity>80BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 59"><unientity>80C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 5E"><unientity>80A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 62"><unientity>80BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 65"><unientity>8111</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 6C"><unientity>80F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 6E"><unientity>80A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 71"><unientity>817B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 78"><unientity>8113</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 79"><unientity>80C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 7A"><unientity>8138</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 7B"><unientity>810D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 7C"><unientity>8110</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 7D"><unientity>8191</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 53 7E"><unientity>814A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 21"><unientity>80EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 22"><unientity>E90F</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 54 25"><unientity>4E34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 2B"><unientity>53F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 32"><unientity>4E0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 33"><unientity>5174</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 34"><unientity>4E3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 35"><unientity>65E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 4A"><unientity>8231</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 4B"><unientity>8230</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 4E"><unientity>8270</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 54 58"><unientity>E910</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 54 5C"><unientity>520D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 28"><unientity>835A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 29"><unientity>830E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 2A"><unientity>82CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 2D"><unientity>5E84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 3C"><unientity>534E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 41"><unientity>83B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 4D"><unientity>82C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 4F"><unientity>53F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 51"><unientity>E911</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 55 53"><unientity>8364</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 55"><unientity>83B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 5D"><unientity>5E2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 63"><unientity>836A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 64"><unientity>82CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 67"><unientity>82CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 68"><unientity>8298</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 6C"><unientity>83B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 6E"><unientity>836B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 71"><unientity>848B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 73"><unientity>535C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 76"><unientity>8361</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 55 7C"><unientity>829C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 22"><unientity>8427</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 24"><unientity>59DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 26"><unientity>8537</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 29"><unientity>84DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 2A"><unientity>8428</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 2E"><unientity>501F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 31"><unientity>827A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 32"><unientity>85AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 35"><unientity>836F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 37"><unientity>853C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 39"><unientity>853A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 3A"><unientity>82A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 3B"><unientity>82F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 3C"><unientity>82CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 3D"><unientity>8574</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 3E"><unientity>5170</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 40"><unientity>85D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 42"><unientity>841D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 44"><unientity>4E47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 47"><unientity>5904</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 48"><unientity>864F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 4A"><unientity>53F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 4C"><unientity>4E8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 5A"><unientity>65E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 76"><unientity>8680</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 56 79"><unientity>E912</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 56 7A"><unientity>867E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 24"><unientity>8424</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 25"><unientity>8682</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 2C"><unientity>877C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 32"><unientity>86F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 33"><unientity>866B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 34"><unientity>8749</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 35"><unientity>8681</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 36"><unientity>8747</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 3C"><unientity>86CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 3E"><unientity>8721</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 3F"><unientity>86CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 41"><unientity>8695</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 42"><unientity>86EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 46"><unientity>672E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 47"><unientity>4E8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 49"><unientity>536B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 4A"><unientity>E913</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 57 62"><unientity>8865</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 63"><unientity>91CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 65"><unientity>88C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 6C"><unientity>5236</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 71"><unientity>8934</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 73"><unientity>88E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 77"><unientity>4EB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 79"><unientity>891B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 7C"><unientity>88C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 57 7D"><unientity>8884</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 21"><unientity>889C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 22"><unientity>886C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 23"><unientity>88AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 28"><unientity>89C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 29"><unientity>89C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2A"><unientity>89C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2B"><unientity>89C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2C"><unientity>4EB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2D"><unientity>89CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2E"><unientity>89CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 2F"><unientity>89D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 30"><unientity>89C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 31"><unientity>89C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 32"><unientity>89C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 35"><unientity>89DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 38"><unientity>8BA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 39"><unientity>8BA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3A"><unientity>8BA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3B"><unientity>8BA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3C"><unientity>8BB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3D"><unientity>8BA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3E"><unientity>8BA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 3F"><unientity>8BAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 40"><unientity>8BAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 41"><unientity>8BAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 43"><unientity>8BAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 44"><unientity>8BBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 45"><unientity>8BC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 46"><unientity>8BB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 47"><unientity>8BB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 48"><unientity>8BB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 49"><unientity>8BBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 4A"><unientity>8BB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 4B"><unientity>8BBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 4C"><unientity>6CE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 4E"><unientity>8BC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 4F"><unientity>8BCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 51"><unientity>8BC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 52"><unientity>8BCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 53"><unientity>8BC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 54"><unientity>8BC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 55"><unientity>8BCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 56"><unientity>8BC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 57"><unientity>8BCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 58"><unientity>8BE7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 59"><unientity>8BE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5A"><unientity>8BE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5B"><unientity>8BD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5C"><unientity>8BD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5D"><unientity>8BD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5E"><unientity>8BE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 5F"><unientity>8BD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 60"><unientity>8BDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 61"><unientity>5938</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 62"><unientity>8BDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 63"><unientity>8BE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 65"><unientity>8BE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 66"><unientity>8BDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 67"><unientity>8BE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 68"><unientity>8BDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 69"><unientity>8BF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 6A"><unientity>8BF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 6B"><unientity>8BEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 6C"><unientity>8BED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 6D"><unientity>5FD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 6F"><unientity>8BEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 70"><unientity>8BA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 71"><unientity>8BEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 72"><unientity>8BF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 73"><unientity>8BF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 74"><unientity>8BF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 75"><unientity>8BF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 76"><unientity>8C0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 77"><unientity>8C06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 78"><unientity>8C05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 79"><unientity>8C08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 7A"><unientity>8BF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 7B"><unientity>8BF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 7C"><unientity>8BFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 7D"><unientity>8C03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 58 7E"><unientity>8BFF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 21"><unientity>8C04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 22"><unientity>8C01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 23"><unientity>8BDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 24"><unientity>8BBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 25"><unientity>8C1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 26"><unientity>8C1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 27"><unientity>8C0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 28"><unientity>8BB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 29"><unientity>8C10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2A"><unientity>8C0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2B"><unientity>8C0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2C"><unientity>8C12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2D"><unientity>8C13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2E"><unientity>8BFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 2F"><unientity>8BBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 30"><unientity>8C15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 31"><unientity>8C24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 32"><unientity>8C26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 33"><unientity>8C1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 34"><unientity>8BB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 35"><unientity>8C0E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 36"><unientity>8C23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 37"><unientity>8A8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 38"><unientity>8C22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 39"><unientity>8C28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3A"><unientity>8C2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3B"><unientity>8C1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3C"><unientity>8BC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3D"><unientity>8C31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3E"><unientity>8C32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 3F"><unientity>8BC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 40"><unientity>8C2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 42"><unientity>8BA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 43"><unientity>8BAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 46"><unientity>8BD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 47"><unientity>8C34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 48"><unientity>62A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 49"><unientity>8A89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 4A"><unientity>8BFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 4B"><unientity>53D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 4C"><unientity>8BA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 4D"><unientity>8C36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 4E"><unientity>8C17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 54"><unientity>5C82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 57"><unientity>7AD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 58"><unientity>4E30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 5E"><unientity>4E88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 66"><unientity>7683</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 68"><unientity>8D1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 69"><unientity>8D1E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6A"><unientity>8D1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6B"><unientity>8D21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6C"><unientity>8D22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6D"><unientity>8D23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6E"><unientity>8D2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 6F"><unientity>8D27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 70"><unientity>8D2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 71"><unientity>8D2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 72"><unientity>8D29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 75"><unientity>8D39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 76"><unientity>8D32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 77"><unientity>8D3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 78"><unientity>8D35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 79"><unientity>8D34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 7A"><unientity>4E70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 7B"><unientity>8D2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 7C"><unientity>8D3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 7D"><unientity>8D37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 59 7E"><unientity>8D38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 21"><unientity>8D45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 22"><unientity>8D44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 23"><unientity>8D3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 24"><unientity>8D3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 25"><unientity>8D3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 26"><unientity>8D40</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 27"><unientity>8D41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 28"><unientity>8D42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 29"><unientity>5BBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 2A"><unientity>8D48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 2B"><unientity>8D4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 2C"><unientity>8D54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 2D"><unientity>8D4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 2F"><unientity>5356</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 30"><unientity>8D24</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 31"><unientity>8D31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 32"><unientity>8D4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 33"><unientity>8D50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 34"><unientity>8D28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 35"><unientity>8D4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 36"><unientity>8D56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 37"><unientity>8D5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 38"><unientity>8D5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 39"><unientity>8D58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3A"><unientity>8D2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3B"><unientity>8D60</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3C"><unientity>8D5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3D"><unientity>8D5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3E"><unientity>8D62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 3F"><unientity>8D61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 40"><unientity>8D43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 41"><unientity>8D4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 42"><unientity>8D63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 4F"><unientity>8D75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 50"><unientity>8D76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 53"><unientity>8D8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 68"><unientity>8DF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 71"><unientity>8E0A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 78"><unientity>8E52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5A 7E"><unientity>8DF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 26"><unientity>8DB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 28"><unientity>8E0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 29"><unientity>8DC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 2A"><unientity>8E2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 2B"><unientity>8E51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 2C"><unientity>8E8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 31"><unientity>8EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 32"><unientity>8F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 33"><unientity>8F67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 34"><unientity>519B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 35"><unientity>8F68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 36"><unientity>8F69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 37"><unientity>8F6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 38"><unientity>8F6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 39"><unientity>8F6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3A"><unientity>8F72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3B"><unientity>8F74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3C"><unientity>8F76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3D"><unientity>8F83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3E"><unientity>8F7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 3F"><unientity>8F7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 40"><unientity>8F7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 41"><unientity>8F85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 42"><unientity>8F84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 43"><unientity>8F7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 45"><unientity>8F87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 46"><unientity>8F86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 47"><unientity>8F8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 48"><unientity>8F89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 49"><unientity>8F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4A"><unientity>8F6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4B"><unientity>8F8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4C"><unientity>8F90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4D"><unientity>8F91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4E"><unientity>8F93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 4F"><unientity>8F96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 50"><unientity>8F97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 51"><unientity>8F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 52"><unientity>6BC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 53"><unientity>8206</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 54"><unientity>8F99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 55"><unientity>8F6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 56"><unientity>8F9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 57"><unientity>8F7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 58"><unientity>8F70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 59"><unientity>8F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 5F"><unientity>529E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 60"><unientity>8F9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 61"><unientity>8FA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 64"><unientity>519C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 6D"><unientity>8FF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 7D"><unientity>8FD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5B 7E"><unientity>8FDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 33"><unientity>8FDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 34"><unientity>8FD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 39"><unientity>8FBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 3A"><unientity>8FDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 3C"><unientity>8FC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 3E"><unientity>8FC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 44"><unientity>8FDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 45"><unientity>900A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 48"><unientity>9012</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 49"><unientity>9002</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 4F"><unientity>9009</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 50"><unientity>8FDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 51"><unientity>8FC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 52"><unientity>8FBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 53"><unientity>9057</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 56"><unientity>8FC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 57"><unientity>8FD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 5A"><unientity>E975</unientity><unientityalt>8FE9</unientityalt><desc>Variant of 2D5C5A which maps to 8FE9</desc></character>
-<character hex="27 5C 5B"><unientity>8FB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 5C"><unientity>9026</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 5D"><unientity>903B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 6B"><unientity>5369</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 6D"><unientity>90AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 70"><unientity>4E61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 71"><unientity>90B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 73"><unientity>90D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 74"><unientity>90BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5C 75"><unientity>9093</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 2A"><unientity>9154</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 2F"><unientity>915D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 30"><unientity>4E11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 31"><unientity>533B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 32"><unientity>9171</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 34"><unientity>917F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 35"><unientity>8845</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 38"><unientity>91CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 3D"><unientity>5398</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 3F"><unientity>9488</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 40"><unientity>9489</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 41"><unientity>948A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 43"><unientity>9497</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 45"><unientity>9493</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 46"><unientity>948F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 47"><unientity>9499</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 48"><unientity>949D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 49"><unientity>94AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 4A"><unientity>94A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 4B"><unientity>949E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 4C"><unientity>94A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 4D"><unientity>94A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 4F"><unientity>94B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 50"><unientity>94B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 51"><unientity>94B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 52"><unientity>94C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 53"><unientity>94BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 55"><unientity>94C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 56"><unientity>94A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 57"><unientity>94C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 58"><unientity>94C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 59"><unientity>94F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5A"><unientity>94F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5B"><unientity>94D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5C"><unientity>94DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5D"><unientity>94ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5E"><unientity>94E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 5F"><unientity>94EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 60"><unientity>94E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 61"><unientity>8854</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 62"><unientity>950C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 63"><unientity>9511</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 64"><unientity>9510</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 65"><unientity>94FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 66"><unientity>9500</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 67"><unientity>94DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 68"><unientity>9504</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 69"><unientity>9509</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 6A"><unientity>950B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 6B"><unientity>952D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 6D"><unientity>952F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 6E"><unientity>9530</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 6F"><unientity>9519</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 70"><unientity>94B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 71"><unientity>94A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 72"><unientity>9521</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 73"><unientity>94EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 74"><unientity>5F55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 75"><unientity>9525</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 76"><unientity>9526</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 77"><unientity>9540</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 78"><unientity>9541</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 79"><unientity>952E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 7A"><unientity>9532</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 7C"><unientity>9505</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 7D"><unientity>951A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5D 7E"><unientity>953E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 21"><unientity>949F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 22"><unientity>9524</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 23"><unientity>9539</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 24"><unientity>953B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 25"><unientity>9551</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 27"><unientity>9547</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 28"><unientity>9501</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 29"><unientity>94A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 2A"><unientity>954D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 2B"><unientity>955C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 2C"><unientity>955D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 2E"><unientity>955E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 2F"><unientity>94F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 30"><unientity>94FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 31"><unientity>94FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 32"><unientity>9556</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 33"><unientity>9557</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 34"><unientity>9542</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 35"><unientity>9558</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 36"><unientity>9559</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 37"><unientity>9535</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 39"><unientity>94D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3A"><unientity>9570</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3B"><unientity>9508</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3C"><unientity>956D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3D"><unientity>94C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3E"><unientity>94DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 3F"><unientity>94CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 40"><unientity>956F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 43"><unientity>94F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 44"><unientity>9573</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 45"><unientity>94C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 46"><unientity>9576</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 47"><unientity>94A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 48"><unientity>92AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 49"><unientity>9523</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4A"><unientity>94BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4B"><unientity>51FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4C"><unientity>957F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4D"><unientity>95E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4E"><unientity>95E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 4F"><unientity>95EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 50"><unientity>95ED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 51"><unientity>95F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 52"><unientity>95F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 53"><unientity>5F00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 54"><unientity>95F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 55"><unientity>95F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 57"><unientity>95F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 58"><unientity>9602</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 59"><unientity>95FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5A"><unientity>95FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5B"><unientity>9601</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5C"><unientity>9600</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5D"><unientity>5408</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5E"><unientity>9605</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 5F"><unientity>95FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 60"><unientity>960E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 61"><unientity>9614</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 62"><unientity>9615</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 63"><unientity>9611</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 64"><unientity>95F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 65"><unientity>677F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 67"><unientity>95EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 68"><unientity>9617</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 69"><unientity>5173</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 6A"><unientity>9610</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5E 6B"><unientity>E914</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 5E 7B"><unientity>9635</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 23"><unientity>9648</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 24"><unientity>9646</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 2A"><unientity>9634</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 2B"><unientity>961F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 2C"><unientity>9636</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 2E"><unientity>9633</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 37"><unientity>9645</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 39"><unientity>968F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 3A"><unientity>9669</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 3B"><unientity>9690</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 3C"><unientity>9647</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 3D"><unientity>96B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 3E"><unientity>E915</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 5F 4A"><unientity>867D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 4B"><unientity>6742</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 4C"><unientity>9E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 4D"><unientity>96CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 4E"><unientity>53CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 4F"><unientity>79BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 50"><unientity>96BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 54"><unientity>4E91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 55"><unientity>7535</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 67"><unientity>96FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 6B"><unientity>9701</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 6D"><unientity>972D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 6E"><unientity>96F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 6F"><unientity>7075</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 5F 79"><unientity>9765</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 23"><unientity>5DE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 29"><unientity>9791</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 2C"><unientity>97E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 2D"><unientity>97E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 2E"><unientity>97E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 2F"><unientity>97EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 30"><unientity>827D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 36"><unientity>54CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 37"><unientity>9875</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 38"><unientity>9876</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 39"><unientity>9877</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3A"><unientity>9879</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3B"><unientity>987A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3C"><unientity>987B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3D"><unientity>9884</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3E"><unientity>987C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 3F"><unientity>987D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 40"><unientity>987F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 41"><unientity>9881</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 42"><unientity>9882</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 43"><unientity>9887</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 44"><unientity>9886</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 45"><unientity>9889</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 46"><unientity>5934</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 47"><unientity>988A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 48"><unientity>9888</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 49"><unientity>9891</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4A"><unientity>9893</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4B"><unientity>9894</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4C"><unientity>9890</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4D"><unientity>9897</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4E"><unientity>989C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 4F"><unientity>989D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 50"><unientity>9898</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 51"><unientity>989A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 52"><unientity>989B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 53"><unientity>7C7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 54"><unientity>98A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 55"><unientity>613F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 56"><unientity>987E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 57"><unientity>98A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 58"><unientity>663E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 59"><unientity>9885</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 5A"><unientity>98A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 5B"><unientity>98CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 5C"><unientity>98D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 5D"><unientity>E916</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 60 5E"><unientity>522E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 5F"><unientity>98D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 61"><unientity>98D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 62"><unientity>98D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 63"><unientity>98DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 65"><unientity>9965</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 67"><unientity>9968</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 68"><unientity>996C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 69"><unientity>996A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6A"><unientity>996E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6B"><unientity>996D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6C"><unientity>9972</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6D"><unientity>9974</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6E"><unientity>9971</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 6F"><unientity>9970</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 70"><unientity>997A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 71"><unientity>517B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 72"><unientity>9975</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 73"><unientity>9977</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 75"><unientity>9981</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 76"><unientity>4F59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 77"><unientity>997F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 78"><unientity>997C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 79"><unientity>9986</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 7A"><unientity>996F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 7B"><unientity>9984</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 7C"><unientity>9985</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 60 7E"><unientity>998F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 21"><unientity>998A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 23"><unientity>9992</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 24"><unientity>9976</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 26"><unientity>990D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 27"><unientity>998B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 2C"><unientity>9A6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 2D"><unientity>51AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 2E"><unientity>9A6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 2F"><unientity>9A70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 30"><unientity>9A6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 31"><unientity>9A6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 32"><unientity>9A73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 33"><unientity>9A7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 34"><unientity>9A7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 35"><unientity>9A7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 36"><unientity>9A77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 37"><unientity>9A76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 38"><unientity>9A79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 39"><unientity>9A78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3A"><unientity>9A7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3B"><unientity>9A87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3C"><unientity>9A86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3D"><unientity>9A8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3E"><unientity>9A8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 3F"><unientity>9A88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 40"><unientity>9A91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 41"><unientity>9A97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 42"><unientity>9A9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 43"><unientity>9A9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 44"><unientity>817E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 45"><unientity>9A9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 46"><unientity>9AA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 47"><unientity>9A71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 48"><unientity>84E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 49"><unientity>9AA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4A"><unientity>9A84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4B"><unientity>60CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4C"><unientity>9A7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4D"><unientity>9A8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4E"><unientity>9AA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 4F"><unientity>9A74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 50"><unientity>9AA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 51"><unientity>9A8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 53"><unientity>80AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 58"><unientity>9AC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 5A"><unientity>4F53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 5B"><unientity>810F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 5F"><unientity>E917</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 61 63"><unientity>E918</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 61 64"><unientity>E919</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 61 65"><unientity>E91A</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 61 66"><unientity>9B13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 67"><unientity>6597</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 68"><unientity>95F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 6A"><unientity>90C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 73"><unientity>9B47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 74"><unientity>9C7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 75"><unientity>9C7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 76"><unientity>9C81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 77"><unientity>9C8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 78"><unientity>9C9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 79"><unientity>9C9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 7A"><unientity>9C94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 7B"><unientity>9CA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 7C"><unientity>9CA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 7D"><unientity>9CB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 61 7E"><unientity>9CB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 21"><unientity>9CC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 22"><unientity>9CC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 23"><unientity>9CAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 24"><unientity>9CCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 25"><unientity>9CCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 26"><unientity>9CA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 27"><unientity>9CD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 28"><unientity>9CD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 29"><unientity>9CDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 2A"><unientity>9CDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 2B"><unientity>9CDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 2C"><unientity>9CD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 2E"><unientity>9C88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 2F"><unientity>9E1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 30"><unientity>9E20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 31"><unientity>9E22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 32"><unientity>9E23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 33"><unientity>51E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 34"><unientity>9E29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 35"><unientity>9E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 36"><unientity>9E35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 37"><unientity>9E2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 38"><unientity>9E2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 39"><unientity>9E2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 3A"><unientity>9E33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 3C"><unientity>9E3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 3D"><unientity>9E3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 3E"><unientity>9E49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 3F"><unientity>9E43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 40"><unientity>9E44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 41"><unientity>9E45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 42"><unientity>9E51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 43"><unientity>9E4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 44"><unientity>9E4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 45"><unientity>9E4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 46"><unientity>9E64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 47"><unientity>83BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 48"><unientity>9E5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 49"><unientity>9E67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4A"><unientity>9E25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4B"><unientity>9E36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4C"><unientity>9E70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4D"><unientity>9E6D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4E"><unientity>9E66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 4F"><unientity>9E3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 50"><unientity>54B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 51"><unientity>76D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 52"><unientity>7877</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 56"><unientity>4E3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 5B"><unientity>9EA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 5C"><unientity>9EB8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 5E"><unientity>9762</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 60"><unientity>4E48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 6A"><unientity>70B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 6F"><unientity>515A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 72"><unientity>9EE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 76"><unientity>51AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 7D"><unientity>9F50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 62 7E"><unientity>658E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 21"><unientity>9F7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 22"><unientity>9F83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 24"><unientity>9F84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 25"><unientity>9F88</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 26"><unientity>9F87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 27"><unientity>9F89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 28"><unientity>9F8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 29"><unientity>9F8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 2A"><unientity>9F8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 2B"><unientity>9F99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 2C"><unientity>9F9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 63 2D"><unientity>9F9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 66 49"><unientity>4F1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 67 75"><unientity>4F65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 67 7C"><unientity>4F1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 68 22"><unientity>507B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 68 42"><unientity>507E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 68 71"><unientity>4FAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 69 44"><unientity>50A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 69 48"><unientity>50A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6B 3E"><unientity>522D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6B 5B"><unientity>5250</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6B 5F"><unientity>672D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6B 79"><unientity>523F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6B 7A"><unientity>523D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6D 2E"><unientity>5326</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6D 6D"><unientity>538D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6E 2A"><unientity>53A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 6F 69"><unientity>5459</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 70 30"><unientity>5457</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 71 69"><unientity>5522</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 34"><unientity>551B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 39"><unientity>54D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 55"><unientity>54D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 58"><unientity>E91B</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="27 72 67"><unientity>5452</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 72"><unientity>54D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 7A"><unientity>54D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 72 7E"><unientity>54D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 73 28"><unientity>54DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 73 45"><unientity>556E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 73 4C"><unientity>5456</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 73 5A"><unientity>55BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 73 60"><unientity>5181</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 74 2E"><unientity>56F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 76 38"><unientity>57AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 76 7A"><unientity>57DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 77 42"><unientity>57D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 77 45"><unientity>57D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 77 48"><unientity>57B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 78 5A"><unientity>5785</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 78 5E"><unientity>5786</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 79 54"><unientity>5956</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7B 3C"><unientity>5A05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7C 24"><unientity>5A32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7C 36"><unientity>59AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7D 2B"><unientity>5A06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7D 40"><unientity>5AF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7D 48"><unientity>5AD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="27 7D 74"><unientity>5A08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 23 2B"><unientity>5C66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 24 41"><unientity>5C98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 24 58"><unientity>5D03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 25 5A"><unientity>5D5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 25 69"><unientity>5D02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 25 77"><unientity>5CE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 26 26"><unientity>5CC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 26 32"><unientity>5D58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 26 47"><unientity>5CBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 26 59"><unientity>5DEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 27 36"><unientity>5E0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 27 47"><unientity>5E3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 27 5F"><unientity>5E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 28 68"><unientity>5E91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 29 51"><unientity>5F2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2D 34"><unientity>607D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2D 5E"><unientity>607A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2D 74"><unientity>6004</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2D 77"><unientity>60AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2D 79"><unientity>60AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2E 4C"><unientity>6126</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2E 52"><unientity>6003</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2E 5C"><unientity>603F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2E 79"><unientity>6079</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2E 7E"><unientity>603C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2F 43"><unientity>6206</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2F 47"><unientity>620B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 2F 66"><unientity>6217</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 33 6F"><unientity>629F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 33 7B"><unientity>62A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 34 2C"><unientity>63BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 34 2E"><unientity>63BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 34 57"><unientity>63B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 34 62"><unientity>6322</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 34 66"><unientity>63FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 2A"><unientity>6448</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 42"><unientity>64B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 46"><unientity>6445</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 5B"><unientity>6484</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 61"><unientity>64BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 35 6D"><unientity>6512</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 36 71"><unientity>6593</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 39 55"><unientity>6619</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 39 5C"><unientity>6654</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 3B 22"><unientity>4E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 3B 7D"><unientity>E91C</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="28 3D 30"><unientity>67A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 3D 6E"><unientity>67A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 3F 30"><unientity>6966</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 3F 5C"><unientity>6769</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 40 27"><unientity>6864</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 40 56"><unientity>6920</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 40 5E"><unientity>67FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 41 40"><unientity>6861</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 42 2B"><unientity>6A2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 42 57"><unientity>68BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 33"><unientity>680E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 35"><unientity>6A7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 37"><unientity>6987</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 39"><unientity>680A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 3A"><unientity>69E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 40"><unientity>67A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 45"><unientity>680C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 50"><unientity>68C2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 59"><unientity>6989</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 43 66"><unientity>6924</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 45 39"><unientity>6B9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 46 42"><unientity>6BF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 46 4C"><unientity>6BE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 46 51"><unientity>6C07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 46 68"><unientity>6C29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 49 34"><unientity>6D43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 49 71"><unientity>6D9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4B 28"><unientity>6D48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4B 43"><unientity>8365</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4C 2E"><unientity>6D52</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4C 41"><unientity>6CA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4C 62"><unientity>988D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4D 27"><unientity>6D9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4D 2B"><unientity>6D54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4D 49"><unientity>6DA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4D 58"><unientity>6CA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4D 59"><unientity>6ED7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 30"><unientity>6E11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 3E"><unientity>6CF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 41"><unientity>6F4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 42"><unientity>6D4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 62"><unientity>6F4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4E 66"><unientity>6EE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 26"><unientity>6CF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 39"><unientity>6CF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 5D"><unientity>6CA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 61"><unientity>6EE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 6B"><unientity>6F13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 4F 7D"><unientity>704F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 50 29"><unientity>6EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 51 50"><unientity>70C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 52 52"><unientity>709C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 53 23"><unientity>8367</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 53 3C"><unientity>709D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 54 24"><unientity>70E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 54 4F"><unientity>70EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 57 5E"><unientity>72B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 57 5F"><unientity>72F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 58 2B"><unientity>7303</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 58 36"><unientity>7315</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5A 47"><unientity>73AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5B 21"><unientity>740F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5C 3A"><unientity>748E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5C 40"><unientity>74D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5D 6B"><unientity>7572</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5E 7A"><unientity>75D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5F 48"><unientity>7617</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5F 5E"><unientity>7618</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 5F 6F"><unientity>7605</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 60 2B"><unientity>762A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 60 32"><unientity>75AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 60 37"><unientity>763F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 60 3A"><unientity>75C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 62 22"><unientity>7726</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 62 72"><unientity>770D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 63 2C"><unientity>7751</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 64 5A"><unientity>7817</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 64 60"><unientity>7856</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 65 40"><unientity>7800</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 65 6A"><unientity>789B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 65 77"><unientity>789C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 66 22"><unientity>7857</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 66 55"><unientity>783B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6A 3C"><unientity>7AAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6B 7C"><unientity>7B15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6C 58"><unientity>7BA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6D 47"><unientity>7BA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6D 54"><unientity>7B5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6E 56"><unientity>7BA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6E 68"><unientity>7B3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 6E 69"><unientity>7C16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 22"><unientity>7CC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 2E"><unientity>E91D</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="28 70 30"><unientity>7C9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 35"><unientity>7C74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 42"><unientity>7EA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 45"><unientity>7EA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 4A"><unientity>7EBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 61"><unientity>7EC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 62"><unientity>7EC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 65"><unientity>7EC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 70 6A"><unientity>7ED0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 30"><unientity>7EDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 34"><unientity>7ED7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 39"><unientity>7EE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 44"><unientity>7EE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 4D"><unientity>7EE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 61"><unientity>7EFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 67"><unientity>7EEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 74"><unientity>7EF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 78"><unientity>7EF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 71 7D"><unientity>7EFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 29"><unientity>7F17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 2A"><unientity>7F02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 31"><unientity>7F03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 36"><unientity>7F07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 3C"><unientity>7F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 3E"><unientity>7F0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 47"><unientity>7F11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 48"><unientity>7F0F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 51"><unientity>7F1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 53"><unientity>7F12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 5D"><unientity>7F1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 5E"><unientity>7F19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 5F"><unientity>7F1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 69"><unientity>7EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 71"><unientity>E91E</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="28 72 72"><unientity>7F21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 75"><unientity>7D77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 72 79"><unientity>7F25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 21"><unientity>7F26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 2D"><unientity>7F2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 49"><unientity>7F30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 4E"><unientity>7F32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 51"><unientity>7F33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 52"><unientity>7F34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 59"><unientity>7F31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 5D"><unientity>7EA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 60"><unientity>7F2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 6D"><unientity>624D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 73 74"><unientity>7F35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 74 2E"><unientity>7F42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 74 31"><unientity>E91F</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="28 74 72"><unientity>7F74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 75 31"><unientity>7F9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 76 55"><unientity>8027</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 77 39"><unientity>8069</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 77 3F"><unientity>804D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 78 55"><unientity>80EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 78 6E"><unientity>80E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 79 41"><unientity>8136</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 7A 56"><unientity>8114</unientity><desc>East Asian ideograph</desc></character>
-<character hex="28 7E 61"><unientity>82CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 23 3C"><unientity>836D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 23 3D"><unientity>836E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 23 75"><unientity>83B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 24 33"><unientity>E920</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="29 24 3A"><unientity>83BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 24 7D"><unientity>835C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 24"><unientity>848C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 2D"><unientity>8311</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 35"><unientity>82C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 46"><unientity>8368</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 4B"><unientity>835B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 5A"><unientity>8487</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 64"><unientity>8489</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 67"><unientity>836C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 71"><unientity>835E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 74"><unientity>83B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 25 77"><unientity>8297</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 33"><unientity>84E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 51"><unientity>84DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 57"><unientity>835F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 58"><unientity>83B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 61"><unientity>8360</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 26 68"><unientity>8369</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 27 52"><unientity>830F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 27 65"><unientity>82C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 27 68"><unientity>8572</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 28 2A"><unientity>8539</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 28 40"><unientity>84E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2A 2F"><unientity>86F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2A 34"><unientity>86AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2B 55"><unientity>86F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2B 6E"><unientity>86F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2C 4C"><unientity>866E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2C 55"><unientity>86CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2C 5D"><unientity>867F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2C 61"><unientity>86F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2C 64"><unientity>877E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2D 51"><unientity>8511</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2F 60"><unientity>88E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 2F 72"><unientity>88E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 30 2D"><unientity>88E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 30 32"><unientity>7962</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 30 66"><unientity>89C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 30 6F"><unientity>89CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 30 7D"><unientity>89CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 31 2B"><unientity>89D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 31 32"><unientity>89CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 31 60"><unientity>89EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 2A"><unientity>8BB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 3B"><unientity>8BCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 3C"><unientity>8BD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 4F"><unientity>8BD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 50"><unientity>8BD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 56"><unientity>8BE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 5D"><unientity>8BD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 5E"><unientity>8BDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 71"><unientity>8BEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 32 7E"><unientity>8C07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 25"><unientity>8BF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 2C"><unientity>8BFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 36"><unientity>8BE4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 38"><unientity>8BFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 3B"><unientity>8C00</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 40"><unientity>8C02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 44"><unientity>8C19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 45"><unientity>8BE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 4E"><unientity>8C0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 57"><unientity>8C14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 59"><unientity>8C11</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 5D"><unientity>8C16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 62"><unientity>8C1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 73"><unientity>8C21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 7A"><unientity>8BCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 33 7D"><unientity>8C27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 34 30"><unientity>8BB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 34 38"><unientity>8C29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 34 4D"><unientity>8C2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 34 59"><unientity>8C2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 34 68"><unientity>8C35</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 35 2D"><unientity>8C30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 35 37"><unientity>8C20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 35 39"><unientity>8C33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 4E"><unientity>8D33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 51"><unientity>8D36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 5F"><unientity>8D47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 6A"><unientity>8D53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 6B"><unientity>8D55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 70"><unientity>8D49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 36 7E"><unientity>8D59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 37 25"><unientity>8D3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 37 26"><unientity>8D5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 37 3A"><unientity>8D46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 38 66"><unientity>8DB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 2E"><unientity>8DC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 40"><unientity>8DF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 46"><unientity>8E70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 57"><unientity>8DFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 5E"><unientity>8DF9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 5F"><unientity>8DDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 60"><unientity>8E2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 6B"><unientity>8E7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3A 70"><unientity>8E9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 3E"><unientity>8F71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 3F"><unientity>8F7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 42"><unientity>8F75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 47"><unientity>8F77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 4F"><unientity>8F78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 59"><unientity>8F82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 5B"><unientity>8F81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 6B"><unientity>8F8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 6D"><unientity>8F8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3B 7A"><unientity>8F8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3C 30"><unientity>8F98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3C 57"><unientity>8F79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3C 5A"><unientity>8F73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3D 4E"><unientity>8FF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3F 23"><unientity>90CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3F 4C"><unientity>90D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3F 5A"><unientity>90E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 3F 5C"><unientity>90AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 40 21"><unientity>90F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 40 2B"><unientity>90BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 40 2C"><unientity>90D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 40 31"><unientity>909D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 40 40"><unientity>90E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 5C"><unientity>917E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 5D"><unientity>917D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 61"><unientity>9487</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 62"><unientity>9486</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 63"><unientity>948C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 64"><unientity>948B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 6A"><unientity>948D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 6B"><unientity>948E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 41 79"><unientity>9492</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 21"><unientity>9495</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 22"><unientity>9490</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 23"><unientity>94AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 24"><unientity>94AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 25"><unientity>94AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 28"><unientity>94AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 31"><unientity>94AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 37"><unientity>949B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 4B"><unientity>94A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 51"><unientity>94C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 52"><unientity>94C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 54"><unientity>94CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 55"><unientity>94CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 58"><unientity>94B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 5C"><unientity>94CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 5F"><unientity>94B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 60"><unientity>94B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 61"><unientity>94B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 64"><unientity>94BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 6D"><unientity>94CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 6F"><unientity>94BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 42 74"><unientity>94BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 2B"><unientity>94C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 2F"><unientity>94F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 31"><unientity>94F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 35"><unientity>94F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 40"><unientity>94D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 43"><unientity>94D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 46"><unientity>94D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 49"><unientity>94D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 4F"><unientity>94DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 50"><unientity>94DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 55"><unientity>94EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 58"><unientity>94EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 59"><unientity>94E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 5B"><unientity>94E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 62"><unientity>94EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 64"><unientity>94F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 6A"><unientity>9512</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 6C"><unientity>950D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 71"><unientity>94FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 72"><unientity>9513</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 75"><unientity>9514</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 43 7D"><unientity>94D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 27"><unientity>94D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 2B"><unientity>9503</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 2D"><unientity>94A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 2E"><unientity>9502</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 35"><unientity>950A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 3E"><unientity>94E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 40"><unientity>9506</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 41"><unientity>9507</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 4D"><unientity>952B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 57"><unientity>9529</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 58"><unientity>952C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 5B"><unientity>9516</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 66"><unientity>9515</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 69"><unientity>94FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 6D"><unientity>951B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 71"><unientity>951D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 72"><unientity>951E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 74"><unientity>951F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 75"><unientity>9494</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 44 78"><unientity>9522</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 31"><unientity>9528</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 32"><unientity>9531</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 4D"><unientity>9534</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 4E"><unientity>9545</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 51"><unientity>9517</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 5E"><unientity>94E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 64"><unientity>9536</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 67"><unientity>9537</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 68"><unientity>9518</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 6F"><unientity>9538</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 45 7A"><unientity>9550</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 21"><unientity>9553</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 28"><unientity>9552</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 29"><unientity>84E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 2D"><unientity>9549</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 42"><unientity>94E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 47"><unientity>954F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 4A"><unientity>953C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 56"><unientity>955B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 5A"><unientity>955F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 62"><unientity>956A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 66"><unientity>933E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 46 7C"><unientity>9546</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 2F"><unientity>94E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 32"><unientity>94F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 34"><unientity>9566</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 3C"><unientity>9568</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 3E"><unientity>94F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 4D"><unientity>956B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 50"><unientity>950E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 51"><unientity>950F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 58"><unientity>9561</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 5E"><unientity>9562</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 60"><unientity>9563</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 67"><unientity>94E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 69"><unientity>9564</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 47 74"><unientity>9571</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 3E"><unientity>9554</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 3F"><unientity>9572</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 4A"><unientity>956C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 5C"><unientity>9565</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 69"><unientity>9567</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 6F"><unientity>9569</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 48 71"><unientity>954A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 36"><unientity>95F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 42"><unientity>9606</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 44"><unientity>9603</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 48"><unientity>960F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 49"><unientity>9608</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 4D"><unientity>9609</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 4F"><unientity>960A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 50"><unientity>960C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 52"><unientity>960D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 5A"><unientity>9612</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 60"><unientity>9619</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 69"><unientity>961A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 49 6F"><unientity>95FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4A 44"><unientity>9655</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4A 46"><unientity>9649</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4C 76"><unientity>9753</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4E 43"><unientity>97AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4E 54"><unientity>97EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4E 5C"><unientity>97EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4E 79"><unientity>9878</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4E 7B"><unientity>9883</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4F 23"><unientity>9880</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4F 2C"><unientity>988F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4F 6B"><unientity>98A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 4F 77"><unientity>989F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 21"><unientity>98A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 29"><unientity>98A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 30"><unientity>989E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 31"><unientity>98A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 53"><unientity>98D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 50 6C"><unientity>996B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 32"><unientity>997D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 53"><unientity>9967</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 66"><unientity>9969</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 6A"><unientity>9990</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 6D"><unientity>9991</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 70"><unientity>998D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 72"><unientity>9994</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 51 75"><unientity>9993</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 52 22"><unientity>98E8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 52 63"><unientity>9A75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 52 69"><unientity>9A80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 3D"><unientity>9A90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 40"><unientity>9A92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 47"><unientity>9A93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 5A"><unientity>9A9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 60"><unientity>9A98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 69"><unientity>9A7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 6A"><unientity>9A9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 70"><unientity>9A9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 79"><unientity>9A96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 53 7A"><unientity>9AA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 54 21"><unientity>9AA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 54 22"><unientity>9A81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 54 27"><unientity>9A85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 54 33"><unientity>9AA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 54 6D"><unientity>9ACB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 55 6C"><unientity>960B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 55 74"><unientity>9604</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 56 3C"><unientity>9B49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 56 5D"><unientity>9C82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 21"><unientity>9C86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 29"><unientity>9C87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 2B"><unientity>9C90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 31"><unientity>9C8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 39"><unientity>9C9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 3C"><unientity>9C91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 3D"><unientity>9C92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 42"><unientity>9C95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 56"><unientity>9CA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 5F"><unientity>9CA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 6E"><unientity>9CA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 7A"><unientity>9CAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 57 7C"><unientity>9CB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 22"><unientity>9CAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 25"><unientity>9CBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 27"><unientity>9CB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 28"><unientity>9CB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 2C"><unientity>9CB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 2D"><unientity>9CB7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 2F"><unientity>9CB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 31"><unientity>9CB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 34"><unientity>9CBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 3E"><unientity>9CCA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 4B"><unientity>9CBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 54"><unientity>9CC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 59"><unientity>9CC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 5C"><unientity>9CC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 6A"><unientity>9CCB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 6E"><unientity>9CA5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 58 71"><unientity>9CCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 21"><unientity>9CD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 25"><unientity>9CCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 28"><unientity>9CD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 29"><unientity>9CA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 2A"><unientity>9CD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 32"><unientity>9CD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 38"><unientity>9CDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 3A"><unientity>9C85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 3B"><unientity>9C9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 40"><unientity>9CBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 4F"><unientity>9CE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 55"><unientity>9C8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 58"><unientity>9C9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 59 6B"><unientity>9CA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 28"><unientity>9E28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 44"><unientity>9E32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 48"><unientity>9E31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 59"><unientity>9E38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 65"><unientity>9E39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 68"><unientity>9E3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 70"><unientity>9E48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5A 75"><unientity>9E41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 2A"><unientity>9E46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 35"><unientity>9E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 52"><unientity>9E4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 59"><unientity>9E5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 5C"><unientity>9E5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 60"><unientity>9E55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 6B"><unientity>9E57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 6C"><unientity>9E4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 77"><unientity>9E63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5B 79"><unientity>9E5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 28"><unientity>9E58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 3E"><unientity>9E37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 47"><unientity>9E68</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 49"><unientity>9E47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 57"><unientity>9E6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 5B"><unientity>9E6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 65"><unientity>9E69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5C 6C"><unientity>9E6A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 29"><unientity>9E71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 36"><unientity>9E2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 3A"><unientity>9E73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 3B"><unientity>9E42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 3C"><unientity>5364</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5D 42"><unientity>9E7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5E 6A"><unientity>9EEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5E 7A"><unientity>9EFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5E 7C"><unientity>9F0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5F 2B"><unientity>9F0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5F 7B"><unientity>9F51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 5F 7C"><unientity>9F80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 60 28"><unientity>9F86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 60 2B"><unientity>9F85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="29 60 62"><unientity>9F9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 21"><unientity>5F0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 2D"><unientity>4E17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 32"><unientity>7ADD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 45"><unientity>4E57</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 51"><unientity>5F0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 53"><unientity>4E3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 58"><unientity>4E9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 5B"><unientity>4EBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 61"><unientity>4EB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 30 6C"><unientity>8B8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 32"><unientity>4ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 3A"><unientity>62BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 40"><unientity>4F32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 47"><unientity>5002</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 4C"><unientity>5008</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 5F"><unientity>4FA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 64"><unientity>7AE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 31 65"><unientity>EA04</unientity><desc>East Asian ideography not found in unified han</desc></character>
-<character hex="2D 31 77"><unientity>5E78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 24"><unientity>7B87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 51"><unientity>510C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 53"><unientity>50E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 5F"><unientity>E976</unientity><unientityalt>50BB</unientityalt><desc>Variant of 4B325F which maps to 50BB</desc></character>
-<character hex="2D 32 61"><unientity>5039</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 63"><unientity>4FAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 72"><unientity>706E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 32 79"><unientity>514E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 24"><unientity>634C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 2A"><unientity>4E0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 32"><unientity>5190</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 4F"><unientity>5202</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 56"><unientity>E9F4</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="2D 33 5F"><unientity>52B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 66"><unientity>5234</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 6B"><unientity>5C05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 72"><unientity>5265</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 33 77"><unientity>8CF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 21"><unientity>5294</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 28"><unientity>5226</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 2E"><unientity>8274</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 36"><unientity>52F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 3C"><unientity>52A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 3D"><unientity>52E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 53"><unientity>758B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 57"><unientity>62FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 58"><unientity>4EDF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 5B"><unientity>6607</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 5D"><unientity>5349</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 64"><unientity>613D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 6A"><unientity>5918</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 6E"><unientity>5373</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 34 73"><unientity>5374</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 39"><unientity>52FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 3C"><unientity>6B62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 43"><unientity>4EDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 47"><unientity>55AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 56"><unientity>7343</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 5C"><unientity>5434</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 6A"><unientity>8A36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 35 71"><unientity>546A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 22"><unientity>8AEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 2A"><unientity>95A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 32"><unientity>8A7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 42"><unientity>6B38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 44"><unientity>5557</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 36 61"><unientity>6199</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 30"><unientity>751E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 48"><unientity>8B5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 49"><unientity>5650</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 58"><unientity>54BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 65"><unientity>8086</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 68"><unientity>56EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 6F"><unientity>5700</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 37 7C"><unientity>962C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 21"><unientity>962F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 30"><unientity>573B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 3F"><unientity>575A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 4A"><unientity>5872</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 52"><unientity>51A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 54"><unientity>5896</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 6E"><unientity>58CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 76"><unientity>58F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 38 77"><unientity>5900</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 21"><unientity>591F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 29"><unientity>6B80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 2F"><unientity>7287</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 31"><unientity>67F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 32"><unientity>7AD2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 44"><unientity>511E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 4D"><unientity>59AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 54"><unientity>7385</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 56"><unientity>59D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 6E"><unientity>4F84</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 70"><unientity>5A63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 74"><unientity>5B43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 39 7B"><unientity>5A31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3A 26"><unientity>5A3F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3A 2F"><unientity>58FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3A 41"><unientity>5AFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3A 47"><unientity>5ACB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3A 60"><unientity>6588</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 27"><unientity>51A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 2A"><unientity>5EBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 33"><unientity>8A67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 3F"><unientity>5C02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 40"><unientity>E977</unientity><unientityalt>5C06</unientityalt><desc>Variant of 273B40 which maps to 5C06</desc></character>
-<character hex="2D 3B 52"><unientity>6EBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 54"><unientity>5C4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 6E"><unientity>5D17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 77"><unientity>5CE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 78"><unientity>5CEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 79"><unientity>5D8B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3B 7B"><unientity>5D08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 21"><unientity>57FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 22"><unientity>5D10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 26"><unientity>5D18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 36"><unientity>5DE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 38"><unientity>9245</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 49"><unientity>83F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 5F"><unientity>6A66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 61"><unientity>5E47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 65"><unientity>79CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 6A"><unientity>51FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 6D"><unientity>E921</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="2D 3C 6E"><unientity>7240</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 70"><unientity>576B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 7C"><unientity>83F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 7D"><unientity>53A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3C 7E"><unientity>53A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 29"><unientity>53AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 2B"><unientity>5EBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 2D"><unientity>5396</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 2F"><unientity>539B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 34"><unientity>5EFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 48"><unientity>5F4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 4E"><unientity>7BF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 50"><unientity>5F5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 5E"><unientity>9AF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 67"><unientity>9015</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 6C"><unientity>5F93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 75"><unientity>60EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3D 76"><unientity>5FB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3E 2B"><unientity>6060</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3E 3C"><unientity>803B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3E 40"><unientity>6052</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3E 60"><unientity>6075</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 24"><unientity>661A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 27"><unientity>6120</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 2A"><unientity>5ABF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 31"><unientity>6159</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 3A"><unientity>6185</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 54"><unientity>61D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 67"><unientity>621E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 6E"><unientity>6226</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 6F"><unientity>622F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 3F 76"><unientity>78A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 29"><unientity>5214</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 31"><unientity>64A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 39"><unientity>67C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 3F"><unientity>6255</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 49"><unientity>67B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 4C"><unientity>6283</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 4F"><unientity>6294</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 66"><unientity>63CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 40 67"><unientity>62CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 22"><unientity>6485</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 32"><unientity>642F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 41"><unientity>63B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 47"><unientity>6271</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 50"><unientity>6428</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 52"><unientity>6447</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 53"><unientity>64E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 54"><unientity>635C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 6E"><unientity>6534</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 71"><unientity>62CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 41 76"><unientity>6483</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 42 28"><unientity>5117</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 42 49"><unientity>53D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 42 4F"><unientity>555F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 42 72"><unientity>65E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 42 77"><unientity>65EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 27"><unientity>6630</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 29"><unientity>668E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 2E"><unientity>66EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 3B"><unientity>6662</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 3E"><unientity>667B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 43"><unientity>6636</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 48"><unientity>6681</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 49"><unientity>66A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 5F"><unientity>6716</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 62"><unientity>6722</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 64"><unientity>671E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 43 70"><unientity>6736</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 25"><unientity>686E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 2D"><unientity>6780</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 37"><unientity>67FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 3A"><unientity>6942</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 40"><unientity>6822</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 44"><unientity>69C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 4B"><unientity>6852</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 50"><unientity>8308</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 61"><unientity>6746</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 66"><unientity>6973</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 6B"><unientity>6936</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 72"><unientity>68CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 44 74"><unientity>E978</unientity><unientityalt>690D</unientityalt><desc>Variant of 214474 which maps to 690D</desc></character>
-<character hex="2D 44 7D"><unientity>684C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 39"><unientity>6406</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 3A"><unientity>6760</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 43"><unientity>6901</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 4E"><unientity>697D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 50"><unientity>58AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 62"><unientity>681D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 64"><unientity>68B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 69"><unientity>6AC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 45 74"><unientity>5FFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 21"><unientity>61FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 2C"><unientity>6B7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 47"><unientity>6BD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 6D"><unientity>51B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 74"><unientity>51B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 46 7C"><unientity>6CB2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 29"><unientity>6D29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 30"><unientity>51B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 35"><unientity>6C4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 38"><unientity>6FFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 46"><unientity>6C79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 56"><unientity>6F94</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 5B"><unientity>51C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 5F"><unientity>51C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 47 68"><unientity>E979</unientity><unientityalt>6D45</unientityalt><desc>Variant of 274768 which maps to 6D45</desc></character>
-<character hex="2D 48 29"><unientity>51CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 2F"><unientity>6E07</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 44"><unientity>6FD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 45"><unientity>6E29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 50"><unientity>6EDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 53"><unientity>7001</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 5C"><unientity>6F44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 6B"><unientity>6F82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 48 6E"><unientity>E9F5</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="2D 48 74"><unientity>6F5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 3A"><unientity>702C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 47"><unientity>7AC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 54"><unientity>70F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 56"><unientity>70B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 6B"><unientity>70DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 49 71"><unientity>70A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 26"><unientity>713C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 28"><unientity>8B8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 34"><unientity>718F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 3B"><unientity>4E89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 45"><unientity>5C12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 46"><unientity>58BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 58"><unientity>7F9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 5B"><unientity>7282</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4A 60"><unientity>6C02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 22"><unientity>736A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 35"><unientity>73C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 3F"><unientity>73CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 43"><unientity>746F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 45"><unientity>6BEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 5B"><unientity>78AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 71"><unientity>7F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4B 72"><unientity>7506</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 2C"><unientity>583A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 2D"><unientity>756E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 35"><unientity>7567</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 3C"><unientity>53E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 3E"><unientity>758E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 5D"><unientity>7661</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4C 7E"><unientity>4F70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 21"><unientity>7681</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 34"><unientity>76C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 38"><unientity>76D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 4F"><unientity>771F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 5F"><unientity>7741</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 65"><unientity>53E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 6D"><unientity>7792</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4D 71"><unientity>7719</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4E 24"><unientity>6998</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4E 33"><unientity>78AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4E 5B"><unientity>945B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4E 79"><unientity>5FA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 29"><unientity>9F9D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 37"><unientity>7980</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 3E"><unientity>7A3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 41"><unientity>4E69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 45"><unientity>9834</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 48"><unientity>7A42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 5E"><unientity>7AB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 6B"><unientity>7AF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 4F 7C"><unientity>7B5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 50 2B"><unientity>693E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 50 2D"><unientity>7B5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 50 36"><unientity>84D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 50 4F"><unientity>7C58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 50 6F"><unientity>7CFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 24"><unientity>5E0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 29"><unientity>7D25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 4A"><unientity>6DD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 4D"><unientity>7D2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 6A"><unientity>7DB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 79"><unientity>7E62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 51 7D"><unientity>7D99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 28"><unientity>9262</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 2B"><unientity>9475</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 32"><unientity>8FA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 33"><unientity>7F78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 38"><unientity>898A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 40"><unientity>7FA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 41"><unientity>7FA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 4A"><unientity>7FC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 59"><unientity>98DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 5D"><unientity>6537</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 65"><unientity>79D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 67"><unientity>79CF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 6B"><unientity>7085</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 6C"><unientity>8EAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 52 7B"><unientity>8074</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 21"><unientity>7C9B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 23"><unientity>5B8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 2C"><unientity>6BD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 40"><unientity>812C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 44"><unientity>8107</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 4B"><unientity>80F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 5E"><unientity>8193</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 61"><unientity>811A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 53 7E"><unientity>81C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 21"><unientity>9AD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 24"><unientity>5367</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 34"><unientity>64E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 40"><unientity>6841</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 46"><unientity>8229</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 47"><unientity>824A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 61"><unientity>8306</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 68"><unientity>6959</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 6F"><unientity>83C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 54 76"><unientity>8318</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 29"><unientity>E97A</unientity><unientityalt>830E</unientityalt><desc>Variant of 275529 which maps to 830E</desc></character>
-<character hex="2D 55 2D"><unientity>8358</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 2E"><unientity>E97B</unientity><unientityalt>8393</unientityalt><desc>Variant of 21552E which maps to 8393</desc></character>
-<character hex="2D 55 47"><unientity>837D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 50"><unientity>585F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 54"><unientity>855A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 5A"><unientity>8386</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 5B"><unientity>8385</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 61"><unientity>76D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 55 73"><unientity>83D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 2E"><unientity>8024</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 35"><unientity>846F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 3C"><unientity>8613</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 3F"><unientity>6A97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 64"><unientity>9F04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 75"><unientity>9F05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 56 7B"><unientity>8717</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 2B"><unientity>8797</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 2D"><unientity>8748</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 30"><unientity>87C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 3B"><unientity>60F7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 49"><unientity>885E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 58"><unientity>890E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 5B"><unientity>886E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 60"><unientity>5E2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 63"><unientity>88E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 57 73"><unientity>7D5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 58 31"><unientity>89A7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 58 33"><unientity>752A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 58 36"><unientity>89E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 58 4D"><unientity>548F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 58 56"><unientity>612C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 27"><unientity>8ACC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 2C"><unientity>8B01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 3D"><unientity>8AE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 41"><unientity>5629</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 4C"><unientity>8B72</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 4F"><unientity>8B83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 57"><unientity>7AEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 59"><unientity>8277</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 5F"><unientity>732A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 60"><unientity>72B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 63"><unientity>8C98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 59 65"><unientity>72F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 34"><unientity>8CAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 3D"><unientity>8CDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 48"><unientity>8D71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 4E"><unientity>8D82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 5F"><unientity>8E5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 63"><unientity>8DE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5A 7E"><unientity>8E7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 2F"><unientity>8EB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 42"><unientity>8F19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 43"><unientity>8EFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 5D"><unientity>8FA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 5E"><unientity>8FA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 69"><unientity>5EF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5B 7A"><unientity>8FEF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 2F"><unientity>8FE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 3F"><unientity>5FA7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 40"><unientity>5FA8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 48"><unientity>9013</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 5A"><unientity>8FE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 5B"><unientity>9089</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5C 74"><unientity>96A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5D 23"><unientity>9167</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5D 2F"><unientity>9196</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5D 56"><unientity>920E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5D 65"><unientity>8216</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5D 68"><unientity>8021</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 21"><unientity>9418</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 24"><unientity>7145</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 26"><unientity>7194</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 28"><unientity>93C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 3B"><unientity>92B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 43"><unientity>92F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 4A"><unientity>945A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 50"><unientity>9587</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5E 61"><unientity>6FF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 28"><unientity>9665</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 2C"><unientity>5826</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 2D"><unientity>964F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 2E"><unientity>661C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 35"><unientity>78D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 3B"><unientity>96A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 43"><unientity>9CEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 46"><unientity>96BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 4B"><unientity>96D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 4C"><unientity>9DC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 63"><unientity>873A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 5F 73"><unientity>E9D2</unientity><unientityalt>975A</unientityalt><desc>Unrelated variant of EACC 234C76 which maps to 975A</desc></character>
-<character hex="2D 60 21"><unientity>978C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 60 2D"><unientity>976D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 60 30"><unientity>97EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 60 56"><unientity>980B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 60 78"><unientity>9920</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 60 79"><unientity>8218</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 32"><unientity>99EE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 34"><unientity>99DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 47"><unientity>99C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 59"><unientity>9AC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 5A"><unientity>8EC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 62"><unientity>9A0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 61 6A"><unientity>6B1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 22"><unientity>9C0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 29"><unientity>9C53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 2C"><unientity>9F08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 35"><unientity>9D76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 41"><unientity>9D5E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 51"><unientity>5869</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 52"><unientity>78B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 5F"><unientity>83FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 60"><unientity>5E85</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 62"><unientity>9EC4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 75"><unientity>76B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 62 7E"><unientity>658B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 63 2B"><unientity>5C28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 63 2D"><unientity>4E80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 6B 33"><unientity>E9F6</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="2D 6B 5F"><unientity>5273</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 6F 7D"><unientity>8123</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 71 43"><unientity>55E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 71 64"><unientity>E97C</unientity><unientityalt>55D4</unientityalt><desc>Variant of 217164 which maps to 55D4</desc></character>
-<character hex="2D 73 45"><unientity>56D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 75 3A"><unientity>9654</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 75 52"><unientity>579B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 7A 44"><unientity>598D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2D 7E 6A"><unientity>51A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 25 7B"><unientity>5D1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 28 4C"><unientity>5ECF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 29 68"><unientity>5F51</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 2B 5B"><unientity>605A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 2B 74"><unientity>609B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 2D 79"><unientity>6128</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 2F 7A"><unientity>6738</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 2F 7C"><unientity>634D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 30 28"><unientity>640B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 31 3A"><unientity>6332</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 31 44"><unientity>651F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 31 72"><unientity>5261</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 33 28"><unientity>6528</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 33 7B"><unientity>630E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 36 3F"><unientity>52C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 36 45"><unientity>69E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 36 54"><unientity>657F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 37 29"><unientity>65B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 38 70"><unientity>714A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 39 36"><unientity>66CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3A 26"><unientity>661D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3A 33"><unientity>80AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3B 22"><unientity>690F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3D 62"><unientity>684A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3D 73"><unientity>7A1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3E 3F"><unientity>7BA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 3F 2D"><unientity>69B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 40 3D"><unientity>6AC1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 41 74"><unientity>6AA9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 46 70"><unientity>6CD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 47 31"><unientity>6C73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 47 39"><unientity>E97D</unientity><unientityalt>6C67</unientityalt><desc>Variant of 224739 which maps to 6C67</desc></character>
-<character hex="2E 47 47"><unientity>6D64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 48 73"><unientity>6FA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 49 2F"><unientity>6CD9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 49 3B"><unientity>6E7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4A 6B"><unientity>6EA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4C 35"><unientity>6DE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4C 7B"><unientity>6E86</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4D 3D"><unientity>6D38</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4E 41"><unientity>7032</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4E 56"><unientity>9800</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4E 5D"><unientity>6DE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 4E 72"><unientity>6F74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 50 6D"><unientity>70B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 52 5D"><unientity>715B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 54 52"><unientity>71FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 5A 40"><unientity>73B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 5A 78"><unientity>74A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 5F 6F"><unientity>75B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 60 4A"><unientity>7690</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 60 60"><unientity>76A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 62 4F"><unientity>772D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 62 5F"><unientity>77C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 68 4E"><unientity>8020</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 68 6F"><unientity>7A19</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6B 54"><unientity>7B04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6C 26"><unientity>7BE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6C 27"><unientity>7B2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6C 3E"><unientity>7B59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6C 46"><unientity>7BE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6F 35"><unientity>6CD4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 6F 43"><unientity>9908</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 70 62"><unientity>7D4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 71 5A"><unientity>7E27</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 71 7C"><unientity>7D63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 73 28"><unientity>5FAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 73 5D"><unientity>7D56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 73 74"><unientity>7E89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 74 2E"><unientity>7516</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 74 31"><unientity>7F48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 74 50"><unientity>7F82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 74 51"><unientity>7F58</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 76 5F"><unientity>8037</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 7C 2E"><unientity>831C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2E 7D 24"><unientity>83F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 25 2D"><unientity>6A22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 25 2E"><unientity>8507</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 2A 5A"><unientity>E9D3</unientity><unientityalt>868B</unientityalt><desc>Unrelated variant of EACC 23293D which maps to 868B</desc></character>
-<character hex="2F 2A 64"><unientity>87B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 2A 73"><unientity>87CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 2D 79"><unientity>88B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 2F 5D"><unientity>7E48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 31 2B"><unientity>89BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 31 43"><unientity>E9D4</unientity><unientityalt>89F5</unientityalt><desc>Unrelated variant of EACC 23315E which maps to 89F5</desc></character>
-<character hex="2F 31 7D"><unientity>8A7E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 33 63"><unientity>8B1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 36 39"><unientity>8C7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 38 33"><unientity>8D91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 38 6F"><unientity>8DD7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 3A 5E"><unientity>8E6E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 3B 63"><unientity>E9F7</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="2F 3C 2D"><unientity>8F3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 3D 5D"><unientity>900E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 40 53"><unientity>914F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 42 31"><unientity>E9D5</unientity><unientityalt>8019</unientityalt><desc>Unrelated variant of EACC 215266 which maps to 8019</desc></character>
-<character hex="2F 44 5F"><unientity>941A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 4A 2E"><unientity>90B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 4A 4A"><unientity>5F8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 51 58"><unientity>7CC7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 54 76"><unientity>9AE1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 57 5F"><unientity>9ABE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 58 5C"><unientity>E9D6</unientity><unientityalt>9C51</unientityalt><desc>Unrelated variant of EACC 235945 which maps to 9C51</desc></character>
-<character hex="2F 58 70"><unientity>9C1B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 59 73"><unientity>9CEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5A 48"><unientity>9D44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5D 3C"><unientity>6EF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5D 49"><unientity>9EA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5D 5C"><unientity>730A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5E 42"><unientity>9EC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5E 66"><unientity>9B12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5E 7D"><unientity>6641</unientity><desc>East Asian ideograph</desc></character>
-<character hex="2F 5F 45"><unientity>86A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 21"><unientity>58F9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 3A"><unientity>8FFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 4C"><unientity>4E79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 51"><unientity>8CB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 60"><unientity>4EAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 66"><unientity>5FC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 6C"><unientity>8B90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 30 78"><unientity>5F77</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 31 4C"><unientity>5FA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 32 40"><unientity>4FFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 32 51"><unientity>5FBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 32 5D"><unientity>4FA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 32 7A"><unientity>5150</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 23"><unientity>4E21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 2A"><unientity>4E93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 30"><unientity>518A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 3C"><unientity>6C37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 44"><unientity>51DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 4E"><unientity>51FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 77"><unientity>5270</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 33 7B"><unientity>52E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 34 21"><unientity>91FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 34 23"><unientity>5264</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 34 28"><unientity>523C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 34 75"><unientity>9628</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 34 7D"><unientity>53C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 29"><unientity>53DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 4E"><unientity>608B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 56"><unientity>9A03</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 5C"><unientity>5449</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 64"><unientity>5415</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 35 73"><unientity>8656</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 36 23"><unientity>9F69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 36 2A"><unientity>9B28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 36 42"><unientity>8A92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 36 5A"><unientity>5405</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 37 68"><unientity>8FF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 38 6E"><unientity>576F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 39 2F"><unientity>9029</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 39 44"><unientity>5B2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 39 63"><unientity>59C9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3C 21"><unientity>7895</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3C 52"><unientity>8CEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 28"><unientity>53A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 2A"><unientity>5E83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 2F"><unientity>5E81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 42"><unientity>7D43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 48"><unientity>5F3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 4C"><unientity>7030</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 54"><unientity>4EFD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3D 75"><unientity>5FB3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3E 7D"><unientity>7652</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3F 22"><unientity>E97E</unientity><unientityalt>6168</unientityalt><desc>Variant of 213F22 which maps to 6168</desc></character>
-<character hex="33 3F 24"><unientity>7718</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3F 3F"><unientity>51F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3F 55"><unientity>5B3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3F 58"><unientity>61F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 3F 5B"><unientity>6133</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 40 45"><unientity>629B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 40 50"><unientity>62D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 41 31"><unientity>6425</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 41 7E"><unientity>629E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 2A"><unientity>62E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 3D"><unientity>53CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 43"><unientity>52B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 44"><unientity>6559</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 56"><unientity>6B5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 60"><unientity>89D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 42 77"><unientity>65EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 43 2F"><unientity>664B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 43 3E"><unientity>95C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 43 42"><unientity>7156</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 43 57"><unientity>6702</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 43 69"><unientity>5932</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 44 25"><unientity>76C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 44 49"><unientity>6144</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 45 27"><unientity>6918</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 45 50"><unientity>7F47</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 45 6D"><unientity>826A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 46 21"><unientity>8B99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 46 33"><unientity>E97F</unientity><unientityalt>6B8B</unientityalt><desc>Variant of 274633 which maps to 6B8B</desc></character>
-<character hex="33 46 3C"><unientity>6BBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 46 65"><unientity>6C61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 46 74"><unientity>76C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 46 7A"><unientity>6CA1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 29"><unientity>6E2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 30"><unientity>6E5F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 40"><unientity>6D1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 4A"><unientity>6D1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 55"><unientity>6FEC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 5E"><unientity>6FB9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 5F"><unientity>60BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 6F"><unientity>6D44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 70"><unientity>5A6C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 47 7B"><unientity>904A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 48 3B"><unientity>6CDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 48 5E"><unientity>67D2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 49 2E"><unientity>6F81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 49 4A"><unientity>70D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 49 68"><unientity>7133</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 49 6A"><unientity>934A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4A 28"><unientity>91BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4A 58"><unientity>89DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4C 2C"><unientity>754D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4C 36"><unientity>E980</unientity><unientityalt>753B</unientityalt><desc>Variant of 274C36 which maps to 753B</desc></character>
-<character hex="33 4C 37"><unientity>8E6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4C 3E"><unientity>8E08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4C 7B"><unientity>767A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4E 37"><unientity>784E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4E 73"><unientity>79A5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4F 37"><unientity>5EE9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4F 3A"><unientity>7A49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4F 59"><unientity>7A93</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4F 5E"><unientity>7A91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 4F 71"><unientity>54B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 50 2A"><unientity>9257</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 50 2B"><unientity>724B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 50 65"><unientity>7A45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 2E"><unientity>7E8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 3C"><unientity>7D4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 47"><unientity>7EEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 4C"><unientity>7DD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 5C"><unientity>7DAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 6B"><unientity>7DD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 6D"><unientity>6374</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 51 72"><unientity>7D89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 23"><unientity>7E8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 28"><unientity>94B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 30"><unientity>E981</unientity><unientityalt>7F6E</unientityalt><desc>Variant of 215230 which maps to 7F6E</desc></character>
-<character hex="33 52 34"><unientity>99E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 38"><unientity>8989</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 3F"><unientity>8B71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 59"><unientity>7E59</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 5B"><unientity>71FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 52 76"><unientity>8061</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 53 33"><unientity>80BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 53 47"><unientity>81D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 53 7D"><unientity>9AD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 54 45"><unientity>67C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 54 46"><unientity>8221</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 54 61"><unientity>6CD6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 55 61"><unientity>8462</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 55 68"><unientity>8406</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 55 77"><unientity>8602</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 56 35"><unientity>85AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 56 52"><unientity>87C1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 56 7C"><unientity>8671</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 57 2E"><unientity>880E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 57 38"><unientity>880F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 57 60"><unientity>88E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 57 72"><unientity>8943</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 57 73"><unientity>88B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 58 21"><unientity>97C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 58 30"><unientity>658D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 58 34"><unientity>89E7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 59 41"><unientity>54D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 59 58"><unientity>8C4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5A 7B"><unientity>8E28</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5B 70"><unientity>5EF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5D 23"><unientity>8A76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5D 3B"><unientity>57DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5E 21"><unientity>9221</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5E 2F"><unientity>5257</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5E 3D"><unientity>9244</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5E 42"><unientity>9452</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5F 34"><unientity>90C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5F 3D"><unientity>96B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5F 43"><unientity>9D08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5F 49"><unientity>9D70</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 5F 73"><unientity>9759</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 60 54"><unientity>985B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 60 58"><unientity>9855</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 60 62"><unientity>98C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 61 5A"><unientity>8EB0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 61 62"><unientity>9A23</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 61 79"><unientity>9C7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 62 5E"><unientity>9EAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 62 5F"><unientity>8534</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 62 75"><unientity>76BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 62 7D"><unientity>6589</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 63 21"><unientity>6B6F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 63 2B"><unientity>7ADC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 6B 33"><unientity>524F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 6C 6B"><unientity>6031</unientity><desc>East Asian ideograph</desc></character>
-<character hex="33 73 45"><unientity>9F67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 24 53"><unientity>5CBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 38 75"><unientity>5FDE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 3A 5B"><unientity>572C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 3E 38"><unientity>7BDA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 41 38"><unientity>8022</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 41 77"><unientity>8264</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 49 2F"><unientity>6D34</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 51 75"><unientity>7162</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 54 52"><unientity>7118</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 5D 6B"><unientity>756D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 5E 3B"><unientity>80AC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 5E 47"><unientity>75FE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 61 26"><unientity>6900</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 66 22"><unientity>589D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 68 2A"><unientity>7C7C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 71 5A"><unientity>7E1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 74 31"><unientity>58DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 78 2A"><unientity>90C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="34 7D 24"><unientity>83C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 34 4D"><unientity>8B5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 34 7B"><unientity>8B2D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 41 56"><unientity>91BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 50 53"><unientity>98C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 57 39"><unientity>9C76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 5D 5C"><unientity>8C8E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="35 5E 76"><unientity>82BE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 2D"><unientity>534B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 3A"><unientity>5EFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 4C"><unientity>4E81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 52"><unientity>65BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 54"><unientity>4F0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 30 78"><unientity>9AE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 32 46"><unientity>4F1D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 34 28"><unientity>5227</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 34 39"><unientity>61C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 34 5B"><unientity>965E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 34 60"><unientity>604A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 35 73"><unientity>5611</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 35 77"><unientity>9FA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 36 5A"><unientity>8AE0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 36 5E"><unientity>559E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 37 70"><unientity>56F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 39 44"><unientity>59B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3B 39"><unientity>5BF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3B 6E"><unientity>5C97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3B 78"><unientity>E922</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="39 3C 52"><unientity>8D26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3D 6F"><unientity>8907</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3E 47"><unientity>8CC9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3E 4C"><unientity>6142</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3E 61"><unientity>60AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 3E 7D"><unientity>7609</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 40 22"><unientity>6443</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 40 42"><unientity>646D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 41 7C"><unientity>62E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 42 43"><unientity>4FF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 42 4F"><unientity>5554</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 43 30"><unientity>6644</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 44 44"><unientity>8988</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 44 7D"><unientity>6AC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 45 6D"><unientity>826B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 46 34"><unientity>E982</unientity><unientityalt>6B96</unientityalt><desc>Variant of 214634 which maps to 6B96</desc></character>
-<character hex="39 47 35"><unientity>6C3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 47 6F"><unientity>51C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 48 3B"><unientity>9061</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 49 28"><unientity>6D5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 49 44"><unientity>6B12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 49 56"><unientity>792E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 4A 60"><unientity>9AE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 4C 2D"><unientity>7546</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 50 50"><unientity>7BED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 50 5B"><unientity>9B3B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 50 63"><unientity>9939</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 51 79"><unientity>7D75</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 52 30"><unientity>5BD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 52 5B"><unientity>66DC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 52 6B"><unientity>7094</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 54 77"><unientity>85A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 55 3C"><unientity>5D0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 55 64"><unientity>6726</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 55 68"><unientity>83DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 55 77"><unientity>854B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 56 3C"><unientity>56CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 56 43"><unientity>4E55</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 56 52"><unientity>87A1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 57 73"><unientity>7DAF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 58 21"><unientity>97E4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 58 29"><unientity>69FB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 59 3F"><unientity>8A3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5A 2F"><unientity>58F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5A 36"><unientity>983C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5D 23"><unientity>91BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5E 2F"><unientity>5277</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5E 3D"><unientity>9295</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5E 42"><unientity>9274</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5E 6F"><unientity>7A7D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5E 71"><unientity>5742</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5F 49"><unientity>5F6B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 5F 68"><unientity>8987</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 60 74"><unientity>55B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 61 67"><unientity>9B2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 61 79"><unientity>5C20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 62 23"><unientity>E983</unientity><unientityalt>9BFD</unientityalt><desc>Variant of 216223 which maps to 9BFD</desc></character>
-<character hex="39 6B 2F"><unientity>521F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="39 6B 33"><unientity>E9F8</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="39 6C 6B"><unientity>60A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 28 4C"><unientity>E984</unientity><unientityalt>53A9</unientityalt><desc>Variant of 4C284C which maps to 53A9</desc></character>
-<character hex="3A 2F 7C"><unientity>64C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 3B 7D"><unientity>67B1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 40 34"><unientity>6855</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 6A 7C"><unientity>7BEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 78 7D"><unientity>80FC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3A 79 70"><unientity>81D5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3B 2D 44"><unientity>8842</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3B 39 22"><unientity>8DB5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 30 4C"><unientity>5E79</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 30 78"><unientity>5023</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 34 7D"><unientity>84E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 35 73"><unientity>8B3C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 3D 6F"><unientity>8986</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 3E 47"><unientity>5379</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 3F 24"><unientity>614E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 40 4F"><unientity>638A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 42 4F"><unientity>E985</unientity><unientityalt>542F</unientityalt><desc>Variant of 27424F which maps to 542F</desc></character>
-<character hex="3F 44 72"><unientity>7881</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 45 6D"><unientity>8263</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 46 21"><unientity>9A69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 46 29"><unientity>4E97</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 46 2B"><unientity>5E30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 47 6F"><unientity>51C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 49 26"><unientity>6E08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 49 56"><unientity>7832</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 4A 28"><unientity>9DF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 4A 60"><unientity>7266</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 4C 3C"><unientity>7582</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 51 6D"><unientity>6403</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 55 64"><unientity>61DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 56 31"><unientity>517F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 59 59"><unientity>8276</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 5E 60"><unientity>9586</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 5F 34"><unientity>E9F9</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="3F 5F 35"><unientity>6B9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 5F 49"><unientity>7431</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 61 4C"><unientity>99C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="3F 61 79"><unientity>5C1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 30 4C"><unientity>69A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 30 51"><unientity>8D30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 33 36"><unientity>5B82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 34 21"><unientity>5271</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 36 66"><unientity>5AD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 37 55"><unientity>56AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 37 68"><unientity>5EFB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 3D 53"><unientity>5F66</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 3F 6D"><unientity>52E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 41 46"><unientity>63DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 45 6D"><unientity>6A10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 46 2B"><unientity>7688</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 46 5B"><unientity>6C2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 47 38"><unientity>6CFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 47 74"><unientity>6E15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 4B 7A"><unientity>7523</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 4C 3C"><unientity>7589</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 4E 43"><unientity>E986</unientity><unientityalt>788C</unientityalt><desc>Variant of 214E43 which maps to 788C</desc></character>
-<character hex="45 4E 75"><unientity>7984</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 4F 45"><unientity>9896</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 51 22"><unientity>7D0D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 51 64"><unientity>53BF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 56 4B"><unientity>E987</unientity><unientityalt>865E</unientityalt><desc>Variant of 21564B which maps to 865E</desc></character>
-<character hex="45 57 46"><unientity>672F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 58 37"><unientity>8BA0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 58 47"><unientity>E988</unientity><unientityalt>8A25</unientityalt><desc>Variant of 215847 which maps to 8A25</desc></character>
-<character hex="45 5D 3E"><unientity>9485</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 5E 21"><unientity>953A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 60 36"><unientity>97FF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 60 4E"><unientity>984F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 60 64"><unientity>9963</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 60 6B"><unientity>98F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 60 76"><unientity>9980</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 62 60"><unientity>5E7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="45 63 24"><unientity>9F61</unientity><desc>East Asian ideograph</desc></character>
-<character hex="46 28 4C"><unientity>5ED0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="46 60 74"><unientity>76B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 2C 4D"><unientity>E989</unientity><unientityalt>8801</unientityalt><desc>Variant of 232C4D which maps to 8801</desc></character>
-<character hex="47 34 22"><unientity>8C2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 34 7B"><unientity>8C2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 35 39"><unientity>8B9E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 36 6F"><unientity>8D4D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 42 36"><unientity>949A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 42 70"><unientity>94BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 49 31"><unientity>95F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 4E 5C"><unientity>E98A</unientity><unientityalt>97DE</unientityalt><desc>Variant of 234E5C which maps to 97DE</desc></character>
-<character hex="47 52 22"><unientity>9957</unientity><desc>East Asian ideograph</desc></character>
-<character hex="47 57 7A"><unientity>E98B</unientity><unientityalt>9BD6</unientityalt><desc>Variant of 23577A which maps to 9BD6</desc></character>
-<character hex="47 59 4E"><unientity>9C3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 21"><unientity>58F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 50"><unientity>4E8A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 51"><unientity>5F10</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 52"><unientity>6275</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 57"><unientity>4E99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 6C"><unientity>96E0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 30 6E"><unientity>E98C</unientity><unientityalt>4EE4</unientityalt><desc>Variant of 21306E which maps to 4EE4</desc></character>
-<character hex="4B 30 72"><unientity>4EED</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 31 2D"><unientity>4F2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 31 30"><unientity>4FAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 31 44"><unientity>E98D</unientity><unientityalt>4F36</unientityalt><desc>Variant of 213144 which maps to 4F36</desc></character>
-<character hex="4B 31 4C"><unientity>5F95</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 31 6A"><unientity>723C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 31 78"><unientity>E98E</unientity><unientityalt>5029</unientityalt><desc>Variant of 213178 which maps to 5029</desc></character>
-<character hex="4B 31 7C"><unientity>5024</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 32 31"><unientity>4EEE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 32 48"><unientity>E9FA</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="4B 32 4E"><unientity>E98F</unientity><unientityalt>50E7</unientityalt><desc>Variant of 21324E which maps to 50E7</desc></character>
-<character hex="4B 32 5F"><unientity>50BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 21"><unientity>5185</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 22"><unientity>E990</unientity><unientityalt>5168</unientityalt><desc>Variant of 213322 which maps to 5168</desc></character>
-<character hex="4B 33 24"><unientity>E991</unientity><unientityalt>634C</unientityalt><desc>Variant of 2D3324 which maps to 634C</desc></character>
-<character hex="4B 33 3E"><unientity>F92E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 51"><unientity>5204</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 54"><unientity>82C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 55"><unientity>520B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 33 5B"><unientity>522B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 34 21"><unientity>5263</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 34 35"><unientity>52B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 34 36"><unientity>52F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 34 6B"><unientity>5DF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 34 74"><unientity>E992</unientity><unientityalt>537F</unientityalt><desc>Variant of 213474 which maps to 537F</desc></character>
-<character hex="4B 35 6A"><unientity>55EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 35 7B"><unientity>54CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 36 22"><unientity>8C18</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 36 42"><unientity>8BF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 36 66"><unientity>5A1A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 36 68"><unientity>5358</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 2C"><unientity>5606</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 2F"><unientity>5C1C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 49"><unientity>E993</unientity><unientityalt>5668</unientityalt><desc>Variant of 213749 which maps to 5668</desc></character>
-<character hex="4B 37 4C"><unientity>5662</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 58"><unientity>E994</unientity><unientityalt>56A5</unientityalt><desc>Variant of 213758 which maps to 56A5</desc></character>
-<character hex="4B 37 5A"><unientity>53B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 68"><unientity>56D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 6F"><unientity>56FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 72"><unientity>5186</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 73"><unientity>56E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 37 74"><unientity>56F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 2E"><unientity>57C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 50"><unientity>E995</unientity><unientityalt>586B</unientityalt><desc>Variant of 213850 which maps to 586B</desc></character>
-<character hex="4B 38 53"><unientity>E9FB</unientity><desc>East Asian ideograph not in Unicode</desc></character>
-<character hex="4B 38 5E"><unientity>5897</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 64"><unientity>58C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 69"><unientity>5727</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 6C"><unientity>5841</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 70"><unientity>58CC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 71"><unientity>57BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 38 7D"><unientity>591B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 38"><unientity>5942</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 3A"><unientity>5F09</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 3E"><unientity>5965</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 3F"><unientity>5333</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 74"><unientity>5B22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 39 7B"><unientity>5A2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3A 2F"><unientity>805F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3A 47"><unientity>88CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3A 49"><unientity>5B37</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 22"><unientity>51A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 31"><unientity>5B9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 37"><unientity>51A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 43"><unientity>5BFE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 52"><unientity>8132</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 61"><unientity>5C64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 67"><unientity>6B67</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 79"><unientity>5D8C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3B 7E"><unientity>5D15</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 21"><unientity>5D5C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 23"><unientity>5CE5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 2F"><unientity>5DBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 32"><unientity>5DD3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 33"><unientity>5DCC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 38"><unientity>949C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 53"><unientity>5E2F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3C 5E"><unientity>5E64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 24"><unientity>53A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 27"><unientity>5EC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 2A"><unientity>5EE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 2C"><unientity>53B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 2F"><unientity>5EF0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 4B"><unientity>5F3E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 4C"><unientity>E996</unientity><unientityalt>5F25</unientityalt><desc>Variant of 273D4C which maps to 5F25</desc></character>
-<character hex="4B 3D 5C"><unientity>5F83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3D 67"><unientity>E997</unientity><unientityalt>5F84</unientityalt><desc>Variant of 273D67 which maps to 5F84</desc></character>
-<character hex="4B 3E 2A"><unientity>6035</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3E 40"><unientity>6046</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3E 5B"><unientity>60C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3E 7E"><unientity>60A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3F 40"><unientity>E998</unientity><unientityalt>618E</unientityalt><desc>Variant of 213F40 which maps to 618E</desc></character>
-<character hex="4B 3F 4A"><unientity>5FDC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3F 4B"><unientity>E999</unientity><unientityalt>601C</unientityalt><desc>Variant of 273F4B which maps to 601C</desc></character>
-<character hex="4B 3F 50"><unientity>E99A</unientity><unientityalt>61CA</unientityalt><desc>Variant of 213F50 which maps to 61CA</desc></character>
-<character hex="4B 3F 51"><unientity>61D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3F 53"><unientity>61F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 3F 74"><unientity>623B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 40 3D"><unientity>62DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 40 46"><unientity>629C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 40 49"><unientity>62D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 40 53"><unientity>627A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 40 66"><unientity>62F4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 41 2A"><unientity>6323</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 41 35"><unientity>6368</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 41 46"><unientity>6362</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 41 47"><unientity>633F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 42 35"><unientity>6442</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 42 36"><unientity>643A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 42 3A"><unientity>64B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 43 39"><unientity>6674</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 43 47"><unientity>66A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 43 4D"><unientity>663F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 43 52"><unientity>66F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 43 58"><unientity>66FD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 44 2D"><unientity>67A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 44 56"><unientity>6813</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 44 76"><unientity>685F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 34"><unientity>E99B</unientity><unientityalt>6994</unientityalt><desc>Variant of 214534 which maps to 6994</desc></character>
-<character hex="4B 45 37"><unientity>6804</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 44"><unientity>69D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 45"><unientity>6982</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 53"><unientity>6955</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 56"><unientity>6A2A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 59"><unientity>9792</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 61"><unientity>691C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 69"><unientity>6A71</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 6C"><unientity>E99C</unientity><unientityalt>6ADB</unientityalt><desc>Variant of 21456C which maps to 6ADB</desc></character>
-<character hex="4B 45 6D"><unientity>823B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 6F"><unientity>685C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 45 70"><unientity>6A29</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 21"><unientity>6B53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 2A"><unientity>6B74</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 2E"><unientity>6B81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 38"><unientity>6BB1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 55"><unientity>6C17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 5A"><unientity>6C32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 46 76"><unientity>6C89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 47 41"><unientity>51BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 47 59"><unientity>6D99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 47 61"><unientity>6E05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 47 67"><unientity>E99D</unientity><unientityalt>6DB5</unientityalt><desc>Variant of 214767 which maps to 6DB5</desc></character>
-<character hex="4B 47 6C"><unientity>51C5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 35"><unientity>6DA3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 46"><unientity>78C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 4A"><unientity>6E13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 4B"><unientity>51D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 4C"><unientity>6F91</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 57"><unientity>6F22</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 58"><unientity>6E80</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 5F"><unientity>E99E</unientity><unientityalt>6EDE</unientityalt><desc>Variant of 27485F which maps to 6EDE</desc></character>
-<character hex="4B 48 66"><unientity>6E89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 48 74"><unientity>6FF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 21"><unientity>6CA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 25"><unientity>E99F</unientity><unientityalt>6FB3</unientityalt><desc>Variant of 214925 which maps to 6FB3</desc></character>
-<character hex="4B 49 2B"><unientity>6FEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 2E"><unientity>6E0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 31"><unientity>6E16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 37"><unientity>56A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 40"><unientity>6F45</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 47"><unientity>7AC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 6A"><unientity>932C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 6B"><unientity>83F8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 73"><unientity>7115</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 75"><unientity>6427</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 49 77"><unientity>7188</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 2E"><unientity>55B6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 38"><unientity>71D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 3E"><unientity>7235</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 45"><unientity>5C13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 62"><unientity>72A0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4A 74"><unientity>E9A0</unientity><unientityalt>731C</unientityalt><desc>Variant of 214A74 which maps to 731C</desc></character>
-<character hex="4B 4A 78"><unientity>72F0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4B 2B"><unientity>7363</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4B 2C"><unientity>731F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4B 3E"><unientity>F9AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4B 63"><unientity>749C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4B 71"><unientity>E9A1</unientity><unientityalt>7F3E</unientityalt><desc>Variant of 2D4B71 which maps to 7F3E</desc></character>
-<character hex="4B 4B 77"><unientity>4EC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4C 36"><unientity>7575</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4C 3C"><unientity>7573</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4C 51"><unientity>75CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4C 5B"><unientity>75F3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4C 67"><unientity>E9A2</unientity><unientityalt>761F</unientityalt><desc>Variant of 214C67 which maps to 761F</desc></character>
-<character hex="4B 4C 79"><unientity>7672</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4D 41"><unientity>862F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4D 45"><unientity>E9A3</unientity><unientityalt>76F4</unientityalt><desc>Variant of 214D45 which maps to 76F4</desc></character>
-<character hex="4B 4D 56"><unientity>8846</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4D 59"><unientity>E9A4</unientity><unientityalt>775B</unientityalt><desc>Variant of 214D59 which maps to 775B</desc></character>
-<character hex="4B 4D 73"><unientity>66B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4D 7B"><unientity>E9A5</unientity><unientityalt>77D7</unientityalt><desc>Variant of 214D7B which maps to 77D7</desc></character>
-<character hex="4B 4E 21"><unientity>7B36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 37"><unientity>7814</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 39"><unientity>5CFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 56"><unientity>78FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 5B"><unientity>783F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 67"><unientity>79D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4E 7B"><unientity>E9A6</unientity><unientityalt>7985</unientityalt><desc>Variant of 274E7B which maps to 7985</desc></character>
-<character hex="4B 4F 29"><unientity>7A50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4F 3C"><unientity>E9A7</unientity><unientityalt>79F0</unientityalt><desc>Variant of 274F3C which maps to 79F0</desc></character>
-<character hex="4B 4F 43"><unientity>7A32</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4F 4C"><unientity>7A4F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 4F 7B"><unientity>7B7A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 50 36"><unientity>7C14</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 50 3B"><unientity>7C12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 50 44"><unientity>E9A8</unientity><unientityalt>7C27</unientityalt><desc>Variant of 215044 which maps to 7C27</desc></character>
-<character hex="4B 50 52"><unientity>7C56</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 50 61"><unientity>7CBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 50 6C"><unientity>7CAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 3B"><unientity>7CF8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 54"><unientity>7DF4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 5A"><unientity>7E01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 64"><unientity>770C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 6A"><unientity>7EF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 6D"><unientity>7DCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 6E"><unientity>7E26</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 76"><unientity>7E04</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 79"><unientity>7F0B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 51 7E"><unientity>7E92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 21"><unientity>7D9A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 23"><unientity>7E4A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 27"><unientity>6B20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 2B"><unientity>7F36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 38"><unientity>7F87</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 3E"><unientity>E9A9</unientity><unientityalt>7F9A</unientityalt><desc>Variant of 21523E which maps to 7F9A</desc></character>
-<character hex="4B 52 47"><unientity>7FAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 4E"><unientity>7FCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 5A"><unientity>7FFA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 5B"><unientity>E9AA</unientity><unientityalt>66DC</unientityalt><desc>Variant of 39525B which maps to 66DC</desc></character>
-<character hex="4B 52 5C"><unientity>8002</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 6E"><unientity>E9AB</unientity><unientityalt>8046</unientityalt><desc>Variant of 21526E which maps to 8046</desc></character>
-<character hex="4B 52 77"><unientity>8068</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 52 7C"><unientity>8080</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 53 3B"><unientity>695C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 53 61"><unientity>E923</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="4B 53 65"><unientity>8133</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 53 7D"><unientity>9ACC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 54 22"><unientity>81D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 54 28"><unientity>E9AC</unientity><unientityalt>81ED</unientityalt><desc>Variant of 215428 which maps to 81ED</desc></character>
-<character hex="4B 54 34"><unientity>6319</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 54 37"><unientity>820E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 54 6D"><unientity>E9AD</unientity><unientityalt>82D3</unientityalt><desc>Variant of 21546D which maps to 82D3</desc></character>
-<character hex="4B 55 21"><unientity>8332</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 55 2C"><unientity>8392</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 55 3A"><unientity>E9AE</unientity><unientityalt>83C1</unientityalt><desc>Variant of 21553A which maps to 83C1</desc></character>
-<character hex="4B 55 3F"><unientity>E9AF</unientity><unientityalt>83BD</unientityalt><desc>Variant of 21553F which maps to 83BD</desc></character>
-<character hex="4B 55 42"><unientity>8420</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 55 64"><unientity>77C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 29"><unientity>85CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 2B"><unientity>8535</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 31"><unientity>82B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 32"><unientity>7C54</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 3A"><unientity>E9B0</unientity><unientityalt>82A6</unientityalt><desc>Variant of 27563A which maps to 82A6</desc></character>
-<character hex="4B 56 3F"><unientity>6A98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 47"><unientity>51E6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 56 6A"><unientity>E9B1</unientity><unientityalt>8708</unientityalt><desc>Variant of 21566A which maps to 8708</desc></character>
-<character hex="4B 56 71"><unientity>E9B2</unientity><unientityalt>873B</unientityalt><desc>Variant of 215671 which maps to 873B</desc></character>
-<character hex="4B 57 24"><unientity>86CD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 36"><unientity>877F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 40"><unientity>8827</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 46"><unientity>8853</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 6C"><unientity>523E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 6F"><unientity>E9B3</unientity><unientityalt>8910</unientityalt><desc>Variant of 21576F which maps to 8910</desc></character>
-<character hex="4B 57 73"><unientity>7ED4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 57 7E"><unientity>7E7F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 24"><unientity>897E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 26"><unientity>E9B4</unientity><unientityalt>8983</unientityalt><desc>Variant of 215826 which maps to 8983</desc></character>
-<character hex="4B 58 30"><unientity>899A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 32"><unientity>89B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 61"><unientity>4F89</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 71"><unientity>8AA4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 58 7A"><unientity>8ACB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 36"><unientity>8B20</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 46"><unientity>8A33</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 4A"><unientity>8AAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 4B"><unientity>5909</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 59"><unientity>8273</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 63"><unientity>734F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 64"><unientity>72E2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 59 73"><unientity>8D2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5A 23"><unientity>621D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5A 31"><unientity>8CCE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5A 3B"><unientity>8D08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5A 68"><unientity>E9B5</unientity><unientityalt>8DF5</unientityalt><desc>Variant of 275A68 which maps to 8DF5</desc></character>
-<character hex="4B 5A 7E"><unientity>5C69</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 29"><unientity>8E8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 46"><unientity>8F0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 52"><unientity>8F42</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 55"><unientity>8EE2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 58"><unientity>8EE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5B 5E"><unientity>5F01</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 32"><unientity>9038</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 39"><unientity>9039</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 47"><unientity>9059</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 50"><unientity>9045</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 54"><unientity>E924</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="4B 5C 5B"><unientity>8FBA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 5E"><unientity>961D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5C 72"><unientity>E9B6</unientity><unientityalt>9119</unientityalt><desc>Variant of 215C72 which maps to 9119</desc></character>
-<character hex="4B 5C 77"><unientity>9139</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 2B"><unientity>9162</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 34"><unientity>91B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 36"><unientity>91C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 38"><unientity>91C8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 42"><unientity>91E1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 58"><unientity>9234</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 65"><unientity>8217</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5D 70"><unientity>92AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 27"><unientity>93AD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 3D"><unientity>9421</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 3F"><unientity>922C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 5D"><unientity>95D4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 69"><unientity>95A2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5E 6C"><unientity>E925</unientity><desc>Duplicate simplified ideograph</desc></character>
-<character hex="4B 5F 30"><unientity>E9B7</unientity><unientityalt>9686</unientityalt><desc>Variant of 215F30 which maps to 9686</desc></character>
-<character hex="4B 5F 35"><unientity>6B92</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 3A"><unientity>967A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 49"><unientity>51CB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 4C"><unientity>9D8F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 50"><unientity>96E3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 58"><unientity>F9B2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 62"><unientity>7668</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 6F"><unientity>970A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 70"><unientity>9752</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 71"><unientity>9756</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 72"><unientity>975B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 5F 73"><unientity>E9B8</unientity><unientityalt>975C</unientityalt><desc>Variant of 215F73 which maps to 975C</desc></character>
-<character hex="4B 60 2D"><unientity>9771</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 60 44"><unientity>9818</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 60 48"><unientity>981A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 60 53"><unientity>985E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 60 6F"><unientity>991D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 22"><unientity>994B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 30"><unientity>99C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 3F"><unientity>9A08</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 45"><unientity>9A12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 47"><unientity>99C6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 4D"><unientity>9A13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 59"><unientity>81B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 5F"><unientity>9AEA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 67"><unientity>95D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 61 68"><unientity>9599</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 3B"><unientity>9D12</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 47"><unientity>9D2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 4F"><unientity>9D49</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 58"><unientity>68BA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 5C"><unientity>E9B9</unientity><unientityalt>9EB8</unientityalt><desc>Variant of 27625C which maps to 9EB8</desc></character>
-<character hex="4B 62 60"><unientity>9EBD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 66"><unientity>9ED2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 68"><unientity>9ED9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 62 78"><unientity>9F21</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 63 24"><unientity>9F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 64 55"><unientity>4EB6</unientity><desc>East Asian ideography</desc></character>
-<character hex="4B 66 37"><unientity>4FE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 68 2E"><unientity>4EC2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 6A 22"><unientity>7F83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 6A 26"><unientity>6C8D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 74 21"><unientity>F9A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 75 77"><unientity>57D3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 76 3D"><unientity>E9BA</unientity><unientityalt>57F4</unientityalt><desc>Variant of 21763D which maps to 57F4</desc></character>
-<character hex="4B 78 74"><unientity>590A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 79 54"><unientity>5968</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4B 7E 6A"><unientity>E9BB</unientity><unientityalt>5BC3</unientityalt><desc>Variant of 217E6A which maps to 5BC3</desc></character>
-<character hex="4C 23 30"><unientity>5C53</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 23 3F"><unientity>5C76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 25 32"><unientity>5D5B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 25 39"><unientity>5D73</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 28 4C"><unientity>53A9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 28 67"><unientity>5EDB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 29 62"><unientity>E9BC</unientity><unientityalt>5F4D</unientityalt><desc>Variant of 222962 which maps to 5F4D</desc></character>
-<character hex="4C 2F 61"><unientity>622C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 34 74"><unientity>631D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 35 4A"><unientity>64B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 37 44"><unientity>65D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3A 33"><unientity>E9BD</unientity><unientityalt>80AD</unientityalt><desc>Variant of 2E3A33 which maps to 80AD</desc></character>
-<character hex="4C 3A 55"><unientity>6741</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3A 5B"><unientity>6859</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3B 22"><unientity>6860</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3B 31"><unientity>6798</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3B 60"><unientity>6764</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3F 68"><unientity>69C7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 3F 7A"><unientity>6922</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 41 46"><unientity>8538</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 41 77"><unientity>8223</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 43 33"><unientity>6AAA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 43 39"><unientity>69DE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 43 3F"><unientity>6A65</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 43 45"><unientity>67A6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 43 59"><unientity>6B05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 44 46"><unientity>6B4E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 47 6E"><unientity>6CAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4C 35"><unientity>6E0C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4D 3D"><unientity>6F62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4D 63"><unientity>6F99</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4F 24"><unientity>6F46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4F 26"><unientity>6EDD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 4F 2B"><unientity>701E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 51 75"><unientity>8315</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 52 3A"><unientity>717A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 54 47"><unientity>E9BE</unientity><unientityalt>71E0</unientityalt><desc>Variant of 225447 which maps to 71E0</desc></character>
-<character hex="4C 55 41"><unientity>4E2C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 56 38"><unientity>729F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 5C 3A"><unientity>73F1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 5C 61"><unientity>E9BF</unientity><unientityalt>74F4</unientityalt><desc>Variant of 225C61 which maps to 74F4</desc></character>
-<character hex="4C 5F 58"><unientity>7640</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 5F 69"><unientity>75EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 60 22"><unientity>7596</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 60 74"><unientity>76B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 62 66"><unientity>778B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 63 76"><unientity>7839</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 65 64"><unientity>78D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 65 65"><unientity>78B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 67 75"><unientity>E9D7</unientity><unientityalt>7962</unientityalt><desc>Unrelated variant of EACC 293032 which maps to 7962</desc></character>
-<character hex="4C 68 3E"><unientity>79EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 69 5C"><unientity>7A06</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 69 5F"><unientity>7A63</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 6B 62"><unientity>E9C0</unientity><unientityalt>7B4C</unientityalt><desc>Variant of 226B62 which maps to 7B4C</desc></character>
-<character hex="4C 6C 46"><unientity>7B9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 6E 42"><unientity>7C31</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 6F 43"><unientity>7CCD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 6F 7B"><unientity>7CE8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 71 5A"><unientity>7EE6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 72 5D"><unientity>7A39</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 72 65"><unientity>7DFC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 73 28"><unientity>E9C1</unientity><unientityalt>5FAD</unientityalt><desc>Variant of 2E7328 which maps to 5FAD</desc></character>
-<character hex="4C 73 5D"><unientity>7D4B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 79 4E"><unientity>80B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 79 59"><unientity>817D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 79 6B"><unientity>815F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 7C 45"><unientity>82AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 7D 4D"><unientity>8343</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4C 7D 6A"><unientity>8323</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 22 2A"><unientity>83B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 29 25"><unientity>8770</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 29 62"><unientity>E9C2</unientity><unientityalt>86C9</unientityalt><desc>Variant of 232962 which maps to 86C9</desc></character>
-<character hex="4D 2C 3C"><unientity>87E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 2D 75"><unientity>E9C3</unientity><unientityalt>8872</unientityalt><desc>Variant of 232D75 which maps to 8872</desc></character>
-<character hex="4D 2F 5D"><unientity>E9C4</unientity><unientityalt>8941</unientityalt><desc>Variant of 232F5D which maps to 8941</desc></character>
-<character hex="4D 2F 73"><unientity>7E5D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 2F 7A"><unientity>891D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 30 32"><unientity>88AE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 33 59"><unientity>56AF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 33 63"><unientity>8C25</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 38 6F"><unientity>544B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 3C 6C"><unientity>8FB6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 41 34"><unientity>919B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 41 76"><unientity>91DB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 44 5B"><unientity>E9C5</unientity><unientityalt>9306</unientityalt><desc>Variant of 23445B which maps to 9306</desc></character>
-<character hex="4D 44 6B"><unientity>954E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 47 2C"><unientity>952A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 47 54"><unientity>9544</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 47 7B"><unientity>943E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 48 32"><unientity>953F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 48 35"><unientity>954C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 48 62"><unientity>9229</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 4A 6C"><unientity>9667</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 4D 61"><unientity>7EF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 4F 39"><unientity>988C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 50 3A"><unientity>98D1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 50 53"><unientity>98DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 51 54"><unientity>9942</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 55 74"><unientity>9B2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 58 58"><unientity>9BE3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 58 75"><unientity>9CD0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 59 34"><unientity>9CA6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 59 4E"><unientity>9BF5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 59 73"><unientity>51EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5A 6C"><unientity>9D46</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5B 35"><unientity>9DAB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5B 7E"><unientity>9DC6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5C 6B"><unientity>9D50</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5D 49"><unientity>9E81</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5F 70"><unientity>9F44</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 5F 7B"><unientity>97F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="4D 60 47"><unientity>816D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 30 51"><unientity>8CAE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 30 57"><unientity>4E98</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 34 21"><unientity>91D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 35 6A"><unientity>8BC3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 38 4D"><unientity>51C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 3A 47"><unientity>8885</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 3B 52"><unientity>6C3D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 3D 67"><unientity>8FF3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 45 6D"><unientity>822E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 49 6B"><unientity>852B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 4E 5B"><unientity>9271</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 51 3B"><unientity>7E9F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 56 3F"><unientity>8616</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 5E 5D"><unientity>9616</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 61 22"><unientity>9988</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 6A 26"><unientity>51B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="51 79 54"><unientity>734E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="52 73 5D"><unientity>E9C6</unientity><unientityalt>7E8A</unientityalt><desc>Variant of 22735D which maps to 7E8A</desc></character>
-<character hex="69 21 26"><unientity>30FB</unientity><desc>Ideographic centered point</desc></character>
-<character hex="69 21 39"><unientity>3005</unientity><desc>Ideographic iteration mark</desc></character>
-<character hex="69 21 3C"><unientity>30FC</unientity><desc>Vowel elongation mark for kana</desc></character>
-<character hex="69 21 52"><unientity>3008</unientity><desc>Ideographic less than sign</desc></character>
-<character hex="69 21 53"><unientity>3009</unientity><desc>Ideographic greater than sign</desc></character>
-<character hex="69 21 54"><unientity>300A</unientity><desc>Ideographic left double angle bracket</desc></character>
-<character hex="69 21 55"><unientity>300B</unientity><desc>Ideographic right double angle bracket</desc></character>
-<character hex="69 24 21"><unientity>3041</unientity><desc>Hiragana letter small A</desc></character>
-<character hex="69 24 22"><unientity>3042</unientity><desc>Hiragana letter A</desc></character>
-<character hex="69 24 23"><unientity>3043</unientity><desc>Hiragana letter small I</desc></character>
-<character hex="69 24 24"><unientity>3044</unientity><desc>Hiragana letter I</desc></character>
-<character hex="69 24 25"><unientity>3045</unientity><desc>Hiragana letter small U</desc></character>
-<character hex="69 24 26"><unientity>3046</unientity><desc>Hiragana letter U</desc></character>
-<character hex="69 24 27"><unientity>3047</unientity><desc>Hiragana letter small E</desc></character>
-<character hex="69 24 28"><unientity>3048</unientity><desc>Hiragana letter E</desc></character>
-<character hex="69 24 29"><unientity>3049</unientity><desc>Hiragana letter small O</desc></character>
-<character hex="69 24 2A"><unientity>304A</unientity><desc>Hiragana letter O</desc></character>
-<character hex="69 24 2B"><unientity>304B</unientity><desc>Hiragana letter KA</desc></character>
-<character hex="69 24 2C"><unientity>304C</unientity><desc>Hiragana letter GA</desc></character>
-<character hex="69 24 2D"><unientity>304D</unientity><desc>Hiragana letter KI</desc></character>
-<character hex="69 24 2E"><unientity>304E</unientity><desc>Hiragana letter GI</desc></character>
-<character hex="69 24 2F"><unientity>304F</unientity><desc>Hiragana letter KU</desc></character>
-<character hex="69 24 30"><unientity>3050</unientity><desc>Hiragana letter GU</desc></character>
-<character hex="69 24 31"><unientity>3051</unientity><desc>Hiragana letter KE</desc></character>
-<character hex="69 24 32"><unientity>3052</unientity><desc>Hiragana letter GE</desc></character>
-<character hex="69 24 33"><unientity>3053</unientity><desc>Hiragana letter KO</desc></character>
-<character hex="69 24 34"><unientity>3054</unientity><desc>Hiragana letter GO</desc></character>
-<character hex="69 24 35"><unientity>3055</unientity><desc>Hiragana letter SA</desc></character>
-<character hex="69 24 36"><unientity>3056</unientity><desc>Hiragana letter ZA</desc></character>
-<character hex="69 24 37"><unientity>3057</unientity><desc>Hiragana letter SI</desc></character>
-<character hex="69 24 38"><unientity>3058</unientity><desc>Hiragana letter ZI</desc></character>
-<character hex="69 24 39"><unientity>3059</unientity><desc>Hiragana letter SU</desc></character>
-<character hex="69 24 3A"><unientity>305A</unientity><desc>Hiragana letter ZU</desc></character>
-<character hex="69 24 3B"><unientity>305B</unientity><desc>Hiragana letter SE</desc></character>
-<character hex="69 24 3C"><unientity>305C</unientity><desc>Hiragana letter ZE</desc></character>
-<character hex="69 24 3D"><unientity>305D</unientity><desc>Hiragana letter SO</desc></character>
-<character hex="69 24 3E"><unientity>305E</unientity><desc>Hiragana letter ZO</desc></character>
-<character hex="69 24 3F"><unientity>305F</unientity><desc>Hiragana letter TA</desc></character>
-<character hex="69 24 40"><unientity>3060</unientity><desc>Hiragana letter DA</desc></character>
-<character hex="69 24 41"><unientity>3061</unientity><desc>Hiragana letter TI</desc></character>
-<character hex="69 24 42"><unientity>3062</unientity><desc>Hiragana letter DI</desc></character>
-<character hex="69 24 43"><unientity>3063</unientity><desc>Hiragana letter small TU</desc></character>
-<character hex="69 24 44"><unientity>3064</unientity><desc>Hiragana letter TU</desc></character>
-<character hex="69 24 45"><unientity>3065</unientity><desc>Hiragana letter DU</desc></character>
-<character hex="69 24 46"><unientity>3066</unientity><desc>Hiragana letter TE</desc></character>
-<character hex="69 24 47"><unientity>3067</unientity><desc>Hiragana letter DE</desc></character>
-<character hex="69 24 48"><unientity>3068</unientity><desc>Hiragana letter TO</desc></character>
-<character hex="69 24 49"><unientity>3069</unientity><desc>Hiragana letter DO</desc></character>
-<character hex="69 24 4A"><unientity>306A</unientity><desc>Hiragana letter NA</desc></character>
-<character hex="69 24 4B"><unientity>306B</unientity><desc>Hiragana letter NI</desc></character>
-<character hex="69 24 4C"><unientity>306C</unientity><desc>Hiragana letter NU</desc></character>
-<character hex="69 24 4D"><unientity>306D</unientity><desc>Hiragana letter NE</desc></character>
-<character hex="69 24 4E"><unientity>306E</unientity><desc>Hiragana letter NO</desc></character>
-<character hex="69 24 4F"><unientity>306F</unientity><desc>Hiragana letter HA</desc></character>
-<character hex="69 24 50"><unientity>3070</unientity><desc>Hiragana letter BA</desc></character>
-<character hex="69 24 51"><unientity>3071</unientity><desc>Hiragana letter PA</desc></character>
-<character hex="69 24 52"><unientity>3072</unientity><desc>Hiragana letter HI</desc></character>
-<character hex="69 24 53"><unientity>3073</unientity><desc>Hiragana letter BI</desc></character>
-<character hex="69 24 54"><unientity>3074</unientity><desc>Hiragana letter PI</desc></character>
-<character hex="69 24 55"><unientity>3075</unientity><desc>Hiragana letter HU</desc></character>
-<character hex="69 24 56"><unientity>3076</unientity><desc>Hiragana letter BU</desc></character>
-<character hex="69 24 57"><unientity>3077</unientity><desc>Hiragana letter PU</desc></character>
-<character hex="69 24 58"><unientity>3078</unientity><desc>Hiragana letter HE</desc></character>
-<character hex="69 24 59"><unientity>3079</unientity><desc>Hiragana letter BE</desc></character>
-<character hex="69 24 5A"><unientity>307A</unientity><desc>Hiragana letter PE</desc></character>
-<character hex="69 24 5B"><unientity>307B</unientity><desc>Hiragana letter HO</desc></character>
-<character hex="69 24 5C"><unientity>307C</unientity><desc>Hiragana letter BO</desc></character>
-<character hex="69 24 5D"><unientity>307D</unientity><desc>Hiragana letter PO</desc></character>
-<character hex="69 24 5E"><unientity>307E</unientity><desc>Hiragana letter MA</desc></character>
-<character hex="69 24 5F"><unientity>307F</unientity><desc>Hiragana letter MI</desc></character>
-<character hex="69 24 60"><unientity>3080</unientity><desc>Hiragana letter MU</desc></character>
-<character hex="69 24 61"><unientity>3081</unientity><desc>Hiragana letter ME</desc></character>
-<character hex="69 24 62"><unientity>3082</unientity><desc>Hiragana letter MO</desc></character>
-<character hex="69 24 63"><unientity>3083</unientity><desc>Hiragana letter small YA</desc></character>
-<character hex="69 24 64"><unientity>3084</unientity><desc>Hiragana letter YA</desc></character>
-<character hex="69 24 65"><unientity>3085</unientity><desc>Hiragana letter small YU</desc></character>
-<character hex="69 24 66"><unientity>3086</unientity><desc>Hiragana letter YU</desc></character>
-<character hex="69 24 67"><unientity>3087</unientity><desc>Hiragana letter small YO</desc></character>
-<character hex="69 24 68"><unientity>3088</unientity><desc>Hiragana letter YO</desc></character>
-<character hex="69 24 69"><unientity>3089</unientity><desc>Hiragana letter RA</desc></character>
-<character hex="69 24 6A"><unientity>308A</unientity><desc>Hiragana letter RI</desc></character>
-<character hex="69 24 6B"><unientity>308B</unientity><desc>Hiragana letter RU</desc></character>
-<character hex="69 24 6C"><unientity>308C</unientity><desc>Hiragana letter RE</desc></character>
-<character hex="69 24 6D"><unientity>308D</unientity><desc>Hiragana letter RO</desc></character>
-<character hex="69 24 6E"><unientity>308E</unientity><desc>Hiragana letter small WA</desc></character>
-<character hex="69 24 6F"><unientity>308F</unientity><desc>Hiragana letter WA</desc></character>
-<character hex="69 24 70"><unientity>3090</unientity><desc>Hiragana letter WI</desc></character>
-<character hex="69 24 71"><unientity>3091</unientity><desc>Hiragana letter WE</desc></character>
-<character hex="69 24 72"><unientity>3092</unientity><desc>Hiragana letter WO</desc></character>
-<character hex="69 24 73"><unientity>3093</unientity><desc>Hiragana letter N</desc></character>
-<character hex="69 25 21"><unientity>30A1</unientity><desc>Katakana letter small A</desc></character>
-<character hex="69 25 22"><unientity>30A2</unientity><desc>Katakana letter A</desc></character>
-<character hex="69 25 23"><unientity>30A3</unientity><desc>Katakana letter small I</desc></character>
-<character hex="69 25 24"><unientity>30A4</unientity><desc>Katakana letter I</desc></character>
-<character hex="69 25 25"><unientity>30A5</unientity><desc>Katakana letter small U</desc></character>
-<character hex="69 25 26"><unientity>30A6</unientity><desc>Katakana letter U</desc></character>
-<character hex="69 25 27"><unientity>30A7</unientity><desc>Katakana letter small E</desc></character>
-<character hex="69 25 28"><unientity>30A8</unientity><desc>Katakana letter E</desc></character>
-<character hex="69 25 29"><unientity>30A9</unientity><desc>Katakana letter small O</desc></character>
-<character hex="69 25 2A"><unientity>30AA</unientity><desc>Katakana letter O</desc></character>
-<character hex="69 25 2B"><unientity>30AB</unientity><desc>Katakana letter KA</desc></character>
-<character hex="69 25 2C"><unientity>30AC</unientity><desc>Katakana letter GA</desc></character>
-<character hex="69 25 2D"><unientity>30AD</unientity><desc>Katakana letter KI</desc></character>
-<character hex="69 25 2E"><unientity>30AE</unientity><desc>Katakana letter GI</desc></character>
-<character hex="69 25 2F"><unientity>30AF</unientity><desc>Katakana letter KU</desc></character>
-<character hex="69 25 30"><unientity>30B0</unientity><desc>Katakana letter GU</desc></character>
-<character hex="69 25 31"><unientity>30B1</unientity><desc>Katakana letter KE</desc></character>
-<character hex="69 25 32"><unientity>30B2</unientity><desc>Katakana letter GE</desc></character>
-<character hex="69 25 33"><unientity>30B3</unientity><desc>Katakana letter KO</desc></character>
-<character hex="69 25 34"><unientity>30B4</unientity><desc>Katakana letter GO</desc></character>
-<character hex="69 25 35"><unientity>30B5</unientity><desc>Katakana letter SA</desc></character>
-<character hex="69 25 36"><unientity>30B6</unientity><desc>Katakana letter ZA</desc></character>
-<character hex="69 25 37"><unientity>30B7</unientity><desc>Katakana letter SI</desc></character>
-<character hex="69 25 38"><unientity>30B8</unientity><desc>Katakana letter ZI</desc></character>
-<character hex="69 25 39"><unientity>30B9</unientity><desc>Katakana letter SU</desc></character>
-<character hex="69 25 3A"><unientity>30BA</unientity><desc>Katakana letter ZU</desc></character>
-<character hex="69 25 3B"><unientity>30BB</unientity><desc>Katakana letter SE</desc></character>
-<character hex="69 25 3C"><unientity>30BC</unientity><desc>Katakana letter ZE</desc></character>
-<character hex="69 25 3D"><unientity>30BD</unientity><desc>Katakana letter SO</desc></character>
-<character hex="69 25 3F"><unientity>30BF</unientity><desc>Katakana letter TA</desc></character>
-<character hex="69 25 40"><unientity>30C0</unientity><desc>Katakana letter DA</desc></character>
-<character hex="69 25 41"><unientity>30C1</unientity><desc>Katakana letter TI</desc></character>
-<character hex="69 25 42"><unientity>30C2</unientity><desc>Katakana letter DI</desc></character>
-<character hex="69 25 43"><unientity>30C3</unientity><desc>Katakana letter small TU</desc></character>
-<character hex="69 25 44"><unientity>30C4</unientity><desc>Katakana letter TU</desc></character>
-<character hex="69 25 45"><unientity>30C5</unientity><desc>Katakana letter DU</desc></character>
-<character hex="69 25 46"><unientity>30C6</unientity><desc>Katakana letter TE</desc></character>
-<character hex="69 25 47"><unientity>30C7</unientity><desc>Katakana letter DE</desc></character>
-<character hex="69 25 48"><unientity>30C8</unientity><desc>Katakana letter TO</desc></character>
-<character hex="69 25 49"><unientity>30C9</unientity><desc>Katakana letter DO</desc></character>
-<character hex="69 25 4A"><unientity>30CA</unientity><desc>Katakana letter NA</desc></character>
-<character hex="69 25 4B"><unientity>30CB</unientity><desc>Katakana letter NI</desc></character>
-<character hex="69 25 4C"><unientity>30CC</unientity><desc>Katakana letter NU</desc></character>
-<character hex="69 25 4D"><unientity>30CD</unientity><desc>Katakana letter NE</desc></character>
-<character hex="69 25 4E"><unientity>30CE</unientity><desc>Katakana letter NO</desc></character>
-<character hex="69 25 4F"><unientity>30CF</unientity><desc>Katakana letter HA</desc></character>
-<character hex="69 25 50"><unientity>30D0</unientity><desc>Katakana letter BA</desc></character>
-<character hex="69 25 51"><unientity>30D1</unientity><desc>Katakana letter PA</desc></character>
-<character hex="69 25 52"><unientity>30D2</unientity><desc>Katakana letter HI</desc></character>
-<character hex="69 25 53"><unientity>30D3</unientity><desc>Katakana letter BI</desc></character>
-<character hex="69 25 54"><unientity>30D4</unientity><desc>Katakana letter PI</desc></character>
-<character hex="69 25 55"><unientity>30D5</unientity><desc>Katakana letter HU</desc></character>
-<character hex="69 25 56"><unientity>30D6</unientity><desc>Katakana letter BU</desc></character>
-<character hex="69 25 57"><unientity>30D7</unientity><desc>Katakana letter PU</desc></character>
-<character hex="69 25 58"><unientity>30D8</unientity><desc>Katakana letter HE</desc></character>
-<character hex="69 25 59"><unientity>30D9</unientity><desc>Katakana letter BE</desc></character>
-<character hex="69 25 5A"><unientity>30DA</unientity><desc>Katakana letter PE</desc></character>
-<character hex="69 25 5B"><unientity>30DB</unientity><desc>Katakana letter HO</desc></character>
-<character hex="69 25 5C"><unientity>30DC</unientity><desc>Katakana letter BO</desc></character>
-<character hex="69 25 5D"><unientity>30DD</unientity><desc>Katakana letter PO</desc></character>
-<character hex="69 25 5E"><unientity>30DE</unientity><desc>Katakana letter MA</desc></character>
-<character hex="69 25 5F"><unientity>30DF</unientity><desc>Katakana letter MI</desc></character>
-<character hex="69 25 60"><unientity>30E0</unientity><desc>Katakana letter MU</desc></character>
-<character hex="69 25 61"><unientity>30E1</unientity><desc>Katakana letter ME</desc></character>
-<character hex="69 25 62"><unientity>30E2</unientity><desc>Katakana letter MO</desc></character>
-<character hex="69 25 63"><unientity>30E3</unientity><desc>Katakana letter small YA</desc></character>
-<character hex="69 25 64"><unientity>30E4</unientity><desc>Katakana letter YA</desc></character>
-<character hex="69 25 65"><unientity>30E5</unientity><desc>Katakana letter small YU</desc></character>
-<character hex="69 25 66"><unientity>30E6</unientity><desc>Katakana letter YU</desc></character>
-<character hex="69 25 67"><unientity>30E7</unientity><desc>Katakana letter small YO</desc></character>
-<character hex="69 25 68"><unientity>30E8</unientity><desc>Katakana letter YO</desc></character>
-<character hex="69 25 69"><unientity>30E9</unientity><desc>Katakana letter RA</desc></character>
-<character hex="69 25 6A"><unientity>30EA</unientity><desc>Katakana letter RI</desc></character>
-<character hex="69 25 6B"><unientity>30EB</unientity><desc>Katakana letter RU</desc></character>
-<character hex="69 25 6C"><unientity>30EC</unientity><desc>Katakana letter RE</desc></character>
-<character hex="69 25 6D"><unientity>30ED</unientity><desc>Katakana letter RO</desc></character>
-<character hex="69 25 6E"><unientity>30EE</unientity><desc>Katakana letter small WA</desc></character>
-<character hex="69 25 6F"><unientity>30EF</unientity><desc>Katakana letter WA</desc></character>
-<character hex="69 25 70"><unientity>30F0</unientity><desc>Katakana letter WI</desc></character>
-<character hex="69 25 71"><unientity>30F1</unientity><desc>Katakana letter WE</desc></character>
-<character hex="69 25 72"><unientity>30F2</unientity><desc>Katakana letter WO</desc></character>
-<character hex="69 25 73"><unientity>30F3</unientity><desc>Katakana letter N</desc></character>
-<character hex="69 25 74"><unientity>30F4</unientity><desc>Katakana letter VU</desc></character>
-<character hex="69 25 75"><unientity>30F5</unientity><desc>Katakana letter small KA</desc></character>
-<character hex="69 25 76"><unientity>30F6</unientity><desc>Katakana letter small KE</desc></character>
-<character hex="69 25 77"><unientity>309B</unientity><desc>Katakana-hiragana voiced sound mark</desc></character>
-<character hex="69 25 78"><unientity>309C</unientity><desc>Katakana-hiragana semi-voiced sound mark</desc></character>
-<character hex="69 37 29"><unientity>7C82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 3C 32"><unientity>9D2B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 3C 36"><unientity>96EB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 46 64"><unientity>51EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 46 77"><unientity>5302</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 48 23"><unientity>7872</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 48 2B"><unientity>7560</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 48 38"><unientity>567A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 4B 7B"><unientity>9EBF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 4C 5D"><unientity>6762</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 4C 68"><unientity>5301</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 4C 7A"><unientity>9453</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 51 30"><unientity>5116</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 51 5E"><unientity>51E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 52 5D"><unientity>53FA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 53 26"><unientity>54D8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 53 3B"><unientity>555D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 53 75"><unientity>56CE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 29"><unientity>5726</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 2A"><unientity>5737</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 38"><unientity>57B3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 3A"><unientity>57AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 3B"><unientity>57B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 42"><unientity>57D6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 4B"><unientity>5870</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 51"><unientity>58B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 57"><unientity>58B8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 5C"><unientity>58D7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 54 5F"><unientity>58E5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 55 4E"><unientity>5B36</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 26"><unientity>4E62</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 2C"><unientity>599B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 2E"><unientity>5CBB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 30"><unientity>5CBC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 32"><unientity>5CC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 33"><unientity>5CBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 4E"><unientity>5D76</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 56 57"><unientity>5D90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 57 37"><unientity>5F16</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 57 3B"><unientity>5F41</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 57 6A"><unientity>603A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 59 4B"><unientity>6327</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 59 5E"><unientity>63B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5A 31"><unientity>64F6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5A 73"><unientity>6683</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5A 7E"><unientity>66BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5B 37"><unientity>6737</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5B 7B"><unientity>6926</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 29"><unientity>6925</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 2D"><unientity>6928</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 30"><unientity>6923</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 31"><unientity>6921</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 39"><unientity>697E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 43"><unientity>6981</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 4F"><unientity>69DD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 53"><unientity>6A2E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5C 71"><unientity>6A78</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5D 36"><unientity>6B1F</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5E 63"><unientity>6E82</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 5F 70"><unientity>7195</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 61 26"><unientity>74F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 61 36"><unientity>753C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 61 3A"><unientity>7549</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 61 3E"><unientity>7569</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 62 6D"><unientity>7874</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 62 73"><unientity>78B5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 63 25"><unientity>7907</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 63 4E"><unientity>7A43</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 63 73"><unientity>7B02</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 49"><unientity>7C13</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 4C"><unientity>7C17</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 4E"><unientity>7BF6</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 64"><unientity>7C90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 66"><unientity>7CAD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 71"><unientity>7CC0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 64 74"><unientity>7CD8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 65 4F"><unientity>7E05</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 65 6D"><unientity>7E83</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 65 6E"><unientity>7DD5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 65 76"><unientity>7E90</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 67 33"><unientity>81A4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 67 5C"><unientity>825D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 68 4D"><unientity>8422</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 68 68"><unientity>84D9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 69 46"><unientity>8630</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 69 5B"><unientity>86AB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 69 62"><unientity>86EF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6A 2C"><unientity>87D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6A 5E"><unientity>88B0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6A 61"><unientity>88C3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6A 6D"><unientity>8904</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6B 27"><unientity>8977</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6B 5C"><unientity>8ADA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6D 3F"><unientity>8EBE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6D 40"><unientity>8EC5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6D 41"><unientity>8EC8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6D 5A"><unientity>8F4C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6D 7A"><unientity>9027</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6E 28"><unientity>9056</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6E 5C"><unientity>91DF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6F 27"><unientity>933B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6F 5B"><unientity>958A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 6F 5D"><unientity>9596</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 70 23"><unientity>9666</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 70 58"><unientity>9779</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 70 5D"><unientity>9786</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 70 60"><unientity>9790</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 71 24"><unientity>98AA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 71 52"><unientity>99F2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 71 74"><unientity>9ADE</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 71 7D"><unientity>9AF1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 71 7E"><unientity>9AF7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 3B"><unientity>9B96</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 40"><unientity>9BB4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 45"><unientity>9BCF</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 46"><unientity>9BD1</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 4E"><unientity>9BF2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 60"><unientity>9C30</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 65"><unientity>9C5A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 72 7E"><unientity>9D48</unientity><desc>East Asian ideograph</desc></character>
-<character hex="69 73 23"><unientity>9D64</unientity><desc>East Asian ideograph</desc></character>
-<character hex="6F 24 57"><unientity>3131</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 58"><unientity>3134</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 59"><unientity>3137</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5A"><unientity>3139</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5B"><unientity>3141</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5C"><unientity>3142</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5D"><unientity>3145</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5E"><unientity>3147</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 5F"><unientity>3148</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 60"><unientity>314A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 61"><unientity>314B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 62"><unientity>314C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 63"><unientity>314D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 64"><unientity>314E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 65"><unientity>3132</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 69"><unientity>3138</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 6E"><unientity>3143</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 70"><unientity>3146</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 71"><unientity>3149</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 72"><unientity>314F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 73"><unientity>3150</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 74"><unientity>3151</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 76"><unientity>3153</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 77"><unientity>3154</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 78"><unientity>3155</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 7A"><unientity>3157</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 7B"><unientity>3158</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 24 7E"><unientity>315B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 25 21"><unientity>315C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 25 25"><unientity>3160</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 25 26"><unientity>3161</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 25 27"><unientity>3162</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 25 28"><unientity>3163</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 5F"><unientity>AC00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 60"><unientity>AC01</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 61"><unientity>AC02</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 62"><unientity>AC04</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 63"><unientity>AC07</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 64"><unientity>AC08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 65"><unientity>AC09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 66"><unientity>AC10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 67"><unientity>AC11</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 68"><unientity>AC12</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 69"><unientity>AC13</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6A"><unientity>AC14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6B"><unientity>AC15</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6C"><unientity>AC16</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6D"><unientity>AC17</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6E"><unientity>AC19</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 6F"><unientity>AC1A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 70"><unientity>AC1B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 71"><unientity>AC1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 72"><unientity>AC1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 73"><unientity>AC20</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 75"><unientity>AC24</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 76"><unientity>AC2C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 77"><unientity>AC2D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 78"><unientity>AC2F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 79"><unientity>AC30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 7A"><unientity>AC31</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 7B"><unientity>AC38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 7C"><unientity>AC39</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 7D"><unientity>AC40</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 48 7E"><unientity>AC54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 21"><unientity>AC70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 22"><unientity>AC71</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 24"><unientity>AC74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 25"><unientity>AC77</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 26"><unientity>AC78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 27"><unientity>AC79</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 29"><unientity>AC80</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 2A"><unientity>AC81</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 2B"><unientity>AC83</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 2C"><unientity>AC84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 2D"><unientity>AC85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 2E"><unientity>AC86</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 30"><unientity>AC89</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 31"><unientity>AC8A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 32"><unientity>AC8B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 33"><unientity>AC8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 34"><unientity>AC90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 35"><unientity>AC94</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 36"><unientity>AC9C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 37"><unientity>AC9F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 38"><unientity>ACA0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 39"><unientity>ACA1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3A"><unientity>ACA8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3B"><unientity>ACA9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3C"><unientity>ACAA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3D"><unientity>ACAC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3E"><unientity>ACAF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 3F"><unientity>ACB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 40"><unientity>ACB8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 41"><unientity>ACB9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 43"><unientity>ACBC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 44"><unientity>ACBD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 45"><unientity>ACC1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 47"><unientity>ACC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 49"><unientity>ACD7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4A"><unientity>ACE0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4B"><unientity>ACE1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4C"><unientity>ACE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4D"><unientity>ACE7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4E"><unientity>ACE8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 4F"><unientity>ACEA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 50"><unientity>ACEC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 51"><unientity>ACEF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 52"><unientity>ACF0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 53"><unientity>ACF1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 54"><unientity>ACF3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 55"><unientity>ACF5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 56"><unientity>ACF6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 57"><unientity>ACFA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 58"><unientity>ACFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 59"><unientity>ACFD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5A"><unientity>AD00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5B"><unientity>AD04</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5C"><unientity>AD0C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5D"><unientity>AD0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5E"><unientity>AD0F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 5F"><unientity>AD11</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 60"><unientity>AD18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 61"><unientity>AD19</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 62"><unientity>AD1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 63"><unientity>AD20</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 64"><unientity>AD28</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 65"><unientity>AD29</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 66"><unientity>AD2D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 67"><unientity>AD34</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 68"><unientity>AD38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 69"><unientity>AD3C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 6A"><unientity>AD44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 6C"><unientity>AD49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 6D"><unientity>AD50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 6E"><unientity>AD6C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 6F"><unientity>AD6D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 70"><unientity>AD70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 71"><unientity>AD73</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 72"><unientity>AD74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 73"><unientity>AD75</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 74"><unientity>AD76</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 75"><unientity>AD7C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 76"><unientity>AD7D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 77"><unientity>AD7F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 78"><unientity>AD81</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 79"><unientity>AD82</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 7A"><unientity>AD88</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 7B"><unientity>AD8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 7C"><unientity>AD90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 49 7E"><unientity>ADA4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 22"><unientity>ADC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 23"><unientity>ADC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 24"><unientity>ADC8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 25"><unientity>ADD0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 26"><unientity>ADD1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 27"><unientity>ADD3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 28"><unientity>ADDC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 29"><unientity>ADE0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2A"><unientity>ADE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2B"><unientity>ADEC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2C"><unientity>ADF8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2D"><unientity>ADF9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2E"><unientity>ADFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 2F"><unientity>ADFF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 30"><unientity>AE00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 31"><unientity>AE01</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 32"><unientity>AE08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 33"><unientity>AE09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 34"><unientity>AE0B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 35"><unientity>AE0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 36"><unientity>AE30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 37"><unientity>AE31</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 38"><unientity>AE34</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 39"><unientity>AE37</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3A"><unientity>AE38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3B"><unientity>AE40</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3C"><unientity>AE41</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3D"><unientity>AE43</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3E"><unientity>AE44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 3F"><unientity>AE45</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 40"><unientity>AE4A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 43"><unientity>AE4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 44"><unientity>AE4D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 45"><unientity>AE4E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 46"><unientity>AE50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 47"><unientity>AE54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 48"><unientity>AE5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 49"><unientity>AE5D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4A"><unientity>AE60</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4B"><unientity>AE61</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4C"><unientity>AE62</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4D"><unientity>AE65</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4E"><unientity>AE68</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 4F"><unientity>AE69</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 50"><unientity>AE6C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 51"><unientity>AE70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 52"><unientity>AE78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 53"><unientity>AE79</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 54"><unientity>AE7B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 55"><unientity>AE7C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 56"><unientity>AE7D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 57"><unientity>AE84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 58"><unientity>AE85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 59"><unientity>AEBC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5A"><unientity>AEBD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5B"><unientity>AEBE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5C"><unientity>AEC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5D"><unientity>AEC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5E"><unientity>AECC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 5F"><unientity>AECD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 60"><unientity>AECF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 61"><unientity>AED0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 62"><unientity>AED1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 63"><unientity>AED8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 64"><unientity>AEDC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 65"><unientity>AEF4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 66"><unientity>AF0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 67"><unientity>AF2C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 68"><unientity>AF2D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 69"><unientity>AF30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6A"><unientity>AF34</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6B"><unientity>AF3C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6C"><unientity>AF3D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6D"><unientity>AF3F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6E"><unientity>AF41</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 6F"><unientity>AF42</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 70"><unientity>AF43</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 71"><unientity>AF48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 72"><unientity>AF49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 73"><unientity>AF4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 74"><unientity>AF58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 75"><unientity>AF5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 76"><unientity>AF5D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 77"><unientity>AF64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 78"><unientity>AF65</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 79"><unientity>AF79</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 7A"><unientity>AF80</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 7B"><unientity>AF84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 7C"><unientity>AF88</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 7D"><unientity>AF90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4A 7E"><unientity>AF95</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 21"><unientity>AF9C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 22"><unientity>AFB8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 23"><unientity>AFB9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 24"><unientity>AFBC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 25"><unientity>AFC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 26"><unientity>AFC7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 27"><unientity>AFC8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 28"><unientity>AFC9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 29"><unientity>AFCB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2A"><unientity>AFCD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2B"><unientity>AFCE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2C"><unientity>AFD4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2D"><unientity>AFD8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2E"><unientity>AFE9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 2F"><unientity>AFF0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 30"><unientity>B000</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 32"><unientity>B00C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 33"><unientity>B00D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 34"><unientity>B010</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 35"><unientity>B014</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 36"><unientity>B01C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 37"><unientity>B01D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 38"><unientity>B028</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 39"><unientity>B044</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3A"><unientity>B045</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3B"><unientity>B048</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3C"><unientity>B04A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3D"><unientity>B04C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3E"><unientity>B053</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 3F"><unientity>B054</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 40"><unientity>B055</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 41"><unientity>B057</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 42"><unientity>B059</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 43"><unientity>B05D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 44"><unientity>B07C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 45"><unientity>B07D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 46"><unientity>B080</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 47"><unientity>B084</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 48"><unientity>B08C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 49"><unientity>B08D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 4A"><unientity>B08F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 4B"><unientity>B090</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 4C"><unientity>B091</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 4F"><unientity>B098</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 50"><unientity>B099</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 51"><unientity>B09A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 52"><unientity>B09C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 53"><unientity>B09F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 54"><unientity>B0A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 55"><unientity>B0A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 56"><unientity>B0A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 57"><unientity>B0A9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 58"><unientity>B0AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 59"><unientity>B0AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5A"><unientity>B0AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5B"><unientity>B0AE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5C"><unientity>B0AF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5D"><unientity>B0B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5E"><unientity>B0B3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 5F"><unientity>B0B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 60"><unientity>B0B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 61"><unientity>B0B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 62"><unientity>B0BB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 63"><unientity>B0BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 64"><unientity>B0C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 65"><unientity>B0C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 66"><unientity>B0C7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 67"><unientity>B0C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 68"><unientity>B0C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 69"><unientity>B0D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6A"><unientity>B0D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6B"><unientity>B0E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6C"><unientity>B0E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6D"><unientity>B0EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6E"><unientity>B108</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 6F"><unientity>B109</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 71"><unientity>B10B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 72"><unientity>B10C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 73"><unientity>B10F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 74"><unientity>B110</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 75"><unientity>B113</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 76"><unientity>B118</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 77"><unientity>B119</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 78"><unientity>B11B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 79"><unientity>B11C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 7A"><unientity>B11D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 7B"><unientity>B11E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 7C"><unientity>B123</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 7D"><unientity>B124</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4B 7E"><unientity>B125</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 21"><unientity>B128</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 22"><unientity>B12C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 23"><unientity>B134</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 24"><unientity>B135</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 25"><unientity>B137</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 26"><unientity>B140</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 27"><unientity>B141</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 28"><unientity>B144</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 29"><unientity>B150</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2A"><unientity>B151</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2B"><unientity>B153</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2C"><unientity>B154</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2D"><unientity>B155</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2E"><unientity>B158</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 2F"><unientity>B15C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 30"><unientity>B178</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 31"><unientity>B179</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 32"><unientity>B17A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 33"><unientity>B17C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 34"><unientity>B180</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 35"><unientity>B188</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 36"><unientity>B189</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 37"><unientity>B18B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 38"><unientity>B18D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 39"><unientity>B192</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3A"><unientity>B193</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3B"><unientity>B194</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3C"><unientity>B1A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3D"><unientity>B1CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3E"><unientity>B1D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 3F"><unientity>B1D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 40"><unientity>B1DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 41"><unientity>B1E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 42"><unientity>B1FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 43"><unientity>B204</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 44"><unientity>B205</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 45"><unientity>B208</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 46"><unientity>B20B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 47"><unientity>B20C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 48"><unientity>B213</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 49"><unientity>B214</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4A"><unientity>B215</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4B"><unientity>B217</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4C"><unientity>B220</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4D"><unientity>B233</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4E"><unientity>B234</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 4F"><unientity>B258</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 50"><unientity>B25C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 51"><unientity>B260</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 52"><unientity>B268</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 53"><unientity>B269</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 54"><unientity>B274</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 55"><unientity>B284</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 56"><unientity>B289</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 57"><unientity>B290</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 58"><unientity>B291</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 59"><unientity>B294</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5A"><unientity>B298</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5B"><unientity>B299</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5C"><unientity>B2A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5D"><unientity>B2A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5E"><unientity>B2A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 5F"><unientity>B2A6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 60"><unientity>B2AA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 61"><unientity>B2AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 62"><unientity>B2C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 63"><unientity>B2C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 64"><unientity>B2CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 65"><unientity>B2D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 66"><unientity>B2D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 67"><unientity>B2D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 68"><unientity>B2DB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 69"><unientity>B2DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 6A"><unientity>B2E2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 6D"><unientity>B2E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 6E"><unientity>B2E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 6F"><unientity>B2E6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 70"><unientity>B2E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 71"><unientity>B2EB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 72"><unientity>B2EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 73"><unientity>B2ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 74"><unientity>B2EE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 75"><unientity>B2F3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 76"><unientity>B2F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 77"><unientity>B2F5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 78"><unientity>B2F7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 79"><unientity>B2F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 7A"><unientity>B2FA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 7B"><unientity>B2FB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 7C"><unientity>B2FF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 7D"><unientity>B300</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4C 7E"><unientity>B301</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 21"><unientity>B304</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 22"><unientity>B308</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 23"><unientity>B310</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 24"><unientity>B311</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 25"><unientity>B313</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 26"><unientity>B314</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 27"><unientity>B315</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 28"><unientity>B354</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 29"><unientity>B355</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2A"><unientity>B358</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2B"><unientity>B35B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2C"><unientity>B35C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2D"><unientity>B35F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2E"><unientity>B364</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 2F"><unientity>B365</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 30"><unientity>B367</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 31"><unientity>B368</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 32"><unientity>B369</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 33"><unientity>B36A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 34"><unientity>B36B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 35"><unientity>B36E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 36"><unientity>B370</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 37"><unientity>B371</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 38"><unientity>B374</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 39"><unientity>B378</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3A"><unientity>B380</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3B"><unientity>B383</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3C"><unientity>B385</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3D"><unientity>B38C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3E"><unientity>B3C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 3F"><unientity>B3C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 40"><unientity>B3C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 41"><unientity>B3CB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 42"><unientity>B3CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 43"><unientity>B3D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 44"><unientity>B3D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 45"><unientity>B3D5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 46"><unientity>B3D7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 47"><unientity>B3D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 48"><unientity>B3DB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 49"><unientity>B3FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4A"><unientity>B400</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4B"><unientity>B410</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4C"><unientity>B418</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4D"><unientity>B41C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4E"><unientity>B420</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 4F"><unientity>B428</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 50"><unientity>B429</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 51"><unientity>B42B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 52"><unientity>B42C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 53"><unientity>B450</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 54"><unientity>B451</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 55"><unientity>B454</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 56"><unientity>B458</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 57"><unientity>B460</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 58"><unientity>B461</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 59"><unientity>B463</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5A"><unientity>B465</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5B"><unientity>B46C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5C"><unientity>B480</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5D"><unientity>B488</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5E"><unientity>B4A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 5F"><unientity>B4B7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 60"><unientity>B4C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 61"><unientity>B4D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 62"><unientity>B4DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 63"><unientity>B4DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 64"><unientity>B4E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 65"><unientity>B4E3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 66"><unientity>B4E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 67"><unientity>B4EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 68"><unientity>B4ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 69"><unientity>B4EF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6A"><unientity>B4F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6B"><unientity>B514</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6C"><unientity>B515</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6D"><unientity>B518</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6E"><unientity>B51B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 6F"><unientity>B51C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 70"><unientity>B524</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 71"><unientity>B525</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 72"><unientity>B527</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 73"><unientity>B528</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 74"><unientity>B529</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 75"><unientity>B52A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 78"><unientity>B530</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 79"><unientity>B531</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 7A"><unientity>B532</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 7B"><unientity>B534</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 7C"><unientity>B537</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4D 7D"><unientity>B538</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 21"><unientity>B540</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 22"><unientity>B541</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 23"><unientity>B543</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 24"><unientity>B544</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 25"><unientity>B545</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 26"><unientity>B54B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 27"><unientity>B54C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 28"><unientity>B54D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 29"><unientity>B550</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2A"><unientity>B554</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2B"><unientity>B55C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2C"><unientity>B55D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2D"><unientity>B55F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2E"><unientity>B560</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 2F"><unientity>B561</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 30"><unientity>B5A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 31"><unientity>B5A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 32"><unientity>B5A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 33"><unientity>B5A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 34"><unientity>B5AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 35"><unientity>B5B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 36"><unientity>B5B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 37"><unientity>B5B3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 38"><unientity>B5B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 39"><unientity>B5B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3A"><unientity>B5BB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3B"><unientity>B5BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3C"><unientity>B5C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3D"><unientity>B5C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3E"><unientity>B5CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 3F"><unientity>B5CF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 40"><unientity>B5D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 41"><unientity>B610</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 42"><unientity>B611</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 43"><unientity>B614</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 44"><unientity>B618</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 45"><unientity>B625</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 46"><unientity>B664</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 47"><unientity>B69C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 48"><unientity>B69D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 49"><unientity>B6A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4A"><unientity>B6AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4B"><unientity>B6AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4C"><unientity>B6B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4D"><unientity>B6F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4E"><unientity>B6F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 4F"><unientity>B6F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 50"><unientity>B700</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 51"><unientity>B701</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 52"><unientity>B728</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 53"><unientity>B729</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 54"><unientity>B72C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 55"><unientity>B72F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 56"><unientity>B730</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 57"><unientity>B738</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 58"><unientity>B739</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 59"><unientity>B73B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5A"><unientity>B744</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5B"><unientity>B748</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5C"><unientity>B760</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5D"><unientity>B764</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5E"><unientity>B768</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 5F"><unientity>B770</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 60"><unientity>B771</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 61"><unientity>B775</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 64"><unientity>B77C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 65"><unientity>B77D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 66"><unientity>B780</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 67"><unientity>B784</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 68"><unientity>B78C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 69"><unientity>B78D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6A"><unientity>B78F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6B"><unientity>B790</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6C"><unientity>B791</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6D"><unientity>B797</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6E"><unientity>B798</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 6F"><unientity>B799</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 70"><unientity>B79C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 71"><unientity>B7A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 72"><unientity>B7A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 73"><unientity>B7A9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 74"><unientity>B7AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 75"><unientity>B7AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 76"><unientity>B7AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 77"><unientity>B7B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 78"><unientity>B7B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 79"><unientity>B7C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 7A"><unientity>B7EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 7B"><unientity>B7ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 7C"><unientity>B7F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 7D"><unientity>B7F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4E 7E"><unientity>B7FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 21"><unientity>B7FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 22"><unientity>B7FF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 23"><unientity>B800</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 24"><unientity>B801</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 25"><unientity>B807</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 26"><unientity>B808</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 27"><unientity>B809</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 28"><unientity>B80C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 29"><unientity>B810</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2A"><unientity>B818</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2B"><unientity>B819</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2C"><unientity>B81B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2D"><unientity>B81D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2E"><unientity>B824</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 2F"><unientity>B825</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 30"><unientity>B828</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 31"><unientity>B82C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 32"><unientity>B834</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 33"><unientity>B835</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 34"><unientity>B837</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 35"><unientity>B838</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 36"><unientity>B839</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 37"><unientity>B840</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 38"><unientity>B85C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 39"><unientity>B85D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3A"><unientity>B860</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3B"><unientity>B864</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3C"><unientity>B86C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3D"><unientity>B86D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3E"><unientity>B86F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 3F"><unientity>B871</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 40"><unientity>B8B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 41"><unientity>B8CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 42"><unientity>B8E1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 43"><unientity>B8E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 44"><unientity>B8E9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 45"><unientity>B8EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 46"><unientity>B8F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 47"><unientity>B8F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 48"><unientity>B8F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 49"><unientity>B8FB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4A"><unientity>B8FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4B"><unientity>B904</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4C"><unientity>B93C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4D"><unientity>B958</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4E"><unientity>B959</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 4F"><unientity>B95C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 50"><unientity>B960</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 51"><unientity>B968</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 52"><unientity>B96D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 53"><unientity>B974</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 54"><unientity>B975</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 55"><unientity>B978</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 56"><unientity>B97C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 57"><unientity>B984</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 58"><unientity>B985</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 59"><unientity>B987</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5A"><unientity>B989</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5B"><unientity>B98E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5C"><unientity>B9AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5D"><unientity>B9AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5E"><unientity>B9B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 5F"><unientity>B9B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 60"><unientity>B9BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 61"><unientity>B9BD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 62"><unientity>B9BF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 63"><unientity>B9C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 66"><unientity>B9C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 67"><unientity>B9C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 68"><unientity>B9CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 69"><unientity>B9CE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6A"><unientity>B9CF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6B"><unientity>B9D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6C"><unientity>B9D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6D"><unientity>B9D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6E"><unientity>B9D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 6F"><unientity>B9DB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 70"><unientity>B9DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 71"><unientity>B9DE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 72"><unientity>B9E1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 73"><unientity>B9E3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 74"><unientity>B9E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 75"><unientity>B9E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 76"><unientity>B9E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 77"><unientity>B9EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 78"><unientity>B9F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 79"><unientity>B9F5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 7A"><unientity>B9F7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 7B"><unientity>B9F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 7C"><unientity>B9F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 7D"><unientity>B9FA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 4F 7E"><unientity>BA00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 21"><unientity>BA38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 22"><unientity>BA39</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 23"><unientity>BA3C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 24"><unientity>BA40</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 25"><unientity>BA48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 26"><unientity>BA49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 27"><unientity>BA4B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 28"><unientity>BA4D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 29"><unientity>BA4E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2A"><unientity>BA53</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2B"><unientity>BA54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2C"><unientity>BA55</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2D"><unientity>BA58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2E"><unientity>BA5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 2F"><unientity>BA64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 30"><unientity>BA65</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 31"><unientity>BA67</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 32"><unientity>BA70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 33"><unientity>BA71</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 34"><unientity>BA74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 35"><unientity>BA78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 36"><unientity>BA83</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 37"><unientity>BA84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 38"><unientity>BA85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 39"><unientity>BA87</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3A"><unientity>BAA8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3B"><unientity>BAA9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3C"><unientity>BAAB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3D"><unientity>BAAC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3E"><unientity>BAB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 3F"><unientity>BAB8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 40"><unientity>BAB9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 41"><unientity>BABB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 42"><unientity>BABD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 43"><unientity>BAC3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 44"><unientity>BAFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 45"><unientity>BB0F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 46"><unientity>BB18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 47"><unientity>BB34</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 48"><unientity>BB35</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 49"><unientity>BB36</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4A"><unientity>BB38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4B"><unientity>BB3B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4C"><unientity>BB3C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4D"><unientity>BB3D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4E"><unientity>BB44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 4F"><unientity>BB47</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 50"><unientity>BB49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 51"><unientity>BB4D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 52"><unientity>BB4F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 53"><unientity>BB50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 54"><unientity>BB54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 55"><unientity>BB58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 56"><unientity>BB61</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 57"><unientity>BB63</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 58"><unientity>BB88</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 59"><unientity>BB8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5A"><unientity>BBA4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5B"><unientity>BBC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5C"><unientity>BBC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5D"><unientity>BBC8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5E"><unientity>BBD0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 5F"><unientity>BBF8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 60"><unientity>BBF9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 61"><unientity>BBFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 62"><unientity>BBFF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 63"><unientity>BC00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 64"><unientity>BC08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 65"><unientity>BC09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 66"><unientity>BC0B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 68"><unientity>BC0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 69"><unientity>BC0F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 6A"><unientity>BC11</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 6B"><unientity>BBB4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 6D"><unientity>BC14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 6E"><unientity>BC15</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 6F"><unientity>BC16</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 70"><unientity>BC18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 71"><unientity>BC1B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 72"><unientity>BC1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 73"><unientity>BC1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 74"><unientity>BC1F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 75"><unientity>BC24</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 76"><unientity>BC25</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 77"><unientity>BC27</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 78"><unientity>BC29</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 79"><unientity>BC2D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 7A"><unientity>BC30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 7B"><unientity>BC31</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 7C"><unientity>BC34</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 7D"><unientity>BC37</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 50 7E"><unientity>BC38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 21"><unientity>BC40</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 22"><unientity>BC41</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 23"><unientity>BC43</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 24"><unientity>BC44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 25"><unientity>BC45</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 26"><unientity>BC84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 27"><unientity>BC85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 28"><unientity>BC88</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 29"><unientity>BC8B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2A"><unientity>BC8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2B"><unientity>BC94</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2C"><unientity>BC95</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2D"><unientity>BC97</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2E"><unientity>BC98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 2F"><unientity>BC99</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 30"><unientity>BC9A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 31"><unientity>BCA0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 32"><unientity>BCA1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 33"><unientity>BCA4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 34"><unientity>BCA7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 35"><unientity>BCA8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 36"><unientity>BCB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 37"><unientity>BCB1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 38"><unientity>BCB3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 39"><unientity>BCB5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3A"><unientity>BCBC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3B"><unientity>BCBD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3C"><unientity>BCC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3D"><unientity>BCC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3E"><unientity>BCCC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 3F"><unientity>BCCD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 40"><unientity>BCCF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 41"><unientity>BCD0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 42"><unientity>BCD1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 43"><unientity>BCD2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 44"><unientity>BCD5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 45"><unientity>BCF4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 46"><unientity>BCF5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 47"><unientity>BCF6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 48"><unientity>BCF8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 49"><unientity>BCFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4A"><unientity>BD04</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4B"><unientity>BD05</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4C"><unientity>BD07</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4D"><unientity>BD09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4E"><unientity>BD10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 4F"><unientity>BD14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 50"><unientity>BD24</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 51"><unientity>BD48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 52"><unientity>BD49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 53"><unientity>BD4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 54"><unientity>BD50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 55"><unientity>BD58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 56"><unientity>BD59</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 57"><unientity>BD64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 58"><unientity>BD80</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 59"><unientity>BD81</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5A"><unientity>BD84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5B"><unientity>BD87</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5C"><unientity>BD88</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5D"><unientity>BD89</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5E"><unientity>BD90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 5F"><unientity>BD91</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 60"><unientity>BD93</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 61"><unientity>BD95</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 62"><unientity>BD99</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 63"><unientity>BD9C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 64"><unientity>BDD4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 65"><unientity>BDF0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 66"><unientity>BE0C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 67"><unientity>BE0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 68"><unientity>BE10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 69"><unientity>BE14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6A"><unientity>BE1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6B"><unientity>BE1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6C"><unientity>BE1F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6D"><unientity>BE44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6E"><unientity>BE45</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 6F"><unientity>BE48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 70"><unientity>BE4B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 71"><unientity>BE4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 72"><unientity>BE4E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 73"><unientity>BE54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 74"><unientity>BE55</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 75"><unientity>BE57</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 76"><unientity>BE59</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 77"><unientity>BE5A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 78"><unientity>BE5B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 7B"><unientity>BE60</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 7C"><unientity>BE61</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 7D"><unientity>BE64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 51 7E"><unientity>BE68</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 21"><unientity>BE70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 22"><unientity>BE71</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 23"><unientity>BE73</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 24"><unientity>BE74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 25"><unientity>BE75</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 26"><unientity>BE7B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 27"><unientity>BE7C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 28"><unientity>BE7D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 29"><unientity>BE80</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2A"><unientity>BE84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2B"><unientity>BE8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2C"><unientity>BE8F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2D"><unientity>BE90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2E"><unientity>BE91</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 2F"><unientity>BE98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 30"><unientity>BEA8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 31"><unientity>BED0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 32"><unientity>BED1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 33"><unientity>BED4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 34"><unientity>BED7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 35"><unientity>BED8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 36"><unientity>BEE0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 37"><unientity>BEE3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 38"><unientity>BEE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 39"><unientity>BEE5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3A"><unientity>BEEC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3B"><unientity>BF08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3C"><unientity>BF09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3D"><unientity>BF18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3E"><unientity>BF1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 3F"><unientity>BF40</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 40"><unientity>BF41</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 41"><unientity>BF44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 42"><unientity>BF48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 43"><unientity>BF50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 44"><unientity>BF51</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 45"><unientity>BF55</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 46"><unientity>BFB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 47"><unientity>BFC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 48"><unientity>BFC5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 49"><unientity>BFCC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4A"><unientity>BFCD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4B"><unientity>BFD0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4C"><unientity>BFD4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4D"><unientity>BFDC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4E"><unientity>BFDD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 4F"><unientity>BFE1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 50"><unientity>C058</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 51"><unientity>C059</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 52"><unientity>C05C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 53"><unientity>C060</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 54"><unientity>C068</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 55"><unientity>C069</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 56"><unientity>C090</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 57"><unientity>C091</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 58"><unientity>C094</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 59"><unientity>C098</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 5A"><unientity>C0A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 5B"><unientity>C0A3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 5C"><unientity>C0A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 5F"><unientity>C0AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 60"><unientity>C0AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 61"><unientity>C0AE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 62"><unientity>C0AF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 63"><unientity>C0B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 64"><unientity>C0B3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 65"><unientity>C0B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 66"><unientity>C0B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 67"><unientity>C0B6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 68"><unientity>C0BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 69"><unientity>C0BD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6A"><unientity>C0BF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6B"><unientity>C0C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6C"><unientity>C0C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6D"><unientity>C0C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6E"><unientity>C0C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 6F"><unientity>C0C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 70"><unientity>C0CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 71"><unientity>C0CF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 72"><unientity>C0D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 73"><unientity>C0D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 74"><unientity>C0D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 75"><unientity>C0DB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 76"><unientity>C0DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 77"><unientity>C0DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 78"><unientity>C0E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 79"><unientity>C0E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 7A"><unientity>C0E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 7B"><unientity>C0EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 7C"><unientity>C0F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 7D"><unientity>C0F7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 52 7E"><unientity>C0F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 21"><unientity>C11C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 22"><unientity>C11D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 23"><unientity>C11E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 24"><unientity>C120</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 25"><unientity>C123</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 26"><unientity>C124</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 27"><unientity>C125</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 28"><unientity>C126</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 29"><unientity>C127</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2A"><unientity>C12A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2B"><unientity>C12C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2C"><unientity>C12D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2D"><unientity>C12F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2E"><unientity>C130</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 2F"><unientity>C131</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 30"><unientity>C136</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 31"><unientity>C138</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 32"><unientity>C139</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 33"><unientity>C13C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 34"><unientity>C140</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 35"><unientity>C148</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 36"><unientity>C149</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 37"><unientity>C14B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 38"><unientity>C14D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 39"><unientity>C151</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3A"><unientity>C154</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3B"><unientity>C158</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3C"><unientity>C167</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3D"><unientity>C168</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3E"><unientity>C170</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 3F"><unientity>C18C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 40"><unientity>C18D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 41"><unientity>C18E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 42"><unientity>C190</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 43"><unientity>C194</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 44"><unientity>C19C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 45"><unientity>C19D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 46"><unientity>C19F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 47"><unientity>C1A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 48"><unientity>C1A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 49"><unientity>C1A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4A"><unientity>C1A9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4B"><unientity>C1B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4C"><unientity>C1C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4D"><unientity>C1C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4E"><unientity>C1D7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 4F"><unientity>C1E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 50"><unientity>C1E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 51"><unientity>C1E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 52"><unientity>C1F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 53"><unientity>C1F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 54"><unientity>C1F3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 55"><unientity>C1FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 56"><unientity>C1FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 57"><unientity>C200</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 58"><unientity>C204</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 59"><unientity>C20D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 5B"><unientity>C218</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 5C"><unientity>C219</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 5D"><unientity>C21C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 5E"><unientity>C21F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 5F"><unientity>C220</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 60"><unientity>C228</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 61"><unientity>C229</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 62"><unientity>C22B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 63"><unientity>C22D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 64"><unientity>C22F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 65"><unientity>C231</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 66"><unientity>C232</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 67"><unientity>C234</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 68"><unientity>C250</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 69"><unientity>C258</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6A"><unientity>C26C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6B"><unientity>C270</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6C"><unientity>C274</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6D"><unientity>C27C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6E"><unientity>C27D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 6F"><unientity>C27F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 70"><unientity>C281</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 71"><unientity>C288</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 72"><unientity>C289</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 73"><unientity>C290</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 74"><unientity>C298</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 75"><unientity>C29B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 76"><unientity>C29D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 77"><unientity>C2A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 78"><unientity>C2A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 79"><unientity>C2A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 7A"><unientity>C2AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 7B"><unientity>C2AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 7D"><unientity>C2B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 53 7E"><unientity>C2B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 21"><unientity>C2B7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 22"><unientity>C2B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 23"><unientity>C2DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 24"><unientity>C2DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 25"><unientity>C2E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 26"><unientity>C2E3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 27"><unientity>C2E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 28"><unientity>C2EB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 29"><unientity>C2EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 2A"><unientity>C2ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 2B"><unientity>C2EF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 2C"><unientity>C2F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 2D"><unientity>C2F6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 30"><unientity>C2F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 31"><unientity>C2F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 32"><unientity>C2FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 33"><unientity>C300</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 34"><unientity>C308</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 35"><unientity>C309</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 36"><unientity>C30B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 37"><unientity>C30C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 38"><unientity>C30D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 39"><unientity>C313</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3A"><unientity>C314</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3B"><unientity>C315</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3C"><unientity>C318</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3D"><unientity>C31C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3E"><unientity>C324</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 3F"><unientity>C327</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 40"><unientity>C328</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 41"><unientity>C329</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 42"><unientity>C330</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 43"><unientity>C343</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 44"><unientity>C345</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 45"><unientity>C368</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 46"><unientity>C369</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 47"><unientity>C36C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 48"><unientity>C370</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 49"><unientity>C372</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4A"><unientity>C378</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4B"><unientity>C379</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4C"><unientity>C37C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4D"><unientity>C37D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4E"><unientity>C384</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 4F"><unientity>C388</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 50"><unientity>C399</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 51"><unientity>C3D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 52"><unientity>C3D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 53"><unientity>C3DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 54"><unientity>C3DF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 55"><unientity>C3E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 56"><unientity>C3E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 57"><unientity>C3ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 58"><unientity>C3F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 59"><unientity>C3F5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5A"><unientity>C410</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5B"><unientity>C42C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5C"><unientity>C430</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5D"><unientity>C434</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5E"><unientity>C43C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 5F"><unientity>C43F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 60"><unientity>C464</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 61"><unientity>C465</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 62"><unientity>C468</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 63"><unientity>C46C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 64"><unientity>C474</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 65"><unientity>C479</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 66"><unientity>C480</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 67"><unientity>C494</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 68"><unientity>C4D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 69"><unientity>C4D5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6A"><unientity>C4F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6B"><unientity>C4F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6C"><unientity>C4F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6D"><unientity>C4F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6E"><unientity>C500</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 6F"><unientity>C501</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 70"><unientity>C50C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 71"><unientity>C510</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 72"><unientity>C528</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 73"><unientity>C529</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 74"><unientity>C52C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 75"><unientity>C530</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 76"><unientity>C538</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 77"><unientity>C539</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 78"><unientity>C53B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 79"><unientity>C53D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 7C"><unientity>C544</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 7D"><unientity>C545</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 54 7E"><unientity>C548</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 21"><unientity>C549</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 22"><unientity>C54A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 23"><unientity>C54C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 24"><unientity>C54E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 25"><unientity>C553</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 26"><unientity>C554</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 27"><unientity>C555</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 28"><unientity>C557</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 29"><unientity>C558</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2A"><unientity>C559</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2B"><unientity>C55E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2C"><unientity>C55F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2D"><unientity>C560</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2E"><unientity>C561</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 2F"><unientity>C564</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 30"><unientity>C568</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 31"><unientity>C570</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 32"><unientity>C571</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 33"><unientity>C573</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 34"><unientity>C574</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 35"><unientity>C575</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 36"><unientity>C57C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 37"><unientity>C57D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 38"><unientity>C580</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 39"><unientity>C584</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3A"><unientity>C587</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3B"><unientity>C58C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3C"><unientity>C58D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3D"><unientity>C58F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3E"><unientity>C590</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 3F"><unientity>C591</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 40"><unientity>C595</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 41"><unientity>C597</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 42"><unientity>C598</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 43"><unientity>C59C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 44"><unientity>C5B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 45"><unientity>C5B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 46"><unientity>C5B6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 47"><unientity>C5B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 48"><unientity>C5B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 49"><unientity>C5BA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4A"><unientity>C5BB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4B"><unientity>C5BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4C"><unientity>C5BD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4D"><unientity>C5C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4E"><unientity>C5C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 4F"><unientity>C5C6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 50"><unientity>C5C7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 51"><unientity>C5C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 52"><unientity>C5C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 53"><unientity>C5CA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 54"><unientity>C5CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 55"><unientity>C5CE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 56"><unientity>C5D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 57"><unientity>C5D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 58"><unientity>C5D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 59"><unientity>C5D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5A"><unientity>C5E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5B"><unientity>C5E1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5C"><unientity>C5E3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5D"><unientity>C5E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5E"><unientity>C5EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 5F"><unientity>C5ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 60"><unientity>C5EE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 61"><unientity>C5F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 62"><unientity>C5F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 63"><unientity>C5F6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 64"><unientity>C5F7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 65"><unientity>C5FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 66"><unientity>C5FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 67"><unientity>C5FE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 68"><unientity>C5FF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 69"><unientity>C600</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6A"><unientity>C601</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6B"><unientity>C606</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6C"><unientity>C607</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6D"><unientity>C608</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6E"><unientity>C60C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 6F"><unientity>C610</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 70"><unientity>C61B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 71"><unientity>C624</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 72"><unientity>C625</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 73"><unientity>C628</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 74"><unientity>C62C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 75"><unientity>C62D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 76"><unientity>C62E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 77"><unientity>C633</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 78"><unientity>C634</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 79"><unientity>C635</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 7A"><unientity>C637</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 7B"><unientity>C639</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 7C"><unientity>C63A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 7D"><unientity>C63B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 55 7E"><unientity>C640</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 21"><unientity>C641</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 22"><unientity>C644</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 23"><unientity>C648</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 24"><unientity>C650</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 25"><unientity>C651</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 26"><unientity>C653</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 27"><unientity>C654</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 29"><unientity>C65C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2A"><unientity>C65D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2B"><unientity>C660</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2C"><unientity>C671</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2D"><unientity>C678</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2E"><unientity>C679</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 2F"><unientity>C67C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 30"><unientity>C680</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 31"><unientity>C688</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 32"><unientity>C68B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 33"><unientity>C68D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 34"><unientity>C694</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 35"><unientity>C695</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 36"><unientity>C698</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 37"><unientity>C6A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 38"><unientity>C6A7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 39"><unientity>C6A9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3A"><unientity>C6B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3B"><unientity>C6B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3C"><unientity>C6B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3D"><unientity>C6B7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3E"><unientity>C6B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 3F"><unientity>C6B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 40"><unientity>C6BA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 41"><unientity>C6C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 42"><unientity>C6C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 43"><unientity>C6C3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 44"><unientity>C6C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 45"><unientity>C6CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 46"><unientity>C6CD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 47"><unientity>C6D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 48"><unientity>C6D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 49"><unientity>C6DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4A"><unientity>C6DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4B"><unientity>C6DF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4C"><unientity>C6E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4D"><unientity>C6E1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4E"><unientity>C6E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 4F"><unientity>C6E9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 50"><unientity>C6EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 51"><unientity>C6F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 52"><unientity>C6F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 53"><unientity>C704</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 54"><unientity>C705</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 55"><unientity>C708</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 56"><unientity>C70C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 57"><unientity>C714</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 58"><unientity>C717</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 59"><unientity>C719</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5A"><unientity>C720</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5B"><unientity>C721</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5C"><unientity>C724</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5D"><unientity>C728</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5E"><unientity>C730</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 5F"><unientity>C735</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 60"><unientity>C737</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 61"><unientity>C73C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 62"><unientity>C73D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 63"><unientity>C740</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 64"><unientity>C744</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 65"><unientity>C74A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 66"><unientity>C74C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 67"><unientity>C74D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 68"><unientity>C751</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 69"><unientity>C758</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6A"><unientity>C774</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6B"><unientity>C775</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6C"><unientity>C778</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6D"><unientity>C77C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6E"><unientity>C77D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 6F"><unientity>C783</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 70"><unientity>C784</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 71"><unientity>C785</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 72"><unientity>C787</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 73"><unientity>C788</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 74"><unientity>C789</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 75"><unientity>C78A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 76"><unientity>C78E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 77"><unientity>C655</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 79"><unientity>C790</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 7A"><unientity>C791</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 7B"><unientity>C794</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 7C"><unientity>C796</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 7D"><unientity>C798</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 56 7E"><unientity>C7A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 21"><unientity>C7A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 22"><unientity>C7A3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 23"><unientity>C7A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 24"><unientity>C7A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 25"><unientity>C7A6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 26"><unientity>C7A7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 27"><unientity>C7AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 28"><unientity>C7AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 29"><unientity>C7B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2A"><unientity>C7B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2B"><unientity>C7BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2C"><unientity>C7BD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2D"><unientity>C7BF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2E"><unientity>C7C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 2F"><unientity>C7C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 30"><unientity>C7C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 31"><unientity>C7C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 32"><unientity>C7CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 33"><unientity>C7D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 34"><unientity>C800</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 35"><unientity>C801</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 36"><unientity>C804</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 37"><unientity>C808</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 38"><unientity>C80A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 39"><unientity>C810</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3A"><unientity>C811</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3B"><unientity>C813</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3C"><unientity>C814</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3D"><unientity>C815</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3E"><unientity>C816</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 3F"><unientity>C81C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 40"><unientity>C81D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 41"><unientity>C820</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 42"><unientity>C824</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 43"><unientity>C82C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 44"><unientity>C82D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 45"><unientity>C82F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 46"><unientity>C838</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 47"><unientity>C83C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 48"><unientity>C84C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 49"><unientity>C870</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4A"><unientity>C871</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4B"><unientity>C874</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4C"><unientity>C878</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4D"><unientity>C87A</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4E"><unientity>C880</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 4F"><unientity>C881</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 50"><unientity>C885</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 51"><unientity>C886</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 52"><unientity>C887</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 53"><unientity>C88B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 54"><unientity>C88C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 55"><unientity>C88D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 56"><unientity>C890</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 57"><unientity>C894</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 58"><unientity>C89C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 59"><unientity>C89D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 5A"><unientity>C89F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 5B"><unientity>C8A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 5D"><unientity>C8A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 5E"><unientity>C8AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 5F"><unientity>C8B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 60"><unientity>C8B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 61"><unientity>C8C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 62"><unientity>C8C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 63"><unientity>C8CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 64"><unientity>C8D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 65"><unientity>C8D5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 66"><unientity>C8D7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 67"><unientity>C8E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 68"><unientity>C8E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 69"><unientity>C8F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6A"><unientity>C8F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6B"><unientity>C8F5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6C"><unientity>C8FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6D"><unientity>C8FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6E"><unientity>C900</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 6F"><unientity>C904</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 70"><unientity>C906</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 71"><unientity>C90C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 72"><unientity>C90D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 73"><unientity>C90F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 74"><unientity>C911</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 75"><unientity>C918</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 76"><unientity>C92C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 77"><unientity>C950</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 79"><unientity>C954</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 7A"><unientity>C958</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 7B"><unientity>C960</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 7C"><unientity>C961</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 7D"><unientity>C96C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 57 7E"><unientity>C970</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 21"><unientity>C974</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 22"><unientity>C988</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 23"><unientity>C989</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 24"><unientity>C98C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 25"><unientity>C990</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 26"><unientity>C998</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 27"><unientity>C999</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 28"><unientity>C99D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 29"><unientity>C9C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2A"><unientity>C9C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2B"><unientity>C9C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2C"><unientity>C9C7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2D"><unientity>C9C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2E"><unientity>C9CA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 2F"><unientity>C9D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 30"><unientity>C9D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 31"><unientity>C9D3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 32"><unientity>C9D5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 33"><unientity>C9D6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 34"><unientity>C9D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 35"><unientity>C9DA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 38"><unientity>C9DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 39"><unientity>C9DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 3A"><unientity>C9E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 3B"><unientity>C9E2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 3C"><unientity>C9E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 3E"><unientity>C9E7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 3F"><unientity>C9EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 40"><unientity>C9ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 41"><unientity>C9EF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 42"><unientity>C9F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 43"><unientity>C9F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 44"><unientity>C9F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 45"><unientity>C9F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 46"><unientity>C9FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 47"><unientity>CA00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 48"><unientity>CA08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 49"><unientity>CA09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4A"><unientity>CA0B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4B"><unientity>CA0C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4C"><unientity>CA0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4D"><unientity>CA18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4E"><unientity>CA4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 4F"><unientity>CA4D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 50"><unientity>CA50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 51"><unientity>CA54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 52"><unientity>CA5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 53"><unientity>CA5D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 54"><unientity>CA61</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 55"><unientity>CA84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 56"><unientity>CA98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 57"><unientity>CABC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 58"><unientity>CABD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 59"><unientity>CAC0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5A"><unientity>CAC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5B"><unientity>CACC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5C"><unientity>CACD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5D"><unientity>CAD1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5E"><unientity>CAD2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 5F"><unientity>CAD3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 60"><unientity>CAD8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 61"><unientity>CAD9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 62"><unientity>CB10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 63"><unientity>CB14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 64"><unientity>CB18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 65"><unientity>CB20</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 66"><unientity>CB21</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 67"><unientity>CB41</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 68"><unientity>CB48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 69"><unientity>CB49</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6A"><unientity>CB50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6B"><unientity>CB58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6C"><unientity>CB59</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6D"><unientity>CB5D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6E"><unientity>CB64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 6F"><unientity>CBB8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 70"><unientity>CBD4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 71"><unientity>CBE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 72"><unientity>CBE7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 73"><unientity>CC0C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 74"><unientity>CC0D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 75"><unientity>CC10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 76"><unientity>CC14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 77"><unientity>CC1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 78"><unientity>CC1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 79"><unientity>CC21</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 7A"><unientity>CC22</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 7B"><unientity>CC27</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 58 7E"><unientity>CC28</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 21"><unientity>CC29</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 22"><unientity>CC2C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 23"><unientity>CC2E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 24"><unientity>CC2F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 25"><unientity>CC30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 26"><unientity>CC38</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 27"><unientity>CC39</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 28"><unientity>CC3B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 29"><unientity>CC3C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2A"><unientity>CC3D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2B"><unientity>CC3E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2C"><unientity>CC3F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2D"><unientity>CC44</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2E"><unientity>CC45</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 2F"><unientity>CC48</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 30"><unientity>CC4C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 31"><unientity>CC54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 32"><unientity>CC55</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 33"><unientity>CC58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 34"><unientity>CC59</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 35"><unientity>CC60</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 36"><unientity>CC64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 37"><unientity>CC70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 38"><unientity>CC71</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 39"><unientity>CC98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3A"><unientity>CC99</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3B"><unientity>CC9C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3C"><unientity>CCA0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3D"><unientity>CCA8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3E"><unientity>CCA9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 3F"><unientity>CCAB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 40"><unientity>CCAD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 41"><unientity>CCB4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 42"><unientity>CCB5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 43"><unientity>CCB8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 44"><unientity>CCBC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 45"><unientity>CCC7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 46"><unientity>CCD0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 47"><unientity>CCE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 48"><unientity>CD08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 49"><unientity>CD09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4A"><unientity>CD0C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4B"><unientity>CD10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4C"><unientity>CD18</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4D"><unientity>CD19</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4E"><unientity>CD1B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 4F"><unientity>CD1D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 50"><unientity>CD2C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 51"><unientity>CD5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 52"><unientity>CD78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 53"><unientity>CD94</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 54"><unientity>CD95</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 55"><unientity>CD98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 56"><unientity>CD9C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 57"><unientity>CDA4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 58"><unientity>CDA5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 59"><unientity>CDA7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5A"><unientity>CDA9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5B"><unientity>CDB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5C"><unientity>CDC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5D"><unientity>CDCC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5E"><unientity>CDE8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 5F"><unientity>CE04</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 60"><unientity>CE20</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 61"><unientity>CE21</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 62"><unientity>CE30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 63"><unientity>CE35</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 64"><unientity>CE58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 65"><unientity>CE59</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 66"><unientity>CE5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 67"><unientity>CE60</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 68"><unientity>CE61</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 69"><unientity>CE68</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 6A"><unientity>CE69</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 6B"><unientity>CE6B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 6C"><unientity>CE6D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 6F"><unientity>CE74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 70"><unientity>CE75</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 71"><unientity>CE78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 72"><unientity>CE7C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 73"><unientity>CE84</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 74"><unientity>CE85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 75"><unientity>CE87</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 76"><unientity>CE89</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 77"><unientity>CE90</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 78"><unientity>CE91</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 79"><unientity>CE94</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 7A"><unientity>CE98</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 7B"><unientity>CEA0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 7C"><unientity>CEA1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 59 7D"><unientity>CEA3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 21"><unientity>CEA5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 22"><unientity>CEAC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 23"><unientity>CEAD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 24"><unientity>CEE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 26"><unientity>CEE8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 27"><unientity>CEEC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 28"><unientity>CEF4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 29"><unientity>CEF5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 2A"><unientity>CEF7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 2C"><unientity>CEF9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 2E"><unientity>CF00</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 2F"><unientity>CF01</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 30"><unientity>CF04</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 31"><unientity>CF08</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 32"><unientity>CF10</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 33"><unientity>CF11</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 34"><unientity>CF13</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 35"><unientity>CF15</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 36"><unientity>CF1C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 37"><unientity>CF20</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 38"><unientity>CF24</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 39"><unientity>CF2C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3A"><unientity>CF2D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3B"><unientity>CF2F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3C"><unientity>CF30</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3D"><unientity>CF54</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3E"><unientity>CF55</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 3F"><unientity>CF58</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 40"><unientity>CF5C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 41"><unientity>CF64</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 42"><unientity>CF65</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 43"><unientity>CF67</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 44"><unientity>CF69</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 45"><unientity>CF70</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 46"><unientity>CF71</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 47"><unientity>CF74</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 48"><unientity>CF78</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 49"><unientity>CF80</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 4A"><unientity>CF85</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 4B"><unientity>CF8C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 4C"><unientity>CF8D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 4D"><unientity>CFA1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 4F"><unientity>CFB0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 50"><unientity>CFC4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 51"><unientity>CFE0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 52"><unientity>CFE1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 53"><unientity>CFE4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 54"><unientity>CFE8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 55"><unientity>CFF0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 56"><unientity>CFF3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 57"><unientity>CFF5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 58"><unientity>CFFC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5A"><unientity>D018</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5B"><unientity>D02D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5C"><unientity>D034</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5D"><unientity>D035</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5E"><unientity>D038</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 5F"><unientity>D050</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 60"><unientity>D06C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 61"><unientity>D070</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 62"><unientity>D074</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 63"><unientity>D07C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 64"><unientity>D07D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 65"><unientity>D081</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 66"><unientity>D0A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 67"><unientity>D0A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 68"><unientity>D0A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 69"><unientity>D0AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 6A"><unientity>D0B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 6B"><unientity>D0B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 6C"><unientity>D0B7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 6D"><unientity>D0B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 70"><unientity>D0C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 71"><unientity>D0C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 72"><unientity>D0C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 73"><unientity>D0C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 74"><unientity>D0C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 75"><unientity>D0D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 76"><unientity>D0D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 77"><unientity>D0D3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 78"><unientity>D0D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 79"><unientity>D0D5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 7A"><unientity>D0DC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 7B"><unientity>D0DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 7C"><unientity>D0E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 7D"><unientity>D0E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5A 7E"><unientity>D0EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 21"><unientity>D0ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 22"><unientity>D0EF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 23"><unientity>D0F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 24"><unientity>D0F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 25"><unientity>D130</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 26"><unientity>D131</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 27"><unientity>D134</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 28"><unientity>D138</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 29"><unientity>D140</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2A"><unientity>D141</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2B"><unientity>D143</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2C"><unientity>D144</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2D"><unientity>D145</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2E"><unientity>D14C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 2F"><unientity>D14D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 30"><unientity>D150</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 31"><unientity>D154</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 32"><unientity>D15C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 33"><unientity>D15D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 34"><unientity>D15F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 35"><unientity>D160</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 36"><unientity>D161</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 37"><unientity>D168</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 38"><unientity>D1A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 39"><unientity>D1A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3A"><unientity>D1A4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3B"><unientity>D1A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3C"><unientity>D1B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3D"><unientity>D1B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3E"><unientity>D1B3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 3F"><unientity>D1B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 40"><unientity>D1D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 41"><unientity>D1F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 43"><unientity>D22C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 44"><unientity>D22D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 45"><unientity>D230</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 46"><unientity>D234</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 47"><unientity>D23C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 48"><unientity>D23D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 49"><unientity>D23F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4A"><unientity>D241</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4B"><unientity>D264</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4C"><unientity>D277</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4D"><unientity>D280</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4E"><unientity>D284</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 4F"><unientity>D288</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 50"><unientity>D290</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 51"><unientity>D291</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 52"><unientity>D293</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 53"><unientity>D295</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 54"><unientity>D29C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 57"><unientity>D2AC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 59"><unientity>D2B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5A"><unientity>D2B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5B"><unientity>D2BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5C"><unientity>D2BF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5D"><unientity>D2C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5E"><unientity>D2C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 5F"><unientity>D2C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 60"><unientity>D2CB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 61"><unientity>D2D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 62"><unientity>D1F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 63"><unientity>D2F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 64"><unientity>D2F1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 65"><unientity>D2F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 66"><unientity>D2F8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 67"><unientity>D300</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 68"><unientity>D301</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 69"><unientity>D305</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 6C"><unientity>D30C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 6D"><unientity>D30D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 6E"><unientity>D30E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 6F"><unientity>D310</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 70"><unientity>D314</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 71"><unientity>D31C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 72"><unientity>D31D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 73"><unientity>D31F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 74"><unientity>D320</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 75"><unientity>D321</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 76"><unientity>D325</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 77"><unientity>D328</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 78"><unientity>D329</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 79"><unientity>D32C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 7A"><unientity>D330</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 7B"><unientity>D338</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 7C"><unientity>D339</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 7D"><unientity>D33B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5B 7E"><unientity>D33C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 21"><unientity>D33D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 23"><unientity>D37C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 24"><unientity>D37D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 25"><unientity>D380</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 26"><unientity>D384</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 27"><unientity>D38C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 28"><unientity>D38D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 29"><unientity>D38F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2A"><unientity>D390</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2B"><unientity>D391</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2C"><unientity>D398</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2D"><unientity>D399</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2E"><unientity>D39C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 2F"><unientity>D3A0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 30"><unientity>D3A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 31"><unientity>D3A9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 32"><unientity>D3AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 33"><unientity>D3AD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 34"><unientity>D3B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 35"><unientity>D3B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 36"><unientity>D3B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 37"><unientity>D3BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 38"><unientity>D3C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 39"><unientity>D3C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3A"><unientity>D3C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3B"><unientity>D3C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3C"><unientity>D3D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3D"><unientity>D3EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3E"><unientity>D3ED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 3F"><unientity>D3F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 40"><unientity>D3F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 41"><unientity>D3FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 42"><unientity>D3FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 43"><unientity>D3FF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 44"><unientity>D401</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 45"><unientity>D440</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 46"><unientity>D444</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 47"><unientity>D45C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 48"><unientity>D46F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 49"><unientity>D478</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4A"><unientity>D479</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4B"><unientity>D47C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4C"><unientity>D480</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4D"><unientity>D488</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4E"><unientity>D489</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 4F"><unientity>D48B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 50"><unientity>D48D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 51"><unientity>D4CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 52"><unientity>D4E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 53"><unientity>D504</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 55"><unientity>D508</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 56"><unientity>D50C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 57"><unientity>D514</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 58"><unientity>D515</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 59"><unientity>D53C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5A"><unientity>D53D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5B"><unientity>D540</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5C"><unientity>D544</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5D"><unientity>D54C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5E"><unientity>D54D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 5F"><unientity>D54F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 60"><unientity>D551</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 63"><unientity>D558</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 64"><unientity>D559</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 65"><unientity>D55C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 66"><unientity>D560</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 67"><unientity>D565</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 68"><unientity>D568</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 69"><unientity>D569</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6A"><unientity>D56B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6B"><unientity>D56C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6C"><unientity>D56D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6D"><unientity>D571</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6E"><unientity>D574</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 6F"><unientity>D575</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 70"><unientity>D578</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 71"><unientity>D57C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 72"><unientity>D584</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 73"><unientity>D585</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 74"><unientity>D587</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 75"><unientity>D588</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 76"><unientity>D589</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 77"><unientity>D590</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 78"><unientity>D5A5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 79"><unientity>D5C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 7A"><unientity>D5C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 7B"><unientity>D5CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 7C"><unientity>D5D0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 7D"><unientity>D5D2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5C 7E"><unientity>D5D8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 21"><unientity>D5D9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 22"><unientity>D5DB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 23"><unientity>D5DD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 24"><unientity>D5E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 25"><unientity>D5E5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 26"><unientity>D5E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 27"><unientity>D5EC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 28"><unientity>D5F4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 29"><unientity>D5F5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2A"><unientity>D5F7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2B"><unientity>D5F9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2C"><unientity>D600</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2D"><unientity>D601</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2E"><unientity>D604</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 2F"><unientity>D608</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 30"><unientity>D610</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 31"><unientity>D611</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 32"><unientity>D613</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 33"><unientity>D614</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 34"><unientity>D615</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 35"><unientity>D61C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 36"><unientity>D638</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 37"><unientity>D639</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 38"><unientity>D63C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 39"><unientity>D640</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 3A"><unientity>D648</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 3B"><unientity>D649</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 3C"><unientity>D64B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 3D"><unientity>D64D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 3F"><unientity>D654</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 40"><unientity>D655</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 41"><unientity>D658</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 42"><unientity>D65C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 44"><unientity>D667</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 45"><unientity>D669</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 46"><unientity>D670</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 47"><unientity>D671</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 48"><unientity>D683</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4A"><unientity>D68C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4B"><unientity>D68D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4C"><unientity>D69F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4D"><unientity>D6A1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4E"><unientity>D6A8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 4F"><unientity>D6C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 50"><unientity>D6C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 51"><unientity>D6C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 52"><unientity>D6CC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 53"><unientity>D6D1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 54"><unientity>D6D4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 55"><unientity>D6D7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 56"><unientity>D6E0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 57"><unientity>D6E4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 58"><unientity>D6E8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 59"><unientity>D6F0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 5A"><unientity>D6FC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 5C"><unientity>D700</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 5D"><unientity>D711</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 5E"><unientity>D718</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 5F"><unientity>D719</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 60"><unientity>D71C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 61"><unientity>D720</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 62"><unientity>D728</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 63"><unientity>D729</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 65"><unientity>D72D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 66"><unientity>D734</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 67"><unientity>D73C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 68"><unientity>D744</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 69"><unientity>D749</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6A"><unientity>D750</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6B"><unientity>D751</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6C"><unientity>D754</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6D"><unientity>D757</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6E"><unientity>D758</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 6F"><unientity>D759</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 70"><unientity>D760</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 71"><unientity>D761</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 72"><unientity>D763</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 73"><unientity>D765</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 74"><unientity>D769</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 75"><unientity>D76C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 76"><unientity>D770</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 77"><unientity>D774</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 78"><unientity>D788</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 79"><unientity>D789</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 7A"><unientity>D78C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 7B"><unientity>D790</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 7C"><unientity>D798</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 7D"><unientity>D799</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5D 7E"><unientity>D79B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 5E 21"><unientity>D79D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 21"><unientity>3181</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 22"><unientity>3186</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 23"><unientity>317F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 24"><unientity>E8B0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 25"><unientity>E8B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 40"><unientity>E8B2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 41"><unientity>E8B3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 42"><unientity>E8B4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 43"><unientity>E8B5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 44"><unientity>E8B6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 45"><unientity>E8B7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 46"><unientity>E8B8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 47"><unientity>E8B9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 48"><unientity>E8BA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 49"><unientity>E8BB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4A"><unientity>E8BC</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4B"><unientity>E8BD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4C"><unientity>E8BE</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4D"><unientity>E8BF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4E"><unientity>E8C0</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 4F"><unientity>E8C1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 50"><unientity>E8C2</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 51"><unientity>E8C3</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 52"><unientity>E8C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 53"><unientity>E8C5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 54"><unientity>E8C6</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 55"><unientity>E8C7</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 56"><unientity>E8C8</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 76 57"><unientity>E8C9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 21"><unientity>AD35</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 22"><unientity>AD7B</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 23"><unientity>E8CA</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 24"><unientity>AD89</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 25"><unientity>AD9D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 26"><unientity>ADB9</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 27"><unientity>ADD5</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 28"><unientity>AE07</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 29"><unientity>AE0E</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2A"><unientity>AE0F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2B"><unientity>AE11</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2C"><unientity>AE14</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2D"><unientity>AE5F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2E"><unientity>AEED</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 2F"><unientity>AF09</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 30"><unientity>AF50</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 31"><unientity>AFBF</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 32"><unientity>B060</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 33"><unientity>B9C4</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 34"><unientity>C54D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 35"><unientity>C54F</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 36"><unientity>C552</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 37"><unientity>C5AB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 38"><unientity>C5B1</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 39"><unientity>C61C</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 3A"><unientity>C61D</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 3B"><unientity>C6FD</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 3C"><unientity>E8CB</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 3D"><unientity>C733</unientity><desc>Korean hangul</desc></character>
-<character hex="6F 77 3E"><unientity>CB4C</unientity><desc>Korean hangul</desc></character>
-<character hex="70 4C 2A"><unientity>915E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 58 6F"><unientity>4EEB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5B 71"><unientity>57B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5C 43"><unientity>82CA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5C 50"><unientity>82C4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5D 46"><unientity>841C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5D 5C"><unientity>8488</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 30"><unientity>7519</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 39"><unientity>5416</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 50"><unientity>549D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 51"><unientity>54D0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 54"><unientity>54B4</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 5B"><unientity>54A3</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 5F 61"><unientity>54DA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 2D"><unientity>55B9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 3A"><unientity>55EA</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 4C"><unientity>55F5</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 54"><unientity>5623</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 58"><unientity>562D</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 60 67"><unientity>567B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 61 31"><unientity>5C9C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 62 2A"><unientity>7339</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 62 47"><unientity>9987</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 62 4E"><unientity>9995</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 63 40"><unientity>61B7</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 66 40"><unientity>80EC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 42"><unientity>80BC</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 44"><unientity>80BD</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 4C"><unientity>80E9</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 5B"><unientity>810E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 5F"><unientity>8112</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6B 6A"><unientity>8159</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6C 42"><unientity>70BB</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6C 43"><unientity>70C0</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6D 3B"><unientity>7818</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6D 3F"><unientity>781C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 6D 45"><unientity>783C</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 72 7D"><unientity>87A8</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 73 60"><unientity>7B7B</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 73 6E"><unientity>7BA2</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 74 38"><unientity>823E</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 75 23"><unientity>9170</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 75 5D"><unientity>8E3A</unientity><desc>East Asian ideograph</desc></character>
-<character hex="70 77 5D"><unientity>9B0F</unientity><desc>East Asian ideograph</desc></character>
-</entitymap>
\ No newline at end of file
--- /dev/null
+/* $Id: cql2pqf.c,v 1.1 2003-10-27 12:21:39 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <yaz/cql.h>
+
+int main(int argc, char **argv)
+{
+ cql_transform_t ct;
+ int r;
+ int i, it = 1;
+ CQL_parser cp = cql_parser_create();
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "usage\n cqltransform <properties> [<query>] [interations]\n");
+ exit (1);
+ }
+ ct = cql_transform_open_fname(argv[1]);
+ if (!ct)
+ {
+ fprintf (stderr, "failed to read properties %s\n", argv[1]);
+ exit (1);
+ }
+ if (argc >= 4)
+ it = atoi(argv[3]);
+
+ for (i = 0; i<it; i++)
+ {
+ if (argc >= 3)
+ r = cql_parser_string(cp, argv[2]);
+ else
+ r = cql_parser_stdio(cp, stdin);
+
+ if (r)
+ fprintf (stderr, "Syntax error\n");
+ else
+ {
+ r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
+ printf("\n");
+ if (r)
+ {
+ const char *addinfo;
+ cql_transform_error(ct, &addinfo);
+ printf ("Transform error %d %s\n", r, addinfo ? addinfo : "");
+ }
+ }
+ }
+ cql_transform_close(ct);
+ cql_parser_destroy(cp);
+ return 0;
+}
--- /dev/null
+/* $Id: cql2xcql.c,v 1.1 2003-10-27 12:21:39 adam Exp $
+ Copyright (C) 2002-2003
+ Index Data Aps
+
+This file is part of the YAZ toolkit.
+
+See the file LICENSE.
+*/
+
+#include <stdio.h>
+
+#include <yaz/cql.h>
+
+int main(int argc, char **argv)
+{
+ int r;
+ CQL_parser cp = cql_parser_create();
+ if (argc == 2)
+ r = cql_parser_string(cp, argv[1]);
+ else
+ r = cql_parser_stdio(cp, stdin);
+ if (r)
+ fprintf (stderr, "Syntax error\n");
+ else
+ cql_to_xml_stdio(cql_parser_result(cp), stdout);
+ cql_parser_destroy(cp);
+ return 0;
+}
+++ /dev/null
-#!/bin/sh
-# the next line restarts using tclsh \
-exec tclsh "$0" "$@"
-#
-# $Id: cvs-date.tcl,v 1.4 2001-09-11 12:44:22 adam Exp $
-set sec 0
-
-proc cvslog {} {
- global sec
-
- set f [open {|cvs log} r]
- while {[gets $f line] >= 0} {
- if {[regexp {^date: ([0-9]+)[ /]+([0-9]+)[ /]+([0-9]+)[ /]} $line dummy year month day]} {
- set this $year$month$day
- if {$this > $sec} {
- set sec $this
- }
- }
- }
-}
-
-cvslog
-
-if {$sec} {
- set fname [lindex $argv 0]
- if {[string length $fname]} {
- set f [open [lindex $argv 0] w]
- puts $f "#define YAZ_DATE ${sec}L"
- puts $f "#define YAZ_DATE_STR \"$sec\""
- puts $f ""
- close $f
- } else {
- puts $sec
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: log.c,v 1.39 2003-10-09 15:51:36 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef WIN32
-#include <windows.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <time.h>
-#include <yaz/nmem.h>
-#include <yaz/log.h>
-
-#define HAS_STRERROR 1
-
-#if HAS_STRERROR
-
-#else
-char *strerror(int n)
-{
- extern char *sys_errlist[];
- return sys_errlist[n];
-}
-
-#endif
-
-static int l_level = LOG_DEFAULT_LEVEL;
-static FILE *l_file = NULL;
-static char l_prefix[512] = "";
-static char l_prefix2[512] = "";
-static char l_fname[512] = "";
-
-static struct {
- int mask;
- char *name;
-} mask_names[] =
-{
- { LOG_FATAL, "fatal"},
- { LOG_DEBUG, "debug"},
- { LOG_WARN, "warn" },
- { LOG_LOG, "log" },
- { LOG_ERRNO, ""},
- { LOG_MALLOC, "malloc"},
- { LOG_APP, "app" },
- { LOG_NOTIME, "" },
- { LOG_APP2 , "app2" },
- { LOG_APP3 , "app3" },
- { LOG_ALL, "all" },
- { 0, "none" },
- { 0, NULL }
-};
-
-FILE *yaz_log_file(void)
-{
- if (!l_file)
- l_file = stderr;
- return l_file;
-}
-
-void yaz_log_init_file (const char *fname)
-{
- if (fname)
- {
- strncpy(l_fname, fname, sizeof(l_fname)-1);
- l_fname[sizeof(l_fname)-1] = '\0';
- }
- else
- l_fname[0] = '\0';
- yaz_log_reopen();
-}
-
-void yaz_log_reopen(void)
-{
- FILE *new_file;
- if (!l_file)
- l_file = stderr;
-
- if (!*l_fname)
- new_file=stderr;
- else if (!(new_file = fopen(l_fname, "a")))
- return;
- if (l_file != stderr)
- {
- fclose (l_file);
- }
- setvbuf(new_file, 0, _IONBF, 0);
- l_file = new_file;
-}
-
-void yaz_log_init_level (int level)
-{
- l_level = level;
-}
-
-void yaz_log_init_prefix (const char *prefix)
-{
- if (prefix && *prefix)
- sprintf(l_prefix, "%.511s ", prefix);
- else
- *l_prefix = 0;
-}
-
-void yaz_log_init_prefix2 (const char *prefix)
-{
- if (prefix && *prefix)
- sprintf(l_prefix2, "%.511s ", prefix);
- else
- *l_prefix2 = 0;
-}
-
-void yaz_log_init(int level, const char *prefix, const char *fname)
-{
- yaz_log_init_level (level);
- yaz_log_init_prefix (prefix);
- if (fname && *fname)
- yaz_log_init_file (fname);
-}
-
-static void (*start_hook_func)(int, const char *, void *) = NULL;
-static void *start_hook_info;
-static void (*end_hook_func)(int, const char *, void *) = NULL;
-static void *end_hook_info;
-
-void log_event_start (void (*func)(int, const char *, void *), void *info)
-{
- start_hook_func = func;
- start_hook_info = info;
-}
-
-void log_event_end (void (*func)(int, const char *, void *), void *info)
-{
- end_hook_func = func;
- end_hook_info = info;
-}
-
-void yaz_log(int level, const char *fmt, ...)
-{
- va_list ap;
- char buf[4096], flags[1024];
- int i;
- time_t ti;
- struct tm *tim;
- char tbuf[50]="";
- int o_level = level;
-
- if (!(level & l_level))
- return;
- if (!l_file)
- l_file = stderr;
- *flags = '\0';
- for (i = 0; level && mask_names[i].name; i++)
- if (mask_names[i].mask & level)
- {
- if (*mask_names[i].name)
- sprintf(flags + strlen(flags), "[%s]", mask_names[i].name);
- level -= mask_names[i].mask;
- }
- va_start(ap, fmt);
-#ifdef WIN32
- _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
-/* !WIN32 */
-#if HAVE_VSNPRINTF
- vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
-#endif
-/* WIN32 */
- if (o_level & LOG_ERRNO)
- {
- strcat(buf, " [");
- yaz_strerror(buf+strlen(buf), 2048);
- strcat(buf, "]");
- }
- va_end (ap);
- if (start_hook_func)
- (*start_hook_func)(o_level, buf, start_hook_info);
- ti = time(0);
- tim = localtime(&ti);
- if (l_level & LOG_NOTIME)
- tbuf[0]='\0';
- else
- strftime(tbuf, 50, "%H:%M:%S-%d/%m: ", tim);
- fprintf(l_file, "%s%s%s %s%s\n", tbuf, l_prefix, flags,
- l_prefix2, buf);
- fflush(l_file);
- if (end_hook_func)
- (*end_hook_func)(o_level, buf, end_hook_info);
-}
-
-int yaz_log_mask_str (const char *str)
-{
- return yaz_log_mask_str_x (str, LOG_DEFAULT_LEVEL);
-}
-
-int yaz_log_mask_str_x (const char *str, int level)
-{
- const char *p;
- int i;
-
- while (*str)
- {
- for (p = str; *p && *p != ','; p++)
- ;
- if (*str == '-' || isdigit(*str))
- level = atoi (str);
- else
- for (i = 0; mask_names[i].name; i++)
- if (strlen (mask_names[i].name) == (size_t) (p-str) &&
- memcmp (mask_names[i].name, str, p-str) == 0)
- {
- if (mask_names[i].mask)
- level |= mask_names[i].mask;
- else
- level = 0;
- }
- if (*p == ',')
- p++;
- str = p;
- }
- return level;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: marcdisp.c,v 1.30 2003-07-14 12:59:23 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <yaz/marcdisp.h>
-#include <yaz/wrbuf.h>
-#include <yaz/yaz-util.h>
-
-struct yaz_marc_t_ {
- WRBUF m_wr;
- int xml;
- int debug;
-};
-
-yaz_marc_t yaz_marc_create(void)
-{
- yaz_marc_t mt = (yaz_marc_t) xmalloc(sizeof(*mt));
- mt->xml = YAZ_MARC_LINE;
- mt->debug = 0;
- mt->m_wr = wrbuf_alloc();
- return mt;
-}
-
-void yaz_marc_destroy(yaz_marc_t mt)
-{
- if (!mt)
- return ;
- wrbuf_free (mt->m_wr, 1);
- xfree (mt);
-}
-
-static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len, WRBUF wr)
-{
- size_t i;
- for (i = 0; i<len; i++)
- {
- if (mt->xml)
- {
- switch (buf[i]) {
- case '<':
- wrbuf_puts(wr, "<");
- break;
- case '>':
- wrbuf_puts(wr, ">");
- break;
- case '&':
- wrbuf_puts(wr, "&");
- break;
- case '"':
- wrbuf_puts(wr, """);
- break;
- case '\'':
- wrbuf_puts(wr, "'");
- break;
- default:
- wrbuf_putc(wr, buf[i]);
- }
- }
- else
- wrbuf_putc(wr, buf[i]);
- }
-}
-
-#if 0
-static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len)
-{
- if (!mt->cd)
- marc_cdata2 (mt, buf, len);
- else
- {
- char outbuf[12];
- size_t inbytesleft = len;
- const char *inp = buf;
-
- while (inbytesleft)
- {
- size_t outbytesleft = sizeof(outbuf);
- char *outp = outbuf;
- size_t r = yaz_iconv (mt->cd, (char**) &inp, &inbytesleft,
- &outp, &outbytesleft);
- if (r == (size_t) (-1))
- {
- int e = yaz_iconv_error(mt->cd);
- if (e != YAZ_ICONV_E2BIG)
- break;
- }
- marc_cdata2 (mt, outbuf, outp - outbuf);
- }
- }
-}
-#endif
-
-int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)
-{
- int entry_p;
- int record_length;
- int indicator_length;
- int identifier_length;
- int base_address;
- int length_data_entry;
- int length_starting;
- int length_implementation;
-
- wrbuf_rewind(wr);
-
- record_length = atoi_n (buf, 5);
- if (record_length < 25)
- {
- if (mt->debug)
- {
- char str[40];
-
- sprintf (str, "Record length %d - aborting\n", record_length);
- wrbuf_puts (wr, str);
- }
- return -1;
- }
- /* ballout if bsize is known and record_length is than that */
- if (bsize != -1 && record_length > bsize)
- return -1;
- if (isdigit(buf[10]))
- indicator_length = atoi_n (buf+10, 1);
- else
- indicator_length = 2;
- if (isdigit(buf[11]))
- identifier_length = atoi_n (buf+11, 1);
- else
- identifier_length = 2;
- base_address = atoi_n (buf+12, 5);
-
- length_data_entry = atoi_n (buf+20, 1);
- length_starting = atoi_n (buf+21, 1);
- length_implementation = atoi_n (buf+22, 1);
-
- if (mt->xml)
- {
- char str[80];
- int i;
- switch(mt->xml)
- {
- case YAZ_MARC_SIMPLEXML:
- wrbuf_puts (wr, "<iso2709\n");
- sprintf (str, " RecordStatus=\"%c\"\n", buf[5]);
- wrbuf_puts (wr, str);
- sprintf (str, " TypeOfRecord=\"%c\"\n", buf[6]);
- wrbuf_puts (wr, str);
- for (i = 1; i<=19; i++)
- {
- sprintf (str, " ImplDefined%d=\"%c\"\n", i, buf[6+i]);
- wrbuf_puts (wr, str);
- }
- wrbuf_puts (wr, ">\n");
- break;
- case YAZ_MARC_OAIMARC:
- wrbuf_puts(
- wr,
- "<oai_marc xmlns=\"http://www.openarchives.org/OIA/oai_marc\""
- "\n"
- " xmlns:xsi=\"http://www.w3.org/2000/10/XMLSchema-instance\""
- "\n"
- " xsi:schemaLocation=\"http://www.openarchives.org/OAI/oai_marc.xsd\""
- "\n"
- );
-
- sprintf (str, " status=\"%c\" type=\"%c\" catForm=\"%c\">\n",
- buf[5], buf[6], buf[7]);
- wrbuf_puts (wr, str);
- break;
- case YAZ_MARC_MARCXML:
- wrbuf_printf(
- wr,
- "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
- " <leader>%.24s</leader>\n", buf);
- break;
- }
- }
- if (mt->debug)
- {
- char str[40];
-
- if (mt->xml)
- wrbuf_puts (wr, "<!--\n");
- sprintf (str, "Record length %5d\n", record_length);
- wrbuf_puts (wr, str);
- sprintf (str, "Indicator length %5d\n", indicator_length);
- wrbuf_puts (wr, str);
- sprintf (str, "Identifier length %5d\n", identifier_length);
- wrbuf_puts (wr, str);
- sprintf (str, "Base address %5d\n", base_address);
- wrbuf_puts (wr, str);
- sprintf (str, "Length data entry %5d\n", length_data_entry);
- wrbuf_puts (wr, str);
- sprintf (str, "Length starting %5d\n", length_starting);
- wrbuf_puts (wr, str);
- sprintf (str, "Length implementation %5d\n", length_implementation);
- wrbuf_puts (wr, str);
- if (mt->xml)
- wrbuf_puts (wr, "-->\n");
- }
-
- for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
- {
- entry_p += 3+length_data_entry+length_starting;
- if (entry_p >= record_length)
- return -1;
- }
- base_address = entry_p+1;
- for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
- {
- int data_length;
- int data_offset;
- int end_offset;
- int i, j;
- char tag[4];
- int identifier_flag = 1;
-
- memcpy (tag, buf+entry_p, 3);
- entry_p += 3;
- tag[3] = '\0';
- data_length = atoi_n (buf+entry_p, length_data_entry);
- entry_p += length_data_entry;
- data_offset = atoi_n (buf+entry_p, length_starting);
- entry_p += length_starting;
- i = data_offset + base_address;
- end_offset = i+data_length-1;
-
- if (indicator_length < 4 && indicator_length > 0)
- {
- if (buf[i + indicator_length] != ISO2709_IDFS)
- identifier_flag = 0;
- }
- else if (!memcmp (tag, "00", 2))
- identifier_flag = 0;
-
- switch(mt->xml)
- {
- case YAZ_MARC_LINE:
- if (mt->debug)
- wrbuf_puts (wr, "Tag: ");
- wrbuf_puts (wr, tag);
- wrbuf_puts (wr, " ");
- break;
- case YAZ_MARC_SIMPLEXML:
- wrbuf_printf (wr, "<field tag=\"%s\"", tag);
- break;
- case YAZ_MARC_OAIMARC:
- if (identifier_flag)
- wrbuf_printf (wr, " <varfield id=\"%s\"", tag);
- else
- wrbuf_printf (wr, " <fixfield id=\"%s\"", tag);
- break;
- case YAZ_MARC_MARCXML:
- if (identifier_flag)
- wrbuf_printf (wr, " <datafield tag=\"%s\"", tag);
- else
- wrbuf_printf (wr, " <controlfield tag=\"%s\"", tag);
- }
-
- if (identifier_flag)
- {
- for (j = 0; j<indicator_length; j++, i++)
- {
- switch(mt->xml)
- {
- case YAZ_MARC_LINE:
- if (mt->debug)
- wrbuf_puts (wr, " Ind: ");
- wrbuf_putc (wr, buf[i]);
- break;
- case YAZ_MARC_SIMPLEXML:
- wrbuf_printf (wr, " Indicator%d=\"%c\"", j+1, buf[i]);
- break;
- case YAZ_MARC_OAIMARC:
- wrbuf_printf (wr, " i%d=\"%c\"", j+1, buf[i]);
- break;
- case YAZ_MARC_MARCXML:
- wrbuf_printf (wr, " ind%d=\"%c\"", j+1, buf[i]);
- }
- }
- }
- if (mt->xml)
- {
- wrbuf_puts (wr, ">");
- if (identifier_flag)
- wrbuf_puts (wr, "\n");
- }
- else
- {
- if (mt->debug && !mt->xml)
- wrbuf_puts (wr, " Fields: ");
- }
- if (identifier_flag)
- {
- while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
- {
- int i0;
- i++;
- switch(mt->xml)
- {
- case YAZ_MARC_LINE:
- wrbuf_puts (wr, " $");
- for (j = 1; j<identifier_length; j++, i++)
- wrbuf_putc (wr, buf[i]);
- wrbuf_putc (wr, ' ');
- break;
- case YAZ_MARC_SIMPLEXML:
- wrbuf_puts (wr, " <subfield code=\"");
- for (j = 1; j<identifier_length; j++, i++)
- wrbuf_putc (wr, buf[i]);
- wrbuf_puts (wr, "\">");
- break;
- case YAZ_MARC_OAIMARC:
- wrbuf_puts (wr, " <subfield label=\"");
- for (j = 1; j<identifier_length; j++, i++)
- wrbuf_putc (wr, buf[i]);
- wrbuf_puts (wr, "\">");
- break;
- case YAZ_MARC_MARCXML:
- wrbuf_puts (wr, " <subfield code=\"");
- for (j = 1; j<identifier_length; j++, i++)
- wrbuf_putc (wr, buf[i]);
- wrbuf_puts (wr, "\">");
- break;
- }
- i0 = i;
- while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS &&
- buf[i] != ISO2709_FS && i < end_offset)
- i++;
- marc_cdata(mt, buf + i0, i - i0, wr);
-
- if (mt->xml)
- wrbuf_puts (wr, "</subfield>\n");
- }
- }
- else
- {
- int i0 = i;
- while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
- i++;
- marc_cdata(mt, buf + i0, i - i0, wr);
- }
- if (!mt->xml)
- wrbuf_putc (wr, '\n');
- if (i < end_offset)
- wrbuf_puts (wr, " <!-- separator but not at end of field -->\n");
- if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS)
- wrbuf_puts (wr, " <!-- no separator at end of field -->\n");
- switch(mt->xml)
- {
- case YAZ_MARC_SIMPLEXML:
- wrbuf_puts (wr, "</field>\n");
- break;
- case YAZ_MARC_OAIMARC:
- if (identifier_flag)
- wrbuf_puts (wr, " </varfield>\n");
- else
- wrbuf_puts (wr, " </fixfield>\n");
- break;
- case YAZ_MARC_MARCXML:
- if (identifier_flag)
- wrbuf_puts (wr, " </datafield>\n");
- else
- wrbuf_puts (wr, " </controlfield>\n");
- break;
- }
- }
- switch (mt->xml)
- {
- case YAZ_MARC_LINE:
- wrbuf_puts (wr, "");
- break;
- case YAZ_MARC_SIMPLEXML:
- wrbuf_puts (wr, "</iso2709>\n");
- break;
- case YAZ_MARC_OAIMARC:
- wrbuf_puts (wr, "</oai_marc>\n");
- break;
- case YAZ_MARC_MARCXML:
- wrbuf_puts (wr, "</record>\n");
- break;
- }
- return record_length;
-}
-
-int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize,
- char **result, int *rsize)
-{
- int r = yaz_marc_decode_wrbuf(mt, buf, bsize, mt->m_wr);
- if (r > 0)
- {
- if (result)
- *result = wrbuf_buf(mt->m_wr);
- if (rsize)
- *rsize = wrbuf_len(mt->m_wr);
- }
- return r;
-}
-
-void yaz_marc_xml(yaz_marc_t mt, int xmlmode)
-{
- if (mt)
- mt->xml = xmlmode;
-}
-
-void yaz_marc_debug(yaz_marc_t mt, int level)
-{
- if (mt)
- mt->debug = level;
-}
-
-/* depricated */
-int yaz_marc_decode(const char *buf, WRBUF wr, int debug, int bsize, int xml)
-{
- yaz_marc_t mt = yaz_marc_create();
- int r;
-
- mt->debug = debug;
- mt->xml = xml;
- r = yaz_marc_decode_wrbuf(mt, buf, bsize, wr);
- yaz_marc_destroy(mt);
- return r;
-}
-
-/* depricated */
-int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int bsize)
-{
- return yaz_marc_decode(buf, wr, debug, bsize, 0);
-}
-
-/* depricated */
-int marc_display_exl (const char *buf, FILE *outf, int debug, int bsize)
-{
- yaz_marc_t mt = yaz_marc_create();
- int r;
-
- mt->debug = debug;
- r = yaz_marc_decode_wrbuf (mt, buf, bsize, mt->m_wr);
- if (!outf)
- outf = stdout;
- if (r > 0)
- fwrite (wrbuf_buf(mt->m_wr), 1, wrbuf_len(mt->m_wr), outf);
- yaz_marc_destroy(mt);
- return r;
-}
-
-/* depricated */
-int marc_display_ex (const char *buf, FILE *outf, int debug)
-{
- return marc_display_exl (buf, outf, debug, -1);
-}
-
-/* depricated */
-int marc_display (const char *buf, FILE *outf)
-{
- return marc_display_ex (buf, outf, 0);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: matchstr.c,v 1.7 2003-02-12 21:34:57 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-#include <yaz/yaz-util.h>
-
-/*
- * Match strings, independently of case and occurences of '-'.
- * fairly inefficient - will be replaced with an indexing scheme for
- * the various subsystems if we get a bottleneck here.
- */
-
-int yaz_matchstr(const char *s1, const char *s2)
-{
- while (*s1 && *s2)
- {
- char c1 = *s1;
- char c2 = *s2;
-
- if (c2 == '?')
- return 0;
- if (c1 == '-')
- c1 = *++s1;
- if (c2 == '-')
- c2 = *++s2;
- if (!c1 || !c2)
- break;
- if (c2 != '.')
- {
- if (isupper(c1))
- c1 = tolower(c1);
- if (isupper(c2))
- c2 = tolower(c2);
- if (c1 != c2)
- break;
- }
- s1++;
- s2++;
- }
- return *s1 || *s2;
-}
-
-int yaz_strcmp_del(const char *a, const char *b, const char *b_del)
-{
- while (*a && *b)
- {
- if (*a != *b)
- return *a - *b;
- a++;
- b++;
- }
- if (b_del && strchr(b_del, *b))
- return *a;
- return *a - *b;
-}
-
-#ifdef __GNUC__
-#ifdef __CHECKER__
-void __assert_fail (const char *assertion, const char *file,
- unsigned int line, const char *function)
-{
- fprintf (stderr, "%s in file %s line %d func %s\n",
- assertion, file, line, function);
- abort ();
-}
-#endif
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: nmem.c,v 1.42 2003-09-16 19:46:56 adam Exp $
- */
-
-/*
- * This is a simple and fairly wasteful little module for nibble memory
- * allocation. Evemtually we'll put in something better.
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <assert.h>
-#include <string.h>
-#include <errno.h>
-#include <yaz/xmalloc.h>
-#include <yaz/nmem.h>
-#include <yaz/log.h>
-#include <yaz/oid.h>
-
-#ifdef WIN32
-#include <windows.h>
-#endif
-
-#if YAZ_POSIX_THREADS
-#include <pthread.h>
-#endif
-
-#if YAZ_GNU_THREADS
-#include <pth.h>
-#endif
-
-#define NMEM_CHUNK (4*1024)
-
-#ifdef WIN32
-static CRITICAL_SECTION critical_section;
-#define NMEM_ENTER EnterCriticalSection(&critical_section)
-#define NMEM_LEAVE LeaveCriticalSection(&critical_section)
-struct nmem_mutex {
- CRITICAL_SECTION m_handle;
-};
-#elif YAZ_POSIX_THREADS
-static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER;
-#define NMEM_ENTER pthread_mutex_lock(&nmem_mutex);
-#define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex);
-struct nmem_mutex {
- pthread_mutex_t m_handle;
-};
-#elif YAZ_GNU_THREADS
-static pth_mutex_t nmem_mutex = PTH_MUTEX_INIT;
-#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0)
-#define NMEM_LEAVE pth_mutex_release(&nmem_mutex)
-struct nmem_mutex {
- pth_mutex_t m_handle;
-};
-#else
-#define NMEM_ENTER
-#define NMEM_LEAVE
-struct nmem_mutex {
- int dummy;
-};
-#endif
-
-YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p)
-{
- NMEM_ENTER;
- if (!*p)
- {
- *p = (NMEM_MUTEX) malloc (sizeof(**p));
-#ifdef WIN32
- InitializeCriticalSection(&(*p)->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_init (&(*p)->m_handle, 0);
-#elif YAZ_GNU_THREADS
- pth_mutex_init (&(*p)->m_handle);
-#endif
- }
- NMEM_LEAVE;
-}
-
-YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p)
-{
- if (p)
- {
-#ifdef WIN32
- EnterCriticalSection(&p->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_lock(&p->m_handle);
-#endif
- }
-}
-
-YAZ_EXPORT void nmem_mutex_leave(NMEM_MUTEX p)
-{
- if (p)
- {
-#ifdef WIN32
- LeaveCriticalSection(&p->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_unlock(&p->m_handle);
-#endif
- }
-}
-
-YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p)
-{
- NMEM_ENTER;
- if (*p)
- {
-#ifdef WIN32
- DeleteCriticalSection(&(*p)->m_handle);
-#endif
- free (*p);
- *p = 0;
- }
- NMEM_LEAVE;
-}
-
-static nmem_block *freelist = NULL; /* "global" freelists */
-static nmem_control *cfreelist = NULL;
-static int nmem_active_no = 0;
-static int nmem_init_flag = 0;
-
-#if NMEM_DEBUG
-struct nmem_debug_info {
- void *p;
- char file[40];
- int line;
- struct nmem_debug_info *next;
-};
-
-struct nmem_debug_info *nmem_debug_list = 0;
-#endif
-
-static void free_block(nmem_block *p)
-{
- p->next = freelist;
- freelist = p;
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "nmem free_block p=%p", p);
-#endif
-}
-
-#if NMEM_DEBUG
-void nmem_print_list (void)
-{
- struct nmem_debug_info *p;
-
- yaz_log (LOG_DEBUG, "nmem print list");
- NMEM_ENTER;
- for (p = nmem_debug_list; p; p = p->next)
- yaz_log (LOG_DEBUG, " %s:%d p=%p size=%d", p->file, p->line, p->p,
- nmem_total(p->p));
- NMEM_LEAVE;
-}
-#endif
-/*
- * acquire a block with a minimum of size free bytes.
- */
-static nmem_block *get_block(int size)
-{
- nmem_block *r, *l;
-
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "nmem get_block size=%d", size);
-#endif
- for (r = freelist, l = 0; r; l = r, r = r->next)
- if (r->size >= size)
- break;
- if (r)
- {
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "nmem get_block found free block p=%p", r);
-#endif
- if (l)
- l->next = r->next;
- else
- freelist = r->next;
- }
- else
- {
- int get = NMEM_CHUNK;
-
- if (get < size)
- get = size;
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "nmem get_block alloc new block size=%d", get);
-#endif
- r = (nmem_block *)xmalloc(sizeof(*r));
- r->buf = (char *)xmalloc(r->size = get);
- }
- r->top = 0;
- return r;
-}
-
-void nmem_reset(NMEM n)
-{
- nmem_block *t;
-
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "nmem_reset p=%p", n);
-#endif
- if (!n)
- return;
- NMEM_ENTER;
- while (n->blocks)
- {
- t = n->blocks;
- n->blocks = n->blocks->next;
- free_block(t);
- }
- n->total = 0;
- NMEM_LEAVE;
-}
-
-#if NMEM_DEBUG
-void *nmem_malloc_f (const char *file, int line, NMEM n, int size)
-#else
-void *nmem_malloc(NMEM n, int size)
-#endif
-{
- struct nmem_block *p;
- char *r;
-
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "%s:%d: nmem_malloc p=%p size=%d", file, line,
- n, size);
-#endif
- if (!n)
- {
- yaz_log (LOG_FATAL, "calling nmem_malloc with an null pointer");
- abort ();
- }
-#ifdef WIN32
- assert (nmem_init_flag);
-#endif
- NMEM_ENTER;
- p = n->blocks;
- if (!p || p->size - p->top < size)
- {
- p = get_block(size);
- p->next = n->blocks;
- n->blocks = p;
- }
- r = p->buf + p->top;
- /* align size */
- p->top += (size + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
- n->total += size;
- NMEM_LEAVE;
- return r;
-}
-
-int nmem_total(NMEM n)
-{
- return n->total;
-}
-
-#if NMEM_DEBUG
-NMEM nmem_create_f(const char *file, int line)
-#else
-NMEM nmem_create(void)
-#endif
-{
- NMEM r;
-#if NMEM_DEBUG
- struct nmem_debug_info *debug_p;
-#endif
-
- NMEM_ENTER;
- nmem_active_no++;
- r = cfreelist;
- if (r)
- cfreelist = cfreelist->next;
- else
- r = (nmem_control *)xmalloc(sizeof(*r));
- NMEM_LEAVE;
-
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "%s:%d: nmem_create %d p=%p", file, line,
- nmem_active_no, r);
-#endif
- r->blocks = 0;
- r->total = 0;
- r->next = 0;
-
-#if NMEM_DEBUG
- for (debug_p = nmem_debug_list; debug_p; debug_p = debug_p->next)
- if (debug_p->p == r)
- {
- yaz_log (LOG_FATAL, "multi used block in nmem");
- abort ();
- }
- debug_p = xmalloc (sizeof(*debug_p));
- strncpy (debug_p->file, file, sizeof(debug_p->file)-1);
- debug_p->file[sizeof(debug_p->file)-1] = '\0';
- debug_p->line = line;
- debug_p->p = r;
- debug_p->next = nmem_debug_list;
- nmem_debug_list = debug_p;
-
- nmem_print_list();
-#endif
- return r;
-}
-
-#if NMEM_DEBUG
-void nmem_destroy_f(const char *file, int line, NMEM n)
-#else
-void nmem_destroy(NMEM n)
-#endif
-{
-#if NMEM_DEBUG
- struct nmem_debug_info **debug_p;
- int ok = 0;
-#endif
- if (!n)
- return;
-
-#if NMEM_DEBUG
- yaz_log (LOG_DEBUG, "%s:%d: nmem_destroy %d p=%p", file, line,
- nmem_active_no-1, n);
- NMEM_ENTER;
- for (debug_p = &nmem_debug_list; *debug_p; debug_p = &(*debug_p)->next)
- if ((*debug_p)->p == n)
- {
- struct nmem_debug_info *debug_save = *debug_p;
- *debug_p = (*debug_p)->next;
- xfree (debug_save);
- ok = 1;
- break;
- }
- NMEM_LEAVE;
- nmem_print_list();
- if (!ok)
- {
- yaz_log (LOG_WARN, "%s:%d destroying unallocated nmem block p=%p",
- file, line, n);
- return;
- }
-#endif
- nmem_reset(n);
- NMEM_ENTER;
- nmem_active_no--;
- n->next = cfreelist;
- cfreelist = n;
- NMEM_LEAVE;
-}
-
-void nmem_transfer (NMEM dst, NMEM src)
-{
- nmem_block *t;
- while ((t=src->blocks))
- {
- src->blocks = t->next;
- t->next = dst->blocks;
- dst->blocks = t;
- }
- dst->total += src->total;
- src->total = 0;
-}
-
-void nmem_critical_enter (void)
-{
- NMEM_ENTER;
-}
-
-void nmem_critical_leave (void)
-{
- NMEM_LEAVE;
-}
-
-void nmem_init (void)
-{
- if (++nmem_init_flag == 1)
- {
-#ifdef WIN32
- InitializeCriticalSection(&critical_section);
-#elif YAZ_GNU_THREADS
- yaz_log (LOG_LOG, "pth_init");
- pth_init ();
-#endif
- nmem_active_no = 0;
- freelist = NULL;
- cfreelist = NULL;
- }
-}
-
-void nmem_exit (void)
-{
- if (--nmem_init_flag == 0)
- {
- oid_exit();
- while (freelist)
- {
- struct nmem_block *fl = freelist;
- freelist = freelist->next;
- xfree (fl->buf);
- xfree (fl);
- }
- while (cfreelist)
- {
- struct nmem_control *cfl = cfreelist;
- cfreelist = cfreelist->next;
- xfree (cfl);
- }
-#ifdef WIN32
- DeleteCriticalSection(&critical_section);
-#endif
- }
-}
-
-
-#ifdef WIN32
-BOOL WINAPI DllMain (HINSTANCE hinstDLL,
- DWORD reason,
- LPVOID reserved)
-{
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- nmem_init ();
- break;
- case DLL_PROCESS_DETACH:
- nmem_exit ();
- }
- return TRUE;
-}
-#endif
-
-int yaz_errno(void)
-{
- return errno;
-}
-
-void yaz_set_errno(int v)
-{
- errno = v;
-}
-
-void yaz_strerror(char *buf, int max)
-{
- char *cp;
-#ifdef WIN32
- DWORD err = GetLastError();
- if (err)
- {
- FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default lang */
- (LPTSTR) buf,
- max-1,
- NULL);
- }
- else
- *buf = '\0';
-#else
-/* UNIX */
-#if HAVE_STRERROR_R
-#if YAZ_POSIX_THREADS
- *buf = '\0';
- strerror_r(errno, buf, max);
- /* if buffer is unset - use strerror anyway (GLIBC bug) */
- if (*buf == '\0')
- strcpy(buf, strerror(yaz_errno()));
-#else
- strcpy(buf, strerror(yaz_errno()));
-#endif
-#else
- strcpy(buf, strerror(yaz_errno()));
-#endif
-/* UNIX */
-#endif
- if ((cp=strrchr(buf, '\n')))
- *cp = '\0';
- if ((cp=strrchr(buf, '\r')))
- *cp = '\0';
-}
+++ /dev/null
-/*
- * Copyright (c) 1997-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: nmemsdup.c,v 1.6 2003-03-18 13:34:37 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <yaz/nmem.h>
-
-char *nmem_strdup (NMEM mem, const char *src)
-{
- char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
- strcpy (dst, src);
- return dst;
-}
-
-char *nmem_strdupn (NMEM mem, const char *src, size_t n)
-{
- char *dst = (char *)nmem_malloc (mem, n+1);
- memcpy (dst, src, n);
- dst[n] = '\0';
- return dst;
-}
-
-int *nmem_intdup(NMEM mem, int v)
-{
- int *dst = (int*) nmem_malloc (mem, sizeof(int));
- *dst = v;
- return dst;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: oid.c,v 1.68 2003-09-11 12:30:59 mike Exp $
- */
-
-/*
- * More or less protocol-transparent OID database.
- * We could (and should?) extend this so that the user app can add new
- * entries to the list at initialization.
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/oid.h>
-#include <yaz/yaz-util.h>
-
-static int z3950_prefix[] = { 1, 2, 840, 10003, -1 };
-static int sr_prefix[] = { 1, 0, 10163, -1 };
-
-struct oident_list {
- struct oident oident;
- struct oident_list *next;
-};
-
-static struct oident_list *oident_table = NULL;
-static int oid_value_dynamic = VAL_DYNAMIC;
-static int oid_init_flag = 0;
-static NMEM_MUTEX oid_mutex = 0;
-static NMEM oid_nmem = 0;
-
-/*
- * OID database
- */
-static oident standard_oids[] =
-{
- /* General definitions */
- {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER, {2,1,1,-1},
- "BER" },
- {PROTO_GENERAL, CLASS_TRANSYN, VAL_ISO2709, {1,0,2709,1,1,-1},
- "ISO2709"},
- {PROTO_GENERAL, CLASS_GENERAL, VAL_ISO_ILL_1, {1,0,10161,2,1,-1},
- "ISOILL-1"},
- /* Z39.50v3 definitions */
- {PROTO_Z3950, CLASS_ABSYN, VAL_APDU, {2,1,-1},
- "Z-APDU"},
- {PROTO_Z3950, CLASS_APPCTX, VAL_BASIC_CTX, {1,1,-1},
- "Z-BASIC"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_BIB1, {3,1,-1},
- "Bib-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_EXP1, {3,2,-1},
- "Exp-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_EXT1, {3,3,-1},
- "Ext-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_CCL1, {3,4,-1},
- "CCL-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1},
- "GILS-attset"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1},
- "GILS"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_STAS, {3,6,-1},
- "STAS-attset"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_COLLECT1, {3,7,-1},
- "Collections-attset"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_CIMI1, {3,8,-1},
- "CIMI-attset"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_GEO, {3,9,-1},
- "Geo-attset"},
-
- {PROTO_Z3950, CLASS_ATTSET, VAL_ZBIG, {3,10,-1},
- "ZBIG"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_UTIL, {3,11,-1},
- "Util"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_XD1, {3,12,-1},
- "XD-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_ZTHES, {3,13,-1},
- "Zthes"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_FIN1, {3,14,-1},
- "Fin-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_DAN1, {3,15,-1},
- "Dan-1"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_HOLDINGS, {3,16,-1},
- "Holdings"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_USMARC, {3,17,-1},
- "MARC"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_BIB2, {3,18,-1},
- "Bib-2"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_ZEEREX, {3,19,-1},
- "ZeeRex"},
- /* New applications should use Zthes-1 instead of this Satan-spawn */
- {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1},
- "Thesaurus-attset"},
- {PROTO_Z3950, CLASS_ATTSET, VAL_IDXPATH, {3,1000,81,2,-1},
- "IDXPATH"},
- {PROTO_Z3950, CLASS_DIAGSET, VAL_BIB1, {4,1,-1},
- "Bib-1"},
- {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG1, {4,2,-1},
- "Diag-1"},
- {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_ES, {4,3,-1},
- "Diag-ES"},
- {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_GENERAL, {4,3,-1},
- "Diag-General"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_UNIMARC, {5,1,-1},
- "Unimarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_INTERMARC, {5,2,-1},
- "Intermarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_CCF, {5,3,-1},
- "CCF"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_USMARC, {5,10,-1},
- "USmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_UKMARC, {5,11,-1},
- "UKmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_NORMARC, {5,12,-1},
- "Normarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_LIBRISMARC, {5,13,-1},
- "Librismarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_DANMARC, {5,14,-1},
- "Danmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_FINMARC, {5,15,-1},
- "Finmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_MAB, {5,16,-1},
- "MAB"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_CANMARC, {5,17,-1},
- "Canmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SBN, {5,18,-1},
- "SBN"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_PICAMARC, {5,19,-1},
- "Picamarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_AUSMARC, {5,20,-1},
- "Ausmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_IBERMARC, {5,21,-1},
- "Ibermarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_CATMARC, {5,22,-1},
- "Carmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_MALMARC, {5,23,-1},
- "Malmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_JPMARC, {5,24,-1},
- "JPmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SWEMARC, {5,25,-1},
- "SWEmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SIGLEMARC, {5,26,-1},
- "SIGLEmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_ISDSMARC, {5,27,-1},
- "ISDSmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_RUSMARC, {5,28,-1},
- "RUSmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_HUNMARC, {5,29,-1},
- "Hunmarc"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_EXPLAIN, {5,100,-1},
- "Explain"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SUTRS, {5,101,-1},
- "SUTRS"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_OPAC, {5,102,-1},
- "OPAC"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SUMMARY, {5,103,-1},
- "Summary"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_GRS0, {5,104,-1},
- "GRS-0"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_GRS1, {5,105,-1},
- "GRS-1"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_EXTENDED, {5,106,-1},
- "Extended"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_FRAGMENT, {5,107,-1},
- "Fragment"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_PDF, {5,109,1,-1},
- "pdf"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_POSTSCRIPT, {5,109,2,-1},
- "postscript"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_HTML, {5,109,3,-1},
- "html"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_TIFF, {5,109,4,-1},
- "tiff"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_GIF, {5,109,5,-1},
- "gif"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_JPEG, {5,109,6,-1},
- "jpeg"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_PNG, {5,109,7,-1},
- "png"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_MPEG, {5,109,8,-1},
- "mpeg"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SGML, {5,109,9,-1},
- "sgml"},
-
- {PROTO_Z3950, CLASS_RECSYN, VAL_TIFFB, {5,110,1,-1},
- "tiff-b"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_WAV, {5,110,2,-1},
- "wav"},
-
- {PROTO_Z3950, CLASS_RECSYN, VAL_SQLRS, {5,111,-1},
- "SQL-RS"},
- {PROTO_Z3950, CLASS_RECSYN, VAL_SOIF, {5,1000,81,2,-1},
- "SOIF" },
- {PROTO_Z3950, CLASS_RECSYN, VAL_TEXT_XML, {5,109,10,-1},
- "text-XML" },
- {PROTO_Z3950, CLASS_RECSYN, VAL_TEXT_XML, {5,109,10,-1},
- "XML" },
- {PROTO_Z3950, CLASS_RECSYN, VAL_APPLICATION_XML, {5,109,11,-1},
- "application-XML" },
- {PROTO_Z3950, CLASS_RESFORM, VAL_RESOURCE1, {7,1,-1},
- "Resource-1"},
- {PROTO_Z3950, CLASS_RESFORM, VAL_RESOURCE2, {7,2,-1},
- "Resource-2"},
- {PROTO_Z3950, CLASS_RESFORM, VAL_UNIVERSE_REPORT, {7,1000,81,1,-1},
- "UNIverse-Resource-Report"},
-
- {PROTO_Z3950, CLASS_ACCFORM, VAL_PROMPT1, {8,1,-1},
- "Prompt-1"},
- {PROTO_Z3950, CLASS_ACCFORM, VAL_DES1, {8,2,-1},
- "Des-1"},
- {PROTO_Z3950, CLASS_ACCFORM, VAL_KRB1, {8,3,-1},
- "Krb-1"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_PRESSET, {9,1,-1},
- "Pers. set"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_PQUERY, {9,2,-1},
- "Pers. query"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_PCQUERY, {9,3,-1},
- "Per'd query"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1},
- "Item order"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE0, {9,5,-1},
- "DB. Update (first version)"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE1, {9,5,1,-1},
- "DB. Update (second version)"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE, {9,5,1,1,-1},
- "DB. Update"},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTSPEC, {9,6,-1},
- "exp. spec."},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1},
- "exp. inv."},
- {PROTO_Z3950, CLASS_EXTSERV, VAL_ADMINSERVICE, {9,1000,81,1,-1},
- "Admin"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_SEARCHRES1, {10,1,-1},
- "searchResult-1"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_CHARLANG, {10,2,-1},
- "CharSetandLanguageNegotiation"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_USERINFO1, {10,3,-1},
- "UserInfo-1"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_MULTISRCH1, {10,4,-1},
- "MultipleSearchTerms-1"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_MULTISRCH2, {10,5,-1},
- "MultipleSearchTerms-2"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_DATETIME, {10,6,-1},
- "DateTime"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_PROXY, {10,1000,81,1,-1},
- "Proxy" },
- {PROTO_Z3950, CLASS_USERINFO,VAL_COOKIE, {10,1000,81,2,-1},
- "Cookie" },
- {PROTO_Z3950, CLASS_USERINFO,VAL_CLIENT_IP, {10,1000,81,3,-1},
- "Client-IP" },
- {PROTO_Z3950, CLASS_ELEMSPEC,VAL_ESPEC1, {11,1,-1},
- "Espec-1"},
- {PROTO_Z3950, CLASS_VARSET, VAL_VAR1, {12,1,-1},
- "Variant-1"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_WAIS, {13,1,-1},
- "WAIS-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_GILS, {13,2,-1},
- "GILS-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_COLLECT1, {13,3,-1},
- "Collections-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_GEO, {13,4,-1},
- "Geo-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_CIMI1, {13,5,-1},
- "CIMI-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_UPDATEES, {13,6,-1},
- "Update ES"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_HOLDINGS, {13,7,-1},
- "Holdings"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_ZTHES, {13,8,-1},
- "Zthes"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_THESAURUS, {13,1000,81,1,-1},
- "thesaurus-schema"},
- {PROTO_Z3950, CLASS_SCHEMA, VAL_EXPLAIN, {13,1000,81,2,-1},
- "Explain-schema"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_SETM, {14,1,-1},
- "TagsetM"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_SETG, {14,2,-1},
- "TagsetG"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_STAS, {14,3,-1},
- "STAS-tagset"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_GILS, {14,4,-1},
- "GILS-tagset"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_COLLECT1, {14,5,-1},
- "Collections-tagset"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_CIMI1, {14,6,-1},
- "CIMI-tagset"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_THESAURUS, {14,1000,81,1,-1},
- "thesaurus-tagset"}, /* What is this Satan-spawn doing here? */
- {PROTO_Z3950, CLASS_TAGSET, VAL_EXPLAIN, {14,1000,81,2,-1},
- "Explain-tagset"},
- {PROTO_Z3950, CLASS_TAGSET, VAL_ZTHES, {14,8,-1},
- "Zthes-tagset"},
- {PROTO_Z3950, CLASS_NEGOT, VAL_CHARNEG3, {15,3,-1},
- "CharSetandLanguageNegotiation-3"},
- {PROTO_Z3950, CLASS_NEGOT, VAL_ID_CHARSET, {15,1000,81,1,-1},
- "ID-Charset" },
- {PROTO_Z3950, CLASS_USERINFO,VAL_CQL, {16, 2, -1},
- "CQL"},
- {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS2, {1,0,10646,1,0,2,-1},
- "UCS-2"},
- {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS4, {1,0,10646,1,0,4,-1},
- "UCS-4"},
- {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF16, {1,0,10646,1,0,5,-1},
- "UTF-16"},
- {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF8, {1,0,10646,1,0,8,-1},
- "UTF-8"},
- {PROTO_Z3950, CLASS_USERINFO,VAL_OCLCUI, {10, 1000, 17, 1, -1},
- "OCLC-userInfo"},
- {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 }
-};
-
-/* OID utilities */
-
-void oid_oidcpy(int *t, int *s)
-{
- while ((*(t++) = *(s++)) > -1);
-}
-
-void oid_oidcat(int *t, int *s)
-{
- while (*t > -1)
- t++;
- while ((*(t++) = *(s++)) > -1);
-}
-
-int oid_oidcmp(int *o1, int *o2)
-{
- while (*o1 == *o2 && *o1 > -1)
- {
- o1++;
- o2++;
- }
- if (*o1 == *o2)
- return 0;
- else if (*o1 > *o2)
- return 1;
- else
- return -1;
-}
-
-int oid_oidlen(int *o)
-{
- int len = 0;
-
- while (*(o++) >= 0)
- len++;
- return len;
-}
-
-
-static int match_prefix(int *look, int *prefix)
-{
- int len;
-
- for (len = 0; *look == *prefix; look++, prefix++, len++);
- if (*prefix < 0) /* did we reach the end of the prefix? */
- return len;
- return 0;
-}
-
-void oid_transfer (struct oident *oidentp)
-{
- while (*oidentp->oidsuffix >= 0)
- {
- oid_addent (oidentp->oidsuffix, oidentp->proto,
- oidentp->oclass,
- oidentp->desc, oidentp->value);
- oidentp++;
- }
-}
-
-void oid_init (void)
-{
- if (oid_init_flag == 0)
- {
- /* oid_transfer is thread safe, so there's nothing wrong in having
- two threads calling it simultaniously. On the other hand
- no thread may exit oid_init before all OID's bave been
- transferred - which is why checked is set after oid_transfer...
- */
- nmem_mutex_create (&oid_mutex);
- nmem_mutex_enter (oid_mutex);
- if (!oid_nmem)
- oid_nmem = nmem_create ();
- nmem_mutex_leave (oid_mutex);
- oid_transfer (standard_oids);
- oid_init_flag = 1;
- }
-}
-
-void oid_exit (void)
-{
- if (oid_init_flag)
- {
- oid_init_flag = 0;
- nmem_mutex_destroy (&oid_mutex);
- nmem_destroy (oid_nmem);
- oid_nmem = 0;
- }
-}
-
-static struct oident *oid_getentbyoid_x(int *o)
-{
- enum oid_proto proto;
- int prelen;
- struct oident_list *ol;
-
- /* determine protocol type */
- if ((prelen = match_prefix(o, z3950_prefix)) != 0)
- proto = PROTO_Z3950;
- else if ((prelen = match_prefix(o, sr_prefix)) != 0)
- proto = PROTO_SR;
- else
- proto = PROTO_GENERAL;
- for (ol = oident_table; ol; ol = ol->next)
- {
- struct oident *p = &ol->oident;
- if (p->proto == proto && !oid_oidcmp(o + prelen, p->oidsuffix))
- return p;
- if (p->proto == PROTO_GENERAL && !oid_oidcmp (o, p->oidsuffix))
- return p;
- }
- return 0;
-}
-
-/*
- * To query, fill out proto, class, and value of the ent parameter.
- */
-int *oid_ent_to_oid(struct oident *ent, int *ret)
-{
- struct oident_list *ol;
-
- oid_init ();
- for (ol = oident_table; ol; ol = ol->next)
- {
- struct oident *p = &ol->oident;
- if (ent->value == p->value &&
- (p->proto == PROTO_GENERAL || (ent->proto == p->proto &&
- (ent->oclass == p->oclass || ent->oclass == CLASS_GENERAL))))
- {
- if (p->proto == PROTO_Z3950)
- oid_oidcpy(ret, z3950_prefix);
- else if (p->proto == PROTO_SR)
- oid_oidcpy(ret, sr_prefix);
- else
- ret[0] = -1;
- oid_oidcat(ret, p->oidsuffix);
- ent->desc = p->desc;
- return ret;
- }
- }
- ret[0] = -1;
- return 0;
-}
-
-/*
- * To query, fill out proto, class, and value of the ent parameter.
- */
-int *oid_getoidbyent(struct oident *ent)
-{
- static int ret[OID_SIZE];
-
- return oid_ent_to_oid (ent, ret);
-}
-
-struct oident *oid_addent (int *oid, enum oid_proto proto,
- enum oid_class oclass,
- const char *desc, int value)
-{
- struct oident *oident = 0;
-
- nmem_mutex_enter (oid_mutex);
- if (!oident)
- {
- char desc_str[200];
- struct oident_list *oident_list;
- oident_list = (struct oident_list *)
- nmem_malloc (oid_nmem, sizeof(*oident_list));
- oident = &oident_list->oident;
- oident->proto = proto;
- oident->oclass = oclass;
-
- if (!desc)
- {
- int i;
-
- sprintf (desc_str, "%d", *oid);
- for (i = 1; i < 12 && oid[i] >= 0; i++)
- sprintf (desc_str+strlen(desc_str), ".%d", oid[i]);
- desc = desc_str;
- }
- oident->desc = nmem_strdup (oid_nmem, desc);
- if (value == VAL_DYNAMIC)
- oident->value = (enum oid_value) (++oid_value_dynamic);
- else
- oident->value = (enum oid_value) value;
- oid_oidcpy (oident->oidsuffix, oid);
- oident_list->next = oident_table;
- oident_table = oident_list;
- }
- nmem_mutex_leave (oid_mutex);
- return oident;
-}
-
-struct oident *oid_getentbyoid(int *oid)
-{
- struct oident *oident;
-
- if (!oid)
- return 0;
- oid_init ();
- oident = oid_getentbyoid_x (oid);
- if (!oident)
- oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL,
- NULL, VAL_DYNAMIC);
- return oident;
-}
-
-static oid_value oid_getval_raw(const char *name)
-{
- int val = 0, i = 0, oid[OID_SIZE];
- struct oident *oident;
-
- while (isdigit (*name))
- {
- val = val*10 + (*name - '0');
- name++;
- if (*name == '.')
- {
- if (i < OID_SIZE-1)
- oid[i++] = val;
- val = 0;
- name++;
- }
- }
- oid[i] = val;
- oid[i+1] = -1;
- oident = oid_getentbyoid_x (oid);
- if (!oident)
- oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL, NULL,
- VAL_DYNAMIC);
- return oident->value;
-}
-
-oid_value oid_getvalbyname(const char *name)
-{
- struct oident_list *ol;
-
- oid_init ();
- if (isdigit (*name))
- return oid_getval_raw (name);
- for (ol = oident_table; ol; ol = ol->next)
- if (!yaz_matchstr(ol->oident.desc, name))
- {
- return ol->oident.value;
- }
- return VAL_NONE;
-}
-
-void oid_setprivateoids(oident *list)
-{
- oid_transfer (list);
-}
-
-void oid_trav (void (*func)(struct oident *oidinfo, void *vp), void *vp)
-{
- struct oident_list *ol;
-
- oid_init ();
- for (ol = oident_table; ol; ol = ol->next)
- (*func)(&ol->oident, vp);
-}
-
-int *oid_name_to_oid(oid_class oclass, const char *name, int *oid) {
- struct oident ent;
-
- /* Translate syntax to oid_val */
- oid_value value = oid_getvalbyname(name);
-
- /* Build it into an oident */
- ent.proto = PROTO_Z3950;
- ent.oclass = oclass;
- ent.value = value;
-
- /* Translate to an array of int */
- return oid_ent_to_oid(&ent, oid);
-}
-
-char *oid_to_dotstring(const int *oid, char *oidbuf) {
- char tmpbuf[20];
- int i;
-
- oidbuf[0] = '\0';
- for (i = 0; oid[i] != -1; i++) {
- sprintf(tmpbuf, "%d", oid[i]);
- if (i > 0) strcat(oidbuf, ".");
- strcat(oidbuf, tmpbuf);
- }
-
- return oidbuf;
-}
-
-char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oidbuf) {
- int oid[OID_SIZE];
-
- (void) oid_name_to_oid(oclass, name, oid);
- return oid_to_dotstring(oid, oidbuf);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2000, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: options.c,v $
- * Revision 1.8 2000-02-29 13:44:55 adam
- * Check for config.h (currently not generated).
- *
- * Revision 1.7 1999/11/30 13:47:12 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.6 1997/09/01 08:54:13 adam
- * New windows NT/95 port using MSV5.0. Made prefix query handling
- * thread safe. The function options ignores empty arguments when met.
- *
- * Revision 1.5 1995/12/06 13:00:19 adam
- * Minus alone not treated as an option.
- *
- * Revision 1.4 1995/09/29 17:12:35 quinn
- * Smallish
- *
- * Revision 1.3 1995/09/27 15:03:03 quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.2 1995/05/16 08:51:13 quinn
- * License, documentation, and memory fixes
- *
- * Revision 1.1 1995/03/27 08:35:18 quinn
- * Created util library
- * Added memory debugging module. Imported options-manager
- *
- * Revision 1.2 1994/10/04 17:47:10 adam
- * Function options now returns arg with error option.
- *
- * Revision 1.1 1994/08/16 15:57:22 adam
- * The first utility modules.
- *
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-
-#include <yaz/options.h>
-
-static int arg_no = 1;
-static int arg_off = 0;
-
-int options (const char *desc, char **argv, int argc, char **arg)
-{
- int ch, i = 0;
-
- if (arg_no >= argc)
- return -2;
- if (arg_off == 0)
- {
- while (argv[arg_no][0] == '\0')
- {
- arg_no++;
- if (arg_no >= argc)
- return -2;
- }
- if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0')
- {
- *arg = argv[arg_no++];
- return 0;
- }
- arg_off++;
- }
- ch = argv[arg_no][arg_off++];
- while (desc[i])
- {
- int desc_char = desc[i++];
- int type = 0;
- if (desc[i] == ':')
- { /* string argument */
- type = desc[i++];
- }
- if (desc_char == ch)
- { /* option with argument */
- if (type)
- {
- if (argv[arg_no][arg_off])
- {
- *arg = argv[arg_no]+arg_off;
- arg_no++;
- arg_off = 0;
- }
- else
- {
- arg_no++;
- arg_off = 0;
- if (arg_no < argc)
- *arg = argv[arg_no++];
- else
- *arg = "";
- }
- }
- else /* option with no argument */
- {
- if (argv[arg_no][arg_off])
- arg_off++;
- else
- {
- arg_off = 0;
- arg_no++;
- }
- }
- return ch;
- }
- }
- *arg = argv[arg_no]+arg_off-1;
- arg_no = arg_no + 1;
- arg_off = 0;
- return -1;
-}
+++ /dev/null
-/*
- * Copyright (C) 1994-2000, Index Data
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: readconf.c,v $
- * Revision 1.10 2000-02-29 13:44:55 adam
- * Check for config.h (currently not generated).
- *
- * Revision 1.9 1999/11/30 13:47:12 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.8 1999/08/27 09:40:32 adam
- * Renamed logf function to yaz_log. Removed VC++ project files.
- *
- * Revision 1.7 1999/06/30 09:10:32 adam
- * Fixed reading of MS-DOS files.
- *
- * Revision 1.6 1998/10/13 16:09:55 adam
- * Added support for arbitrary OID's for tagsets, schemas and attribute sets.
- * Added support for multiple attribute set references and tagset references
- * from an abstract syntax file.
- * Fixed many bad logs-calls in routines that read the various
- * specifications regarding data1 (*.abs,*.att,...) and made the messages
- * consistent whenever possible.
- * Added extra 'lineno' argument to function readconf_line.
- *
- * Revision 1.5 1997/09/04 07:53:02 adam
- * Added include readconf.h.
- *
- * Revision 1.4 1997/05/14 06:54:07 adam
- * C++ support.
- *
- * Revision 1.3 1996/05/29 15:48:48 quinn
- * Added \n to the isspace rule.
- *
- * Revision 1.2 1996/05/29 10:05:01 quinn
- * Changed space criteria to support 8-bit characters
- *
- * Revision 1.1 1995/11/01 13:55:06 quinn
- * Minor adjustments
- *
- * Revision 1.2 1995/10/30 13:54:27 quinn
- * iRemoved fclose().
- *
- * Revision 1.1 1995/10/10 16:28:18 quinn
- * Initial revision
- *
- *
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-
-#include <yaz/log.h>
-#include <yaz/readconf.h>
-
-#define l_isspace(c) ((c) == '\t' || (c) == ' ' || (c) == '\n' || (c) == '\r')
-
-int readconf_line(FILE *f, int *lineno, char *line, int len,
- char *argv[], int num)
-{
- char *p;
- int argc;
-
- while ((p = fgets(line, len, f)))
- {
- (*lineno)++;
- while (*p && l_isspace(*p))
- p++;
- if (*p && *p != '#')
- break;
- }
- if (!p)
- return 0;
-
- for (argc = 0; *p ; argc++)
- {
- if (*p == '#') /* trailing comment */
- break;
- argv[argc] = p;
- while (*p && !l_isspace(*p))
- p++;
- if (*p)
- {
- *(p++) = '\0';
- while (*p && l_isspace(*p))
- p++;
- }
- }
- return argc;
-}
-
-/*
- * Read lines of a configuration file.
- */
-int readconf(char *name, void *rprivate,
- int (*fun)(char *name, void *rprivate, int argc, char *argv[]))
-{
- FILE *f;
- char line[512], *m_argv[50];
- int m_argc;
- int lineno = 0;
-
- if (!(f = fopen(name, "r")))
- {
- yaz_log(LOG_WARN|LOG_ERRNO, "readconf: %s", name);
- return -1;
- }
- for (;;)
- {
- int res;
-
- if (!(m_argc = readconf_line(f, &lineno, line, 512, m_argv, 50)))
- {
- fclose(f);
- return 0;
- }
-
- if ((res = (*fun)(name, rprivate, m_argc, m_argv)))
- {
- fclose(f);
- return res;
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 1997-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: siconv.c,v 1.9 2003-01-06 08:20:28 adam Exp $
- */
-
-/* mini iconv and wrapper for system iconv library (if present) */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-#include <ctype.h>
-#if HAVE_WCHAR_H
-#include <wchar.h>
-#endif
-
-#if HAVE_ICONV_H
-#include <iconv.h>
-#endif
-
-#include <yaz/yaz-util.h>
-
-unsigned long yaz_marc8_conv (unsigned char *inp, size_t inbytesleft,
- size_t *no_read);
-
-struct yaz_iconv_struct {
- int my_errno;
- int init_flag;
- size_t (*init_handle)(yaz_iconv_t cd, unsigned char *inbuf,
- size_t inbytesleft, size_t *no_read);
- unsigned long (*read_handle)(yaz_iconv_t cd, unsigned char *inbuf,
- size_t inbytesleft, size_t *no_read);
- size_t (*write_handle)(yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft);
-#if HAVE_ICONV_H
- iconv_t iconv_cd;
-#endif
-};
-
-static unsigned long yaz_read_ISO8859_1 (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- unsigned long x = inp[0];
- *no_read = 1;
- return x;
-}
-
-static size_t yaz_init_UTF8 (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- if (inp[0] != 0xef)
- {
- *no_read = 0;
- return 0;
- }
- if (inbytesleft < 3)
- {
- cd->my_errno = YAZ_ICONV_EINVAL;
- return (size_t) -1;
- }
- if (inp[1] != 0xbb || inp[2] != 0xbf)
- {
- cd->my_errno = YAZ_ICONV_EILSEQ;
- return (size_t) -1;
- }
- *no_read = 3;
- return 0;
-}
-
-static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- unsigned long x = 0;
-
- if (inp[0] <= 0x7f)
- {
- x = inp[0];
- *no_read = 1;
- }
- else if (inp[0] <= 0xbf || inp[0] >= 0xfe)
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- else if (inp[0] <= 0xdf && inbytesleft >= 2)
- {
- x = ((inp[0] & 0x1f) << 6) | (inp[1] & 0x3f);
- if (x >= 0x80)
- *no_read = 2;
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- }
- else if (inp[0] <= 0xef && inbytesleft >= 3)
- {
- x = ((inp[0] & 0x0f) << 12) | ((inp[1] & 0x3f) << 6) |
- (inp[1] & 0x3f);
- if (x >= 0x800)
- *no_read = 3;
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- }
- else if (inp[0] <= 0xf7 && inbytesleft >= 4)
- {
- x = ((inp[0] & 0x07) << 18) | ((inp[1] & 0x3f) << 12) |
- ((inp[2] & 0x3f) << 6) | (inp[3] & 0x3f);
- if (x >= 0x10000)
- *no_read = 4;
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- }
- else if (inp[0] <= 0xfb && inbytesleft >= 5)
- {
- x = ((inp[0] & 0x03) << 24) | ((inp[1] & 0x3f) << 18) |
- ((inp[2] & 0x3f) << 12) | ((inp[3] & 0x3f) << 6) |
- (inp[4] & 0x3f);
- if (x >= 0x200000)
- *no_read = 5;
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- }
- else if (inp[0] <= 0xfd && inbytesleft >= 6)
- {
- x = ((inp[0] & 0x01) << 30) | ((inp[1] & 0x3f) << 24) |
- ((inp[2] & 0x3f) << 18) | ((inp[3] & 0x3f) << 12) |
- ((inp[4] & 0x3f) << 6) | (inp[5] & 0x3f);
- if (x >= 0x4000000)
- *no_read = 6;
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EILSEQ;
- }
- }
- else
- {
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EINVAL;
- }
- return x;
-}
-
-static unsigned long yaz_read_UCS4 (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- unsigned long x = 0;
-
- if (inbytesleft < 4)
- {
- cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
- *no_read = 0;
- }
- else
- {
- x = (inp[0]<<24) | (inp[1]<<16) | (inp[2]<<8) | inp[3];
- *no_read = 4;
- }
- return x;
-}
-
-static unsigned long yaz_read_UCS4LE (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- unsigned long x = 0;
-
- if (inbytesleft < 4)
- {
- cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
- *no_read = 0;
- }
- else
- {
- x = (inp[3]<<24) | (inp[2]<<16) | (inp[1]<<8) | inp[0];
- *no_read = 4;
- }
- return x;
-}
-
-#if HAVE_WCHAR_H
-static unsigned long yaz_read_wchar_t (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- unsigned long x = 0;
-
- if (inbytesleft < sizeof(wchar_t))
- {
- cd->my_errno = YAZ_ICONV_EINVAL; /* incomplete input */
- *no_read = 0;
- }
- else
- {
- wchar_t wch;
- memcpy (&wch, inp, sizeof(wch));
- x = wch;
- *no_read = sizeof(wch);
- }
- return x;
-}
-#endif
-
-static unsigned long yaz_read_marc8 (yaz_iconv_t cd, unsigned char *inp,
- size_t inbytesleft, size_t *no_read)
-{
- return yaz_marc8_conv(inp, inbytesleft, no_read);
-}
-
-static size_t yaz_write_UTF8 (yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft)
-{
- unsigned char *outp = (unsigned char *) *outbuf;
- if (x <= 0x7f && *outbytesleft >= 1)
- {
- *outp++ = (unsigned char) x;
- (*outbytesleft)--;
- }
- else if (x <= 0x7ff && *outbytesleft >= 2)
- {
- *outp++ = (unsigned char) ((x >> 6) | 0xc0);
- *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
- (*outbytesleft) -= 2;
- }
- else if (x <= 0xffff && *outbytesleft >= 3)
- {
- *outp++ = (unsigned char) ((x >> 12) | 0xe0);
- *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
- *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
- (*outbytesleft) -= 3;
- }
- else if (x <= 0x1fffff && *outbytesleft >= 4)
- {
- *outp++ = (unsigned char) ((x >> 18) | 0xf0);
- *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
- *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
- (*outbytesleft) -= 4;
- }
- else if (x <= 0x3ffffff && *outbytesleft >= 5)
- {
- *outp++ = (unsigned char) ((x >> 24) | 0xf8);
- *outp++ = (unsigned char) (((x >> 18) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
- *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
- (*outbytesleft) -= 5;
- }
- else if (*outbytesleft >= 6)
- {
- *outp++ = (unsigned char) ((x >> 30) | 0xfc);
- *outp++ = (unsigned char) (((x >> 24) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 18) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 12) & 0x3f) | 0x80);
- *outp++ = (unsigned char) (((x >> 6) & 0x3f) | 0x80);
- *outp++ = (unsigned char) ((x & 0x3f) | 0x80);
- (*outbytesleft) -= 6;
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG; /* not room for output */
- return (size_t)(-1);
- }
- *outbuf = (char *) outp;
- return 0;
-}
-
-static size_t yaz_write_ISO8859_1 (yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft)
-{
- unsigned char *outp = (unsigned char *) *outbuf;
- if (x > 255 || x < 1)
- {
- cd->my_errno = YAZ_ICONV_EILSEQ;
- return (size_t) -1;
- }
- else if (*outbytesleft >= 1)
- {
- *outp++ = (unsigned char) x;
- (*outbytesleft)--;
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG;
- return (size_t)(-1);
- }
- *outbuf = (char *) outp;
- return 0;
-}
-
-
-static size_t yaz_write_UCS4 (yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft)
-{
- unsigned char *outp = (unsigned char *) *outbuf;
- if (*outbytesleft >= 4)
- {
- *outp++ = (unsigned char) (x<<24);
- *outp++ = (unsigned char) (x<<16);
- *outp++ = (unsigned char) (x<<8);
- *outp++ = (unsigned char) x;
- (*outbytesleft) -= 4;
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG;
- return (size_t)(-1);
- }
- *outbuf = (char *) outp;
- return 0;
-}
-
-static size_t yaz_write_UCS4LE (yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft)
-{
- unsigned char *outp = (unsigned char *) *outbuf;
- if (*outbytesleft >= 4)
- {
- *outp++ = (unsigned char) x;
- *outp++ = (unsigned char) (x<<8);
- *outp++ = (unsigned char) (x<<16);
- *outp++ = (unsigned char) (x<<24);
- (*outbytesleft) -= 4;
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG;
- return (size_t)(-1);
- }
- *outbuf = (char *) outp;
- return 0;
-}
-
-#if HAVE_WCHAR_H
-static size_t yaz_write_wchar_t (yaz_iconv_t cd, unsigned long x,
- char **outbuf, size_t *outbytesleft)
-{
- unsigned char *outp = (unsigned char *) *outbuf;
-
- if (*outbytesleft >= sizeof(wchar_t))
- {
- wchar_t wch = x;
- memcpy(outp, &wch, sizeof(wch));
- outp += sizeof(wch);
- (*outbytesleft) -= sizeof(wch);
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG;
- return (size_t)(-1);
- }
- *outbuf = (char *) outp;
- return 0;
-}
-#endif
-
-int yaz_iconv_isbuiltin(yaz_iconv_t cd)
-{
- return cd->read_handle && cd->write_handle;
-}
-
-yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode)
-{
- yaz_iconv_t cd = (yaz_iconv_t) xmalloc (sizeof(*cd));
-
- cd->write_handle = 0;
- cd->read_handle = 0;
- cd->init_handle = 0;
- cd->my_errno = YAZ_ICONV_UNKNOWN;
-
- /* a useful hack: if fromcode has leading @,
- the library not use YAZ's own conversions .. */
- if (fromcode[0] == '@')
- fromcode++;
- else
- {
- if (!yaz_matchstr(fromcode, "UTF8"))
- {
- cd->read_handle = yaz_read_UTF8;
- cd->init_handle = yaz_init_UTF8;
- }
- else if (!yaz_matchstr(fromcode, "ISO88591"))
- cd->read_handle = yaz_read_ISO8859_1;
- else if (!yaz_matchstr(fromcode, "UCS4"))
- cd->read_handle = yaz_read_UCS4;
- else if (!yaz_matchstr(fromcode, "UCS4LE"))
- cd->read_handle = yaz_read_UCS4LE;
- else if (!yaz_matchstr(fromcode, "MARC8"))
- cd->read_handle = yaz_read_marc8;
-#if HAVE_WCHAR_H
- else if (!yaz_matchstr(fromcode, "WCHAR_T"))
- cd->read_handle = yaz_read_wchar_t;
-#endif
-
- if (!yaz_matchstr(tocode, "UTF8"))
- cd->write_handle = yaz_write_UTF8;
- else if (!yaz_matchstr(tocode, "ISO88591"))
- cd->write_handle = yaz_write_ISO8859_1;
- else if (!yaz_matchstr (tocode, "UCS4"))
- cd->write_handle = yaz_write_UCS4;
- else if (!yaz_matchstr(tocode, "UCS4LE"))
- cd->write_handle = yaz_write_UCS4LE;
-#if HAVE_WCHAR_H
- else if (!yaz_matchstr(tocode, "WCHAR_T"))
- cd->write_handle = yaz_write_wchar_t;
-#endif
- }
-#if HAVE_ICONV_H
- cd->iconv_cd = 0;
- if (!cd->read_handle || !cd->write_handle)
- {
- cd->iconv_cd = iconv_open (tocode, fromcode);
- if (cd->iconv_cd == (iconv_t) (-1))
- {
- xfree (cd);
- return 0;
- }
- }
-#else
- if (!cd->read_handle || !cd->write_handle)
- {
- xfree (cd);
- return 0;
- }
-#endif
- cd->init_flag = 1;
- return cd;
-}
-
-size_t yaz_iconv (yaz_iconv_t cd, char **inbuf, size_t *inbytesleft,
- char **outbuf, size_t *outbytesleft)
-{
- char *inbuf0;
- size_t r = 0;
-#if HAVE_ICONV_H
- if (cd->iconv_cd)
- {
- size_t r =
- iconv(cd->iconv_cd, inbuf, inbytesleft, outbuf, outbytesleft);
- if (r == (size_t)(-1))
- {
- switch (yaz_errno())
- {
- case E2BIG:
- cd->my_errno = YAZ_ICONV_E2BIG;
- break;
- case EINVAL:
- cd->my_errno = YAZ_ICONV_EINVAL;
- break;
- case EILSEQ:
- cd->my_errno = YAZ_ICONV_EILSEQ;
- break;
- default:
- cd->my_errno = YAZ_ICONV_UNKNOWN;
- }
- }
- return r;
- }
-#endif
- if (inbuf == 0 || *inbuf == 0)
- {
- cd->init_flag = 1;
- cd->my_errno = YAZ_ICONV_UNKNOWN;
- return 0;
- }
- inbuf0 = *inbuf;
-
- if (cd->init_flag)
- {
- if (cd->init_handle)
- {
- size_t no_read;
- size_t r = (cd->init_handle)(cd, (unsigned char *) *inbuf,
- *inbytesleft, &no_read);
- if (r)
- {
- if (cd->my_errno == YAZ_ICONV_EINVAL)
- return r;
- cd->init_flag = 0;
- return r;
- }
- *inbytesleft -= no_read;
- *inbuf += no_read;
- }
- cd->init_flag = 0;
- }
- while (1)
- {
- unsigned long x;
- size_t no_read;
-
- if (*inbytesleft == 0)
- {
- r = *inbuf - inbuf0;
- break;
- }
-
- x = (cd->read_handle)(cd, (unsigned char *) *inbuf, *inbytesleft,
- &no_read);
- if (no_read == 0)
- {
- r = (size_t)(-1);
- break;
- }
- r = (cd->write_handle)(cd, x, outbuf, outbytesleft);
- if (r)
- break;
- *inbytesleft -= no_read;
- (*inbuf) += no_read;
- }
- return r;
-}
-
-int yaz_iconv_error (yaz_iconv_t cd)
-{
- return cd->my_errno;
-}
-
-int yaz_iconv_close (yaz_iconv_t cd)
-{
-#if HAVE_ICONV_H
- if (cd->iconv_cd)
- iconv_close (cd->iconv_cd);
-#endif
- xfree (cd);
- return 0;
-}
-
-
--- /dev/null
+/*
+ * Copyright (c) 2002-2003, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: srwtst.c,v 1.1 2003-10-27 12:21:40 adam Exp $
+ */
+
+#include <yaz/srw.h>
+
+#if HAVE_XML2
+Z_SOAP_Handler h[2] = {
+ {"http://www.loc.gov/zing/srw/v1.0/", 0, (Z_SOAP_fun) yaz_srw_codec},
+ {0, 0, 0}
+};
+
+int main(int argc, char **argv)
+{
+ char buf[163840];
+ char *content_buf = buf;
+ int content_len;
+ int ret;
+ size_t no;
+ Z_SOAP *soap_package = 0;
+ ODR decode, encode;
+ int debug = 0;
+
+ nmem_init();
+ if (argc == 2 && !strcmp(argv[1], "debug"))
+ debug = 1;
+ no = fread(buf, 1, sizeof(buf), stdin);
+ if (no < 1 || no == sizeof(buf))
+ {
+ fprintf(stderr, "Bad file or too big\n");
+ exit (1);
+ }
+ decode = odr_createmem(ODR_DECODE);
+ encode = odr_createmem(ODR_ENCODE);
+ content_len = no;
+ ret = z_soap_codec(decode, &soap_package,
+ &content_buf, &content_len, h);
+ if (!soap_package)
+ {
+ fprintf(stderr, "Decoding seriously failed\n");
+ exit(1);
+ }
+ if (debug)
+ {
+ fprintf(stderr, "got NS = %s\n", soap_package->ns);
+ if (soap_package->which == Z_SOAP_generic &&
+ soap_package->u.generic->no == 0)
+ {
+ Z_SRW_PDU *sr = soap_package->u.generic->p;
+ if (sr->which == Z_SRW_searchRetrieve_request)
+ {
+ Z_SRW_searchRetrieveRequest *req = sr->u.request;
+ switch(req->query_type)
+ {
+ case Z_SRW_query_type_cql:
+ fprintf(stderr, "CQL: %s\n", req->query.cql);
+ break;
+ case Z_SRW_query_type_xcql:
+ fprintf(stderr, "XCQL\n");
+ break;
+ case Z_SRW_query_type_pqf:
+ fprintf(stderr, "PQF: %s\n", req->query.pqf);
+ break;
+ }
+ }
+ else if (sr->which == Z_SRW_searchRetrieve_response)
+ {
+ Z_SRW_searchRetrieveResponse *res = sr->u.response;
+ if (res->records && res->num_records)
+ {
+ int i;
+ for (i = 0; i<res->num_records; i++)
+ {
+ fprintf (stderr, "%d\n", i);
+ if (res->records[i].recordData_buf)
+ fwrite(res->records[i].recordData_buf, 1,
+ res->records[i].recordData_len, stderr);
+ }
+ }
+ }
+
+ }
+ }
+ ret = z_soap_codec(encode, &soap_package,
+ &content_buf, &content_len, h);
+ if (content_buf && content_len)
+ fwrite (content_buf, content_len, 1, stdout);
+ else
+ {
+ fprintf(stderr, "No output!\n");
+ exit(1);
+ }
+ odr_destroy(decode);
+ odr_destroy(encode);
+ nmem_exit();
+ exit(0);
+}
+#else
+int main(int argc, char **argv)
+{
+ fprintf(stderr, "SOAP disabled\n");
+ exit(1);
+}
+#endif
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: tpath.c,v 1.9 2003-01-06 08:20:28 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <yaz/tpath.h>
-#include <yaz/log.h>
-
-FILE *yaz_path_fopen(const char *path, const char *name, const char *mode)
-{
- return yaz_fopen (path, name, mode, 0);
-}
-
-int yaz_fclose (FILE *f)
-{
- return fclose (f);
-}
-
-FILE *yaz_fopen(const char *path, const char *name, const char *mode,
- const char *base)
-{
- char spath[1024];
-
- for(;;)
- {
- FILE *f;
-
- const char *path_sep = 0;
- size_t len = 0;
- size_t slen = 0;
-
- *spath = '\0';
- if (path)
- {
- /* somewhat dirty since we have to consider Windows
- * drive letters..
- */
- if (strchr ("/\\.", *path))
- {
- path_sep = strchr (path+1, ':');
- }
- else if (path[0] && path[1])
- path_sep = strchr (path+2, ':');
- if (path_sep)
- len = path_sep - path;
- else
- len = strlen(path);
- if (!strchr ("/\\", *path) && base)
- {
- strcpy (spath, base);
- slen = strlen(spath);
- spath[slen++] = '/';
- }
- memcpy (spath+slen, path, len);
- slen += len;
- if (!strchr("/\\", spath[slen-1]))
- spath[slen++] = '/';
- }
- strcpy (spath+slen, name);
- if ((f = fopen(spath, mode)))
- return f;
-
- if (!path_sep)
- break;
- path = path_sep+1;
- }
- return 0;
-}
-
-int yaz_is_abspath (const char *p)
-{
- if (*p == '/')
- return 1;
-#ifdef WIN32
- if (*p == '\\')
- return 1;
- if (*p && p[1] == ':' && isalpha(*p))
- return 1;
-#endif
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tsticonv.c,v 1.5 2003-06-22 11:48:33 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/yaz-util.h>
-
-/* some test strings in ISO-8859-1 format */
-const char *buf[] = {
- "ax" ,
- "\330",
- "eneb\346r",
- "\xfc",
- "\xfb",
- "\xfbr",
- 0 };
-
-/* some test strings in MARC-8 format */
-const char *marc8_strings[] = {
- "ax",
- "\xa2", /* latin capital letter o with stroke */
- "eneb\xb5r", /* latin small letter ae */
- "\xe8\x75", /* latin small letter u with umlaut */
- "\xe3\x75", /* latin small letter u with circumflex */
- "\xe3\x75r", /* latin small letter u with circumflex */
- 0
-};
-
-static void marc8_tst()
-{
- int i;
- yaz_iconv_t cd;
-
- cd = yaz_iconv_open("ISO-8859-1", "MARC8");
- for (i = 0; buf[i]; i++)
- {
- size_t r;
- char *inbuf= (char*) marc8_strings[i];
- size_t inbytesleft = strlen(inbuf);
- char outbuf0[24];
- char *outbuf = outbuf0;
- size_t outbytesleft = sizeof(outbuf0);
-
- r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
- if (r == (size_t) (-1))
- {
- int e = yaz_iconv_error(cd);
-
- printf ("tsticonv 6 i=%d e=%d\n", i, e);
- exit(6);
- }
- if ((outbuf - outbuf0) != strlen(buf[i])
- || memcmp(outbuf0, buf[i], strlen(buf[i])))
- {
- printf ("tsticonv 7 i=%d\n", i);
- printf ("buf=%s out=%s\n", buf[i], outbuf0);
- exit(7);
- }
- }
- yaz_iconv_close(cd);
-}
-
-static void dconvert(int mandatory, const char *tmpcode)
-{
- int i;
- yaz_iconv_t cd;
- for (i = 0; buf[i]; i++)
- {
- size_t r;
- char *inbuf = (char*) buf[i];
- size_t inbytesleft = strlen(inbuf);
- char outbuf0[24];
- char outbuf1[10];
- char *outbuf = outbuf0;
- size_t outbytesleft = sizeof(outbuf0);
-
- cd = yaz_iconv_open(tmpcode, "ISO-8859-1");
- if (!cd)
- {
- if (!mandatory)
- return;
- printf ("tsticonv 1\n");
- exit(1);
- }
- r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
- if (r == (size_t)(-1))
- {
- int e = yaz_iconv_error(cd);
-
- printf ("tsticonv 2 e=%d\n", e);
- exit(2);
- }
- yaz_iconv_close(cd);
-
- cd = yaz_iconv_open("ISO-8859-1", tmpcode);
- if (!cd)
- {
- if (!mandatory)
- return;
- printf ("tsticonv 3\n");
- exit(3);
- }
- inbuf = outbuf0;
- inbytesleft = sizeof(outbuf0) - outbytesleft;
-
- outbuf = outbuf1;
- outbytesleft = sizeof(outbuf1);
- r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
- if (r == (size_t)(-1)) {
- int e = yaz_iconv_error(cd);
-
- printf ("tsticonv 4 e=%d\n", e);
- exit(4);
- }
- if (strlen(buf[i]) == (sizeof(outbuf1) - outbytesleft) &&
- memcmp(outbuf1, buf[i], strlen(buf[i])))
- {
- printf ("tsticonv 5\n");
- exit(5);
- }
- yaz_iconv_close(cd);
- }
-}
-
-int main (int argc, char **argv)
-{
- dconvert(1, "UTF-8");
- dconvert(1, "ISO-8859-1");
- dconvert(1, "UCS4");
- dconvert(0, "CP865");
- marc8_tst();
- exit (0);
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tstmatchstr.c,v 1.2 2003-06-22 11:47:18 adam Exp $
- */
-
-#include <stdio.h>
-
-#include <yaz/yaz-iconv.h>
-
-struct {
- char *s1;
- char *s2;
- int res;
-} comp_strings[] = {
- { "x", "x", 0 },
- { "x", "X", 0 },
- { "a", "b", 1 },
- { "b", "a", 1 },
- { "aa","a", 1 },
- { "a-", "a", 1 },
- { "A-b", "ab", 0},
- { "A--b", "ab", 1},
- { "A--b", "a-b", 1},
- { "A--b", "a--b", 0},
- { "a123", "a?", 0},
- {"a123", "a1.3", 0},
- {"a123", "..?", 0},
- {"a123", "a1.", 1},
- {"a123", "a...", 0},
- {0, 0, 0} };
-
-int main (int argc, char **argv)
-{
- int i;
- for (i = 0; comp_strings[i].s1; i++)
- {
- int got = yaz_matchstr(comp_strings[i].s1,comp_strings[i].s2);
- if (got > 0)
- got = 1;
- else if (got < 0)
- got = -1;
- if (got != comp_strings[i].res)
- {
- printf ("tststr %d got=%d res=%d\n", i,
- got, comp_strings[i].res);
- exit(1);
- }
- }
- exit(0);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tstnmem.c,v 1.1 2003-04-23 20:34:08 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/nmem.h>
-
-int main (int argc, char **argv)
-{
- void *cp;
- NMEM n;
- int j;
-
- nmem_init();
- n = nmem_create();
- if (!n)
- exit (1);
- for (j = 1; j<500; j++)
- {
- cp = nmem_malloc(n, j);
- if (!cp)
- exit(2);
- }
-
- for (j = 2000; j<20000; j+= 2000)
- {
- cp = nmem_malloc(n, j);
- if (!cp)
- exit(3);
- }
- nmem_destroy(n);
- nmem_exit();
- exit(0);
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: tstwrbuf.c,v 1.2 2003-06-23 10:22:21 adam Exp $
- */
-
-#include <stdio.h>
-
-#include <yaz/wrbuf.h>
-
-int main (int argc, char **argv)
-{
- int step;
- WRBUF wr = wrbuf_alloc();
-
- wrbuf_free(wr, 1);
-
- wr = wrbuf_alloc();
-
- for (step = 1; step < 65; step++)
- {
- int i, j, k;
- int len;
- char buf[64];
- char *cp;
- for (j = 1; j<step; j++)
- {
- for (i = 0; i<j; i++)
- buf[i] = i+1;
- buf[i] = '\0';
- wrbuf_puts(wr, buf);
- }
-
- cp = wrbuf_buf(wr);
- len = wrbuf_len(wr);
- if (len != step * (step-1) / 2)
- {
- printf ("tstwrbuf 1 %d len=%d\n", step, len);
- exit(1);
- }
- k = 0;
- for (j = 1; j<step; j++)
- for (i = 0; i<j; i++)
- {
- if (cp[k] != i+1)
- {
- printf ("tstwrbuf 2 %d k=%d\n", step, k);
- exit(1);
- }
- k++;
- }
- wrbuf_rewind(wr);
- }
- wrbuf_free(wr, 1);
- exit(0);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: version.c,v 1.2 2003-04-14 16:57:58 adam Exp $
- */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <yaz/yaz-version.h>
-
-unsigned long yaz_version(char *version_str, char *sys_str)
-{
- if (version_str)
- strcpy(version_str, YAZ_VERSION);
- if (sys_str)
- strcpy(sys_str, "");
- return YAZ_VERSIONL;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: wrbuf.c,v 1.13 2003-07-14 12:58:18 adam Exp $
- */
-
-/*
- * Growing buffer for writing various stuff.
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include <yaz/wrbuf.h>
-
-WRBUF wrbuf_alloc(void)
-{
- WRBUF n;
-
- if (!(n = (WRBUF)xmalloc(sizeof(*n))))
- abort();
- n->buf = 0;
- n->size = 0;
- n->pos = 0;
- return n;
-}
-
-void wrbuf_free(WRBUF b, int free_buf)
-{
- if (free_buf && b->buf)
- xfree(b->buf);
- xfree(b);
-}
-
-void wrbuf_rewind(WRBUF b)
-{
- b->pos = 0;
-}
-
-int wrbuf_grow(WRBUF b, int minsize)
-{
- int togrow;
-
- if (!b->size)
- togrow = 1024;
- else
- togrow = b->size;
- if (togrow < minsize)
- togrow = minsize;
- if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
- abort();
- else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
- abort();
- return 0;
-}
-
-int wrbuf_write(WRBUF b, const char *buf, int size)
-{
- if (size <= 0)
- return 0;
- if (b->pos + size >= b->size)
- wrbuf_grow(b, size);
- memcpy(b->buf + b->pos, buf, size);
- b->pos += size;
- return 0;
-}
-
-int wrbuf_puts(WRBUF b, const char *buf)
-{
- wrbuf_write(b, buf, strlen(buf)+1); /* '\0'-terminate as well */
- (b->pos)--; /* don't include '\0' in count */
- return 0;
-}
-
-int wrbuf_xmlputs(WRBUF b, const char *cp)
-{
- while (*cp)
- {
- switch(*cp)
- {
- case '<':
- wrbuf_puts(b, "<");
- break;
- case '>':
- wrbuf_puts(b, ">");
- break;
- case '&':
- wrbuf_puts(b, "&");
- break;
- case '"':
- wrbuf_puts(b, """);
- break;
- case '\'':
- wrbuf_puts(b, "'");
- break;
- default:
- wrbuf_putc(b, *cp);
- }
- cp++;
- }
- wrbuf_putc(b, 0);
- (b->pos)--;
- return 0;
-}
-
-void wrbuf_printf(WRBUF b, const char *fmt, ...)
-{
- va_list ap;
- char buf[4096];
-
- va_start(ap, fmt);
-#ifdef WIN32
- _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
-/* !WIN32 */
-#if HAVE_VSNPRINTF
- vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
-#endif
- wrbuf_puts (b, buf);
-
- va_end(ap);
-}
-
+++ /dev/null
-/*
- * Copyright (C) 1994-2003, Index Data
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: xmalloc.c,v 1.19 2003-05-16 13:14:26 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <yaz/log.h>
-#include <yaz/xmalloc.h>
-
-#ifndef TRACE_XMALLOC
-#define TRACE_XMALLOC 1
-#endif
-
-#if TRACE_XMALLOC > 1
-
-static const unsigned char head[] = {88, 77, 66, 55, 44, 33, 22, 11};
-static const unsigned char tail[] = {11, 22, 33, 44, 55, 66, 77, 88};
-static const unsigned char freed[] = {11, 22, 33, 44, 55, 66, 77, 88};
-
-struct dmalloc_info {
- int len;
- char file[16];
- int line;
- struct dmalloc_info *next;
- struct dmalloc_info *prev;
-};
-
-struct dmalloc_info *dmalloc_list = 0;
-
-void *xmalloc_d(size_t nbytes, const char *file, int line)
-{
- char *res;
- struct dmalloc_info *dinfo;
-
- if (!(res = (char*) malloc(nbytes + sizeof(*dinfo)+16*sizeof(char))))
- return 0;
- dinfo = (struct dmalloc_info *) res;
- strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
- dinfo->file[sizeof(dinfo->file)-1] = '\0';
- dinfo->line = line;
- dinfo->len = nbytes;
-
- dinfo->prev = 0;
- dinfo->next = dmalloc_list;
- if (dinfo->next)
- dinfo->next->prev = dinfo;
- dmalloc_list = dinfo;
-
- memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
- res += sizeof(*dinfo) + 8*sizeof(char);
- memcpy(res + nbytes, tail, 8*sizeof(char));
- return res;
-}
-
-void xfree_d(void *ptr, const char *file, int line)
-{
- struct dmalloc_info *dinfo;
-
- if (!ptr)
- return;
- dinfo = (struct dmalloc_info *)
- ((char*)ptr - 8*sizeof(char) - sizeof(*dinfo));
- if (memcmp(head, (char*) ptr - 8*sizeof(char), 8*sizeof(char)))
- {
- yaz_log(LOG_FATAL, "xfree_d bad head, %s:%d, %p", file, line, ptr);
- abort();
- }
- if (memcmp((char*) ptr + dinfo->len, tail, 8*sizeof(char)))
- {
- yaz_log(LOG_FATAL, "xfree_d bad tail, %s:%d, %p", file, line, ptr);
- abort();
- }
- if (dinfo->prev)
- dinfo->prev->next = dinfo->next;
- else
- dmalloc_list = dinfo->next;
- if (dinfo->next)
- dinfo->next->prev = dinfo->prev;
- memcpy ((char*) ptr - 8*sizeof(char), freed, 8*sizeof(char));
- free(dinfo);
- return;
-}
-
-void *xrealloc_d(void *p, size_t nbytes, const char *file, int line)
-{
- struct dmalloc_info *dinfo;
- char *ptr = (char*) p;
- char *res;
-
- if (!ptr)
- {
- if (!nbytes)
- return 0;
- res = (char *) malloc(nbytes + sizeof(*dinfo) + 16*sizeof(char));
- }
- else
- {
- if (memcmp(head, ptr - 8*sizeof(char), 8*sizeof(char)))
- {
- yaz_log(LOG_FATAL, "xrealloc_d bad head, %s:%d, %p",
- file, line, ptr);
- abort();
- }
- dinfo = (struct dmalloc_info *) (ptr-8*sizeof(char) - sizeof(*dinfo));
- if (memcmp(ptr + dinfo->len, tail, 8*sizeof(char)))
- {
- yaz_log(LOG_FATAL, "xrealloc_d bad tail, %s:%d, %p",
- file, line, ptr);
- abort();
- }
- if (dinfo->prev)
- dinfo->prev->next = dinfo->next;
- else
- dmalloc_list = dinfo->next;
- if (dinfo->next)
- dinfo->next->prev = dinfo->prev;
-
- if (!nbytes)
- {
- free (dinfo);
- return 0;
- }
- res = (char *)
- realloc(dinfo, nbytes + sizeof(*dinfo) + 16*sizeof(char));
- }
- if (!res)
- return 0;
- dinfo = (struct dmalloc_info *) res;
- strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
- dinfo->file[sizeof(dinfo->file)-1] = '\0';
- dinfo->line = line;
- dinfo->len = nbytes;
-
- dinfo->prev = 0;
- dinfo->next = dmalloc_list;
- if (dmalloc_list)
- dmalloc_list->prev = dinfo;
- dmalloc_list = dinfo;
-
- memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
- res += sizeof(*dinfo) + 8*sizeof(char);
- memcpy(res + nbytes, tail, 8*sizeof(char));
- return res;
-}
-
-void *xcalloc_d(size_t nmemb, size_t size, const char *file, int line)
-{
- char *res;
- struct dmalloc_info *dinfo;
- size_t nbytes = nmemb * size;
-
- if (!(res = (char*) calloc(1, nbytes+sizeof(*dinfo)+16*sizeof(char))))
- return 0;
- dinfo = (struct dmalloc_info *) res;
- strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
- dinfo->file[sizeof(dinfo->file)-1] = '\0';
- dinfo->line = line;
- dinfo->len = nbytes;
-
- dinfo->prev = 0;
- dinfo->next = dmalloc_list;
- if (dinfo->next)
- dinfo->next->prev = dinfo;
- dmalloc_list = dinfo;
-
- memcpy(res + sizeof(*dinfo), head, 8*sizeof(char));
- res += sizeof(*dinfo) + 8*sizeof(char);
- memcpy(res + nbytes, tail, 8*sizeof(char));
- return res;
-}
-
-void xmalloc_trav_d(const char *file, int line)
-{
- size_t size = 0;
- struct dmalloc_info *dinfo = dmalloc_list;
-
- yaz_log (LOG_MALLOC, "malloc_trav %s:%d", file, line);
- while (dinfo)
- {
- yaz_log (LOG_MALLOC, " %20s:%d p=%p size=%d", dinfo->file, dinfo->line,
- ((char*) dinfo)+sizeof(*dinfo)+8*sizeof(char), dinfo->len);
- size += dinfo->len;
- dinfo = dinfo->next;
- }
- yaz_log (LOG_MALLOC, "total bytes %ld", (long) size);
-}
-
-#else
-/* TRACE_XMALLOC <= 1 */
-#define xrealloc_d(o, x, f, l) realloc(o, x)
-#define xmalloc_d(x, f, l) malloc(x)
-#define xcalloc_d(x,y, f, l) calloc(x,y)
-#define xfree_d(x, f, l) free(x)
-#define xmalloc_trav_d(f, l)
-#endif
-
-void xmalloc_trav_f(const char *s, const char *file, int line)
-{
- xmalloc_trav_d(file, line);
-}
-
-void *xrealloc_f (void *o, size_t size, const char *file, int line)
-{
- void *p = xrealloc_d (o, size, file, line);
-
-#if TRACE_XMALLOC
- yaz_log (LOG_MALLOC,
- "%s:%d: xrealloc(s=%d) %p -> %p", file, line, size, o, p);
-#endif
- if (!p)
- {
- yaz_log (LOG_FATAL|LOG_ERRNO, "Out of memory, realloc (%d bytes)",
- size);
- exit(1);
- }
- return p;
-}
-
-void *xmalloc_f (size_t size, const char *file, int line)
-{
- void *p = xmalloc_d (size, file, line);
-
-#if TRACE_XMALLOC
- yaz_log (LOG_MALLOC, "%s:%d: xmalloc(s=%d) %p", file, line, size, p);
-#endif
- if (!p)
- {
- yaz_log (LOG_FATAL, "Out of memory - malloc (%d bytes)", size);
- exit (1);
- }
- return p;
-}
-
-void *xcalloc_f (size_t nmemb, size_t size, const char *file, int line)
-{
- void *p = xcalloc_d (nmemb, size, file, line);
-#if TRACE_XMALLOC
- yaz_log (LOG_MALLOC, "%s:%d: xcalloc(s=%d) %p", file, line, size, p);
-#endif
- if (!p)
- {
- yaz_log (LOG_FATAL, "Out of memory - calloc (%d, %d)", nmemb, size);
- exit (1);
- }
- return p;
-}
-
-char *xstrdup_f (const char *s, const char *file, int line)
-{
- char *p = (char *)xmalloc_d (strlen(s)+1, file, line);
-#if TRACE_XMALLOC
- yaz_log (LOG_MALLOC, "%s:%d: xstrdup(s=%d) %p", file, line, strlen(s)+1, p);
-#endif
- strcpy (p, s);
- return p;
-}
-
-void xfree_f(void *p, const char *file, int line)
-{
- if (!p)
- return ;
-#if TRACE_XMALLOC
- if (p)
- yaz_log (LOG_MALLOC, "%s:%d: xfree %p", file, line, p);
-#endif
- xfree_d(p, file, line);
-}
#!/bin/sh
-# $Id: yaz-config.in,v 1.17 2003-02-18 10:37:08 adam Exp $
+# $Id: yaz-config.in,v 1.18 2003-10-27 12:21:21 adam Exp $
yazprefix=@prefix@
yaz_echo_cflags=no
yaz_echo_libs=no
if test "$yaz_echo_source" = "yes"; then
YAZBIN=${yaz_build_root}/bin
- YAZLIB="-L${yaz_build_root}/lib/.libs $lyaz $yazextralibs"
- YAZLALIB="${yaz_build_root}/lib/libyaz.la $yazextralibs"
+ YAZLIB="-L${yaz_build_root}/src/.libs $lyaz $yazextralibs"
+ YAZLALIB="${yaz_build_root}/src/libyaz.la $yazextralibs"
if test "$lib_ssl" = "yes" -a -n "$SSL_LIBS@"; then
- YAZLALIB="${yaz_build_root}/lib/libyazssl.la"
+ YAZLALIB="${yaz_build_root}/src/libyazssl.la"
fi
if test "$lib_thread" = "yes" -a -n "@CFLAGSTHREADS@"; then
- YAZLALIB="${yaz_build_root}/lib/libyazthread.la $YAZLALIB"
+ YAZLALIB="${yaz_build_root}/src/libyazthread.la $YAZLALIB"
fi
if test "$lib_malloc" = "yes"; then
- YAZLALIB="${yaz_build_root}/lib/libyazmalloc.la $YAZLALIB"
+ YAZLALIB="${yaz_build_root}/src/libyazmalloc.la $YAZLALIB"
fi
YAZINC="-I${yaz_src_root}/include"
YAZCOMP=${yaz_src_root}/util/yaz-comp
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libz39.50.la
-z-*.c
-zes-*.c
-*.lo
+++ /dev/null
-## $Id: Makefile.am,v 1.14 2003-07-18 19:53:28 mike Exp $
-
-AM_CPPFLAGS=-I$(top_srcdir)/include
-
-noinst_LTLIBRARIES = libz39.50.la
-
-tabdatadir = $(pkgdatadir)/z39.50
-tabdata_DATA=datetime.asn esupdate.asn univres.asn z3950v3.asn z.tcl \
- esadmin.asn charneg-3.asn mterm2.asn oclcui.asn
-EXTRA_DIST=$(tabdata_DATA)
-
-YAZCOMP = $(top_srcdir)/util/yaz-asncomp
-YAZCOMPLINE = ../util/yaz-asncomp -d z.tcl -i yaz -I../include $(YCFLAGS)
-
-libz39_50_la_SOURCES = z-accdes1.c z-accform1.c z-acckrb1.c z-core.c \
- z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-mterm2.c z-opac.c \
- z-uifr1.c z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c z-oclcui.c\
- zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c \
- zes-pset.c zes-update0.c z-date.c z-univ.c zes-update.c zes-admin.c \
- z-charneg.c \
- prt-ext.c
-
-# Rules for Z39.50 V3
-$(srcdir)/z-accdes1.c \
-$(srcdir)/z-accform1.c \
-$(srcdir)/z-acckrb1.c \
-$(srcdir)/z-core.c \
-$(srcdir)/z-diag1.c \
-$(srcdir)/z-espec1.c \
-$(srcdir)/z-estask.c \
-$(srcdir)/z-exp.c \
-$(srcdir)/z-grs.c \
-$(srcdir)/z-opac.c \
-$(srcdir)/z-uifr1.c \
-$(srcdir)/z-rrf1.c \
-$(srcdir)/z-rrf2.c \
-$(srcdir)/z-sum.c \
-$(srcdir)/z-sutrs.c \
-$(srcdir)/zes-expi.c \
-$(srcdir)/zes-exps.c \
-$(srcdir)/zes-order.c \
-$(srcdir)/zes-pquery.c \
-$(srcdir)/zes-psched.c \
-$(srcdir)/zes-pset.c \
-$(srcdir)/zes-update0.c \
-$(top_srcdir)/include/z-accdes1.h \
-$(top_srcdir)/include/z-core.h: \
-$(srcdir)/z.tcl $(srcdir)/z3950v3.asn $(YAZCOMP)
- cd $(srcdir); $(YAZCOMPLINE) z3950v3.asn
-
-# Date extension
-$(srcdir)/z-date.c \
-$(top_srcdir)/include/yaz/z-date.h: $(srcdir)/z.tcl $(srcdir)/datetime.asn $(YAZCOMP)
- cd $(srcdir); $(YAZCOMPLINE) datetime.asn
-
-# UNIverse extension
-$(srcdir)/z-univ.c \
-$(top_srcdir)/include/yaz/z-univ.h: \
-$(srcdir)/z.tcl $(srcdir)/univres.asn $(YAZCOMP)
- cd $(srcdir); $(YAZCOMPLINE) univres.asn
-
-# New Update extended service
-$(srcdir)/zes-update.c \
-$(top_srcdir)/include/yaz/zes-update.h: \
-$(srcdir)/z.tcl $(srcdir)/esupdate.asn $(YAZCOMP)
- cd $(srcdir); $(YAZCOMPLINE) esupdate.asn
-
-# Admin extended service
-$(srcdir)/zes-admin.c \
-$(top_srcdir)/include/yaz/zes-admin.h: \
-$(srcdir)/z.tcl $(srcdir)/esadmin.asn $(YAZCOMP)
- cd $(srcdir); $(YAZCOMPLINE) esadmin.asn
-
-# Charset negotiation
-$(srcdir)/z-charneg.c: $(srcdir)/z.tcl $(srcdir)/charneg-3.asn
- cd $(srcdir); $(YAZCOMPLINE) $(YCFLAGS) charneg-3.asn
-
-# UserInfoFormat-multipleSearchTerms-2
-$(srcdir)/z-mterm2.c: $(srcdir)/z.tcl $(srcdir)/mterm2.asn
- cd $(srcdir); $(YAZCOMPLINE) mterm2.asn
-
-# UserInfoFormat-multipleSearchTerms-2
-$(srcdir)/z-oclcui.c: $(srcdir)/z.tcl $(srcdir)/oclcui.asn
- cd $(srcdir); $(YAZCOMPLINE) oclcui.asn
+++ /dev/null
-NegotiationRecordDefinition-charSetandLanguageNegotiation-3
-{Z39-50-negotiationRecordDefinition CharSetandLanguageNegotiation-3 (3)}
-DEFINITIONS ::= BEGIN
-IMPORTS LanguageCode FROM RecordSyntax-explain;
-
-CharSetandLanguageNegotiation ::= CHOICE{
- proposal [1] IMPLICIT OriginProposal,
- response [2] IMPLICIT TargetResponse}
---
--- For character sets:
--- Origin proposes one, two, or all three of the following, in order of
--- preference:
--- (a) 2022 character sets.
--- (b) 10646 character set.
--- (c) Private character set.
---
--- The target responds with one of (a), (b), or (c), indicating the
--- character set(s) to be supported for all name and message strings.
---
--- If the origin includes (a),
--- the origin proposes:
--- (1) A proposed environment: 7-bit, 8-bit, or no-preference.
--- (2) A set of iso 2022 registration numbers.
--- (3) One or more proposed initial sets of registration numbers,
--- for c0, c1, g0, g1, g2 and g3. These must come from (2).
--- (4) The proposed encoding level.
--- And if the target selects (a), it responds with:
--- (1) A selected environment: 7-bit or 8-bit.
--- (2) A subset of the set of iso 2022 registration numbers proposed
--- by the origin.
--- (3) The initial set of registrations, which must come from (2)
--- but need not be from the set of initial registrations proposed
--- by the origin.
--- (4) The encoding level; less than or equal to that proposed.
---
--- If the origin includes (b),
--- The origin proposes:
--- (1) (optionally) A list of collections (i.e. subsets of characters from the
--- complete 10646 definition).
--- (2) An implementation level.
--- (3) Syntax/form: e.g. ucs-2, ucs-4, utf-8, utf-16.
--- And if the target selects (b), it responds by choosing a subset of the
--- collections proposed by the origin in (1) and an implementation level less
--- than or equal to that proposed by the origin in (2).
---
--- If the origin includes (c), the origin proposes one of the following:
--- (1) A list of private character sets, by one or more object
--- identifiers.
--- (2) A list of private character sets, by an EXTERNAL.
--- (3) An indication to use a private, previously agreed upon
--- character set.
--- And if the target selects (c):
--- - If the origin proposed (1), the target should respond with (1), and
--- the list of object identifiers should be a subset of the list that
--- the origin included.
--- - If the origin proposed (2), the target should respond with (2), using
--- the same EXTERNAL definition (but not necessarily the same content)
--- used by the origin.
--- - If the origin proposed (3), the target should respond with (3).
---
--- For Languages:
--- The origin optionally proposes one or more language codes. The target
--- response may include a single language code, which indicates the
--- language to be used for all message strings. The target may include or
--- omit this, whether or not the origin included a proposed set, and the
--- language code indicated need not be from among those proposed.
---
---
-
-OriginProposal ::= SEQUENCE {
- proposedCharSets [1] IMPLICIT SEQUENCE OF CHOICE{
- -- Each should occur at most once, and in order of preference
- -- (the "order of preference" is the reason why this is
- -- "SEQUENCE OF CHOICE" rather than just "SEQUENCE")
- iso2022 [1] Iso2022,
- iso10646 [2] IMPLICIT Iso10646,
- private [3] PrivateCharacterSet} OPTIONAL,
- -- proposedCharSets must be omitted
- -- if origin proposes version 2
- proposedlanguages [2] IMPLICIT SEQUENCE OF LanguageCode OPTIONAL,
- recordsInSelectedCharSets [3] IMPLICIT BOOLEAN OPTIONAL
- -- default 'false'. See rule 6 above.
- }
-
-TargetResponse ::= SEQUENCE{
- selectedCharSets [1] CHOICE{
- iso2022 [1] Iso2022,
- iso10646 [2] IMPLICIT Iso10646,
- private [3] PrivateCharacterSet,
- none [4] IMPLICIT NULL
- -- If selected, no negotiation
- -- is assumed to be in force
- -- for character sets.
- } OPTIONAL,
- -- Omitted if and only if proposedCharSets
- -- was Omitted in the request.
- selectedLanguage [2] IMPLICIT LanguageCode OPTIONAL,
- recordsInSelectedCharSets [3] IMPLICIT BOOLEAN OPTIONAL
- -- Omitted if and only if 'recordsInSelectedCharSets' was omitted
- -- in the request. See rule 6 above.
- }
-
-
-PrivateCharacterSet ::= CHOICE{
- viaOid [1] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
- externallySpecified [2] IMPLICIT EXTERNAL,
- previouslyAgreedUpon [3] IMPLICIT NULL}
-
--- IMPORTED
--- LanguageCode ::= GeneralString -- from ANSI Z39.53-1994
-
--- Definition of ISO2022
--- For ISO 2022, the following is negotiated:
--- 1) The environment: 7-bit or 8-bit;
--- 2) a set of registration numbers (from the ISO Register of coded
--- character sets) for graphical and control character sets;
--- 3) g0, g1, g2, g3, c0, c1, the registration numbers of the graphical and
--- control character sets that are initially designated to g0, g1, etc.
--- The origin submits one or more sequences of values for
--- g0, g1, g2, g3, c0, c1 (for each sequence: at least one of
--- g0 and g1 must be included; g2 and g3 are optional and
--- may be included only if g1 is included;
--- c0 should be included; and c1 is optional); the target
--- selects one of the proposed sequences.
--- 4) gleft: which of g0, g1, g2 or g3, initially has GL shift status in
--- an 8-bit environment or has shift status in a 7-bit environment; and
--- 5) gright: which of g1, g2 or g3 initially has GR shift status in an
--- 8-bit environment.
-
-Iso2022 ::= CHOICE{
- originProposal [1] IMPLICIT SEQUENCE{
- proposedEnvironment [0] Environment OPTIONAL,
- -- omitted means no preference
- proposedSets [1] IMPLICIT SEQUENCE OF INTEGER,
- proposedInitialSets [2] IMPLICIT SEQUENCE OF
- InitialSet,
- proposedLeftAndRight [3] IMPLICIT LeftAndRight},
- targetResponse [2] IMPLICIT SEQUENCE{
- selectedEnvironment [0] Environment,
- selectedSets [1] IMPLICIT SEQUENCE OF INTEGER,
- selectedinitialSet [2] IMPLICIT InitialSet,
- selectedLeftAndRight [3] IMPLICIT LeftAndRight}}
-
-Environment ::= CHOICE{
- sevenBit [1] IMPLICIT NULL,
- eightBit [2] IMPLICIT NULL}
-
-InitialSet::= SEQUENCE{
- g0 [0] IMPLICIT INTEGER OPTIONAL,
- g1 [1] IMPLICIT INTEGER OPTIONAL,
- -- one of g0 and g1 must be included
- g2 [2] IMPLICIT INTEGER OPTIONAL,
- g3 [3] IMPLICIT INTEGER OPTIONAL,
- --g2 and/or g3 may be included
- -- only if g1 was included
- c0 [4] IMPLICIT INTEGER,
- c1 [5] IMPLICIT INTEGER OPTIONAL}
-
-LeftAndRight ::= SEQUENCE{
- gLeft [3] IMPLICIT INTEGER{
- g0 (0),
- g1 (1),
- g2 (2),
- g3 (3)},
- gRight [4] IMPLICIT INTEGER{
- g1 (1),
- g2 (2),
- g3 (3)} OPTIONAL}
-
--- Definition of Iso10646
---
--- The 10646 object identifier looks like:
--- 1.0.10646.1.implementationLevel.repertoireSubset.arc1.arc2. ....
---
--- (The second '1' is for "part 1" of 10646.)
---
--- ImplementationLevel is 1-3
---
--- repertoireSubset is 0 or 1, for 'all' or 'collections'.
--- The arcs are present only if repertoireSubset is 'collections',
--- in which case arc1, arc2, etc., are the
--- identifiers of collections of character repertoires.
---
--- There is a second 10646 oid, for specifying syntax/form:
--- 1.0.10646.1.0.form
---
--- (The second '0' represents "transfer syntax".)
---
--- where values of form include:
--- 2: ucs-2
--- 4: ucs-4
--- 5: utf-16
--- 8: utf-8
-
-Iso10646 ::= SEQUENCE{
- collections [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- --oid of form 1.0.10646.1.implementationLevel
- -- .repertoireSubset.arc1.arc2. ....
- -- Target to choose a subset of the collections
- -- proposed by the origin, and an implementation level
- -- less than or equal to that proposed.
- --
- -- when 'collections' is omitted,
- -- 'implementationLevel' defaults to 3.
- --
- encodingLevel [2] IMPLICIT OBJECT IDENTIFIER
- -- oid of form 1.0.10646.1.0.form
- -- where value of 'form' is 2, 4, 5, or 8
- -- for ucs-2, ucs-4, utf-16, utf-8
- }
-END
-
+++ /dev/null
-#!/bin/sh
-# $Id: comp.sh,v 1.2 1999-12-08 13:21:02 adam Exp $
-# simple script to make all compiled code.
-../util/yc.tcl -d z.tcl -i yaz -I ../include z3950v3.asn
-../util/yc.tcl -d z.tcl -i yaz -I ../include datetime.asn
-../util/yc.tcl -d z.tcl -i yaz -I ../include univres.asn
-../util/yc.tcl -d z.tcl -i yaz -I ../include esupdate.asn
+++ /dev/null
-UserInfoFormat-dateTime
-{Z39-50-userInfoFormat dateTime (6)} DEFINITIONS ::=
-BEGIN
-IMPORTS IntUnit FROM Z39-50-APDU-1995;
-
-DateTime ::= SEQUENCE{
- date [1] Z3950Date OPTIONAL,
- time [2] Z3950Time OPTIONAL
- -- one or the other, or both
- }
-
-Z3950Date ::= SEQUENCE{
- year [1] IMPLICIT INTEGER,
- -- For "positive" years, i.e. 1 AD or later, supply
- -- the absolute year, e.g. If the year is 1995, supply
- -- the integer 1995; the value 95 would indicate the
- -- year 0095.
- -- For "negative" years, e.g. 1 BC or earlier, -1
- -- represents 1 BC, -2 represents 2 BC, etc. Zero is
- -- invalid, because there was no year zero.
- partOfYear [2] CHOICE{ -- may be omitted if only year is significant
- monthAndDay [1] IMPLICIT SEQUENCE{
- month [2] IMPLICIT INTEGER,
- -- value 1-12
- day [3] IMPLICIT INTEGER OPTIONAL
- -- may be omitted if only year and month
- -- are significant. Value 1-31.
- },
- julianDay [2] IMPLICIT INTEGER, -- Value 1 - 366.
- weekNumber [3] IMPLICIT INTEGER, -- Value 1 - 53.
- quarter [4] CHOICE{
- first [1] IMPLICIT NULL,
- second [2] IMPLICIT NULL,
- third [3] IMPLICIT NULL,
- fourth [4] IMPLICIT NULL},
- season [5] CHOICE{
- winter [1] IMPLICIT NULL,
- spring [2] IMPLICIT NULL,
- summer [3] IMPLICIT NULL,
- autumn [4] IMPLICIT NULL}
- } OPTIONAL,
- flags [3] IMPLICIT SEQUENCE{
- circa [1] IMPLICIT NULL OPTIONAL,
- -- if this flag is set then the date is "approximate".
- era [2] CHOICE{
- -- If era occurs, partOfYear should not occur.
- decade [1] IMPLICIT NULL,
- -- year must be multiple of 10.
- -- For example, 1900 refers to
- -- the decade covering the years
- -- 1900 through 1909.
- century [2] IMPLICIT NULL,
- -- year must be multiple of 100.
- millennium [3] IMPLICIT NULL
- -- year must be multiple of 1000.
- } OPTIONAL
- } OPTIONAL
- }
-
-
-Z3950Time ::= SEQUENCE{
- hour [1] IMPLICIT INTEGER,
- -- Value 0-23.
- minute [2] IMPLICIT INTEGER OPTIONAL,
- -- value 0-59. May be omitted when hour only is
- -- significant (in which case second and
- -- partOfSecond must also be omitted).
- second [3] IMPLICIT INTEGER OPTIONAL,
- -- value 0-59. May be omitted when only hour, or
- -- hour and minute, is significant (in which case
- -- partOfSecond must also be omitted).
- partOfSecond [4] IMPLICIT IntUnit OPTIONAL,
- -- Use Unit System = 'si', Unit type = 'time';
- -- Unit = 'second', with appropriate value and
- -- scale factor.
- zone [5] CHOICE{
- local [1] IMPLICIT NULL,
- utc [2] IMPLICIT NULL,
- utcOffset [3] IMPLICIT INTEGER -- in minutes
- }}
-END
+++ /dev/null
-ESFormat-Admin
-{Z39-50-extendedService Index-Data(81) AdminES (1)} DEFINITIONS ::=
- -- oid is 1.2.840.10003.9.81.1
-BEGIN
-IMPORTS DiagRec, InternationalString, Segment
-FROM Z39-50-APDU-1995;
-Admin ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1]
- OriginPartToKeep,
- targetPart [2] TargetPart}}
-
-OriginPartToKeep ::= SEQUENCE{
-action [1] CHOICE{
- reIndex [1] NULL,
- truncate [2] NULL,
- drop [3] NULL,
- create [4] NULL,
- import [5] ImportParameters,
- refresh [6] NULL, -- Review internal representation of records against source files on disk to
- -- see if they have been updated.
- commit [7] NULL,
- shutdown [8] NULL,
- start [9] NULL},
-databaseName [2] IMPLICIT InternationalString OPTIONAL}
-
-OriginPartNotToKeep ::= CHOICE{
-records [1] Segment,
-recordsWillFollow [0] NULL}
-
-TargetPart ::= SEQUENCE{
- updateStatus [1] IMPLICIT INTEGER{
- success (1),
- partial (2),
- failure (3)},
- globalDiagnostics [2] IMPLICIT SEQUENCE OF
- DiagRec OPTIONAL
- }
-
--- Auxiliary definitions for Admin
-
-ImportParameters ::= SEQUENCE{
- recordType [1] IMPLICIT InternationalString
-}
-
-END
+++ /dev/null
-ESFormat-Update
-{Z39-50-extendedService Update (5) revisions (1) revision-1 (1)} DEFINITIONS ::=
- -- oid is 1.2.840.10003.9.5.1.1
-BEGIN
-IMPORTS DiagRec, InternationalString
-FROM Z39-50-APDU-1995;
-Update ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1]
- OriginPartToKeep,
- targetPart [2] TargetPart}}
-
-OriginPartToKeep ::= SEQUENCE{
-action [1] IMPLICIT INTEGER{
- recordInsert (1),
- recordReplace (2),
- recordDelete (3),
- elementUpdate (4),
- specialUpdate (5)},
- databaseName [2] IMPLICIT InternationalString,
- schema [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- elementSetName [4] IMPLICIT InternationalString OPTIONAL,
- actionQualifier [5] IMPLICIT EXTERNAL OPTIONAL}
-
-OriginPartNotToKeep ::= SuppliedRecords
-
-TargetPart ::= SEQUENCE{
- updateStatus [1] IMPLICIT INTEGER{
- success (1),
- partial (2),
- failure (3)},
- globalDiagnostics [2] IMPLICIT SEQUENCE OF
- DiagRec OPTIONAL,
- -- These are non-surrogate
- -- diagnosticsrelating to the task,
- -- not to individual records.
- taskPackageRecords [3] IMPLICIT SEQUENCE OF
-TaskPackageRecordStructure
- -- There should be a
- -- TaskPackageRecordStructure
- -- for every record supplied.
- -- The target should create
- -- such a structure for every
- -- record immediately upon
- -- creating the task package
- -- to include correlation
- -- information and status.
- -- The record itself would not
- -- be included until processing
- -- for that record is complete.
- }
-
--- Auxiliary definitions for Update
-SuppliedRecords ::= SEQUENCE OF SEQUENCE{
- recordId [1] CHOICE{
- number [1] IMPLICIT INTEGER,
- string [2] IMPLICIT InternationalString,
- opaque [3] IMPLICIT OCTET STRING} OPTIONAL,
- supplementalId [2] CHOICE{
- timeStamp [1] IMPLICIT GeneralizedTime,
- versionNumber [2] IMPLICIT InternationalString,
- previousVersion [3] IMPLICIT EXTERNAL} OPTIONAL,
- correlationInfo [3] IMPLICIT CorrelationInfo OPTIONAL,
- record [4] IMPLICIT EXTERNAL}
-
-CorrelationInfo ::= SEQUENCE{
- -- origin may supply one or both for any record:
- note [1] IMPLICIT InternationalString OPTIONAL,
- id [2] IMPLICIT INTEGER OPTIONAL}
-
-TaskPackageRecordStructure ::= SEQUENCE{
- recordOrSurDiag [1] CHOICE {
- record [1] IMPLICIT EXTERNAL,
- -- Choose 'record' if
- -- recordStatus is 'success', and
- -- elementSetName was supplied.
-
- surrogateDiagnostics [2] IMPLICIT
- SEQUENCE OF DiagRec
- -- Choose 'SurrogateDiagnostics', if
- -- RecordStatus is failure.
- } OPTIONAL,
- -- The parameter recordOrSurDiag
- -- will thus be omitted only if
- -- 'elementSetName' was omitted and
- -- recordStatus is 'success'; or
- --if record status is 'queued'
- -- or in 'process'.
- correlationInfo [2] IMPLICIT
- CorrelationInfo OPTIONAL,
- -- This should be included
- -- if it was supplied by the origin.
- recordStatus [3] IMPLICIT INTEGER{
- success (1),
- queued (2),
- inProcess (3),
- failure (4)},
- supplementalDiagnostics [4] IMPLICIT
- SEQUENCE OF DiagRec OPTIONAL}
-END
+++ /dev/null
-UserInfoFormat-multipleSearchTerms-2
-{Z39-50-userInfoFormat MultipleSearchTerms-2 (5)} DEFINITIONS ::=
-BEGIN
-IMPORTS Term FROM Z39-50-APDU-1995;
-
-MultipleSearchTerms-2 ::= SEQUENCE OF SEQUENCE{
- term [1] IMPLICIT Term,
- flag [2] IMPLICIT BOOLEAN OPTIONAL}
-
-END
+++ /dev/null
-UserInfoFormat-oclcUserInformation
-{Z39-50-userInfoFormat OCLCUserInformation (7)} DEFINITIONS ::=
-BEGIN
-
--- $Id: oclcui.asn,v 1.4 2003-09-04 17:44:49 adam Exp $
---
--- This format is returned from the server at
--- fsz3950test.oclc.org:210
--- I found the definition at
--- http://www.oclc.org/firstsearch/documentation/z3950/config_guide.htm
---
--- I have added OPTIONAL modifiers to the `dblist' and and `code'
--- elements because they appear to be admitted from the APDU returned
--- as an Init diagnostic from fsz3950test.oclc.org:210. Adam further
--- removed the SEQUENCE structure, changed failReason to a BOOLEAN and
--- deleted diagnosticSetId altogether, to make the ASN.1 conform to
--- what's actually returned on the wire. Finally, I removed the
--- OPTIONAL on failReason on the advice of OCLC's Keith Neibarger
--- <neibarge@oclc.org> (although he'd also advised me, wrongly, that I
--- could remove the OPTIONAL on dblist).
-
-OCLC-UserInformation ::= SEQUENCE {
- motd [1] IMPLICIT VisibleString OPTIONAL,
- dblist SEQUENCE OF DBName OPTIONAL,
- failReason [3] IMPLICIT BOOLEAN OPTIONAL,
- code [1] IMPLICIT INTEGER OPTIONAL,
- text [2] IMPLICIT VisibleString OPTIONAL
-}
-
-DBName ::= [2] IMPLICIT VisibleString
-
-END
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: prt-ext.c,v 1.7 2003-07-18 19:53:28 mike Exp $
- */
-
-#include <yaz/proto.h>
-
-/*
- * The table below should be moved to the ODR structure itself and
- * be an image of the association context: To help
- * map indirect references when they show up.
- */
-static Z_ext_typeent type_table[] =
-{
- {VAL_SUTRS, Z_External_sutrs, (Odr_fun) z_SUTRS},
- {VAL_EXPLAIN, Z_External_explainRecord, (Odr_fun)z_ExplainRecord},
- {VAL_RESOURCE1, Z_External_resourceReport1, (Odr_fun)z_ResourceReport1},
- {VAL_RESOURCE2, Z_External_resourceReport2, (Odr_fun)z_ResourceReport2},
- {VAL_PROMPT1, Z_External_promptObject1, (Odr_fun)z_PromptObject1 },
- {VAL_GRS1, Z_External_grs1, (Odr_fun)z_GenericRecord},
- {VAL_EXTENDED, Z_External_extendedService, (Odr_fun)z_TaskPackage},
- {VAL_ITEMORDER, Z_External_itemOrder, (Odr_fun)z_IOItemOrder},
- {VAL_DIAG1, Z_External_diag1, (Odr_fun)z_DiagnosticFormat},
- {VAL_ESPEC1, Z_External_espec1, (Odr_fun)z_Espec1},
- {VAL_SUMMARY, Z_External_summary, (Odr_fun)z_BriefBib},
- {VAL_OPAC, Z_External_OPAC, (Odr_fun)z_OPACRecord},
- {VAL_SEARCHRES1, Z_External_searchResult1, (Odr_fun)z_SearchInfoReport},
- {VAL_DBUPDATE, Z_External_update, (Odr_fun)z_IUUpdate},
- {VAL_DBUPDATE0, Z_External_update0, (Odr_fun)z_IU0Update},
- {VAL_DBUPDATE1, Z_External_update0, (Odr_fun)z_IU0Update},
- {VAL_DATETIME, Z_External_dateTime, (Odr_fun)z_DateTime},
- {VAL_UNIVERSE_REPORT, Z_External_universeReport,(Odr_fun)z_UniverseReport},
- {VAL_ADMINSERVICE, Z_External_ESAdmin, (Odr_fun)z_Admin},
- {VAL_USERINFO1, Z_External_userInfo1, (Odr_fun) z_OtherInformation},
- {VAL_CHARNEG3, Z_External_charSetandLanguageNegotiation, (Odr_fun)
- z_CharSetandLanguageNegotiation},
- {VAL_PROMPT1, Z_External_acfPrompt1, (Odr_fun) z_PromptObject1},
- {VAL_DES1, Z_External_acfDes1, (Odr_fun) z_DES_RN_Object},
- {VAL_KRB1, Z_External_acfKrb1, (Odr_fun) z_KRBObject},
- {VAL_MULTISRCH2, Z_External_multisrch2, (Odr_fun) z_MultipleSearchTerms_2},
- {VAL_CQL, Z_External_CQL, (Odr_fun) z_InternationalString},
- {VAL_OCLCUI, Z_External_OCLCUserInfo, (Odr_fun) z_OCLC_UserInformation},
- {VAL_NONE, 0, 0}
-};
-
-Z_ext_typeent *z_ext_getentbyref(oid_value val)
-{
- Z_ext_typeent *i;
-
- for (i = type_table; i->dref != VAL_NONE; i++)
- if (i->dref == val)
- return i;
- return 0;
-}
-
-int z_External(ODR o, Z_External **p, int opt, const char *name)
-{
- oident *oid;
- Z_ext_typeent *type;
-
- static Odr_arm arm[] =
- {
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_single,
- (Odr_fun)odr_any, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_External_octet,
- (Odr_fun)odr_octetstring, 0},
- {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_External_arbitrary,
- (Odr_fun)odr_bitstring, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_sutrs,
- (Odr_fun)z_SUTRS, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_explainRecord,
- (Odr_fun)z_ExplainRecord, 0},
-
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport1,
- (Odr_fun)z_ResourceReport1, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport2,
- (Odr_fun)z_ResourceReport2, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_promptObject1,
- (Odr_fun)z_PromptObject1, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_grs1,
- (Odr_fun)z_GenericRecord, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_extendedService,
- (Odr_fun)z_TaskPackage, 0},
-
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_itemOrder,
- (Odr_fun)z_IOItemOrder, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_diag1,
- (Odr_fun)z_DiagnosticFormat, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_espec1,
- (Odr_fun)z_Espec1, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_summary,
- (Odr_fun)z_BriefBib, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_OPAC,
- (Odr_fun)z_OPACRecord, 0},
-
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_searchResult1,
- (Odr_fun)z_SearchInfoReport, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_update,
- (Odr_fun)z_IUUpdate, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_dateTime,
- (Odr_fun)z_DateTime, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_universeReport,
- (Odr_fun)z_UniverseReport, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_ESAdmin,
- (Odr_fun)z_Admin, 0},
-
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_update0,
- (Odr_fun)z_IU0Update, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_userInfo1,
- (Odr_fun)z_OtherInformation, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_charSetandLanguageNegotiation,
- (Odr_fun)z_CharSetandLanguageNegotiation, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfPrompt1,
- (Odr_fun)z_PromptObject1, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfDes1,
- (Odr_fun)z_DES_RN_Object, 0},
-
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_acfKrb1,
- (Odr_fun)z_KRBObject, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_multisrch2,
- (Odr_fun)z_MultipleSearchTerms_2, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_CQL,
- (Odr_fun)z_InternationalString, 0},
- {ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_OCLCUserInfo,
- (Odr_fun)z_OCLC_UserInformation, 0},
- {-1, -1, -1, -1, 0, 0}
- };
-
- odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
- if (!odr_sequence_begin(o, p, sizeof(**p), name))
- return opt && odr_ok(o);
- if (!(odr_oid(o, &(*p)->direct_reference, 1, 0) &&
- odr_integer(o, &(*p)->indirect_reference, 1, 0) &&
- odr_graphicstring(o, &(*p)->descriptor, 1, 0)))
- return 0;
- /*
- * Do we know this beast?
- */
- if (o->direction == ODR_DECODE && (*p)->direct_reference &&
- (oid = oid_getentbyoid((*p)->direct_reference)) &&
- (type = z_ext_getentbyref(oid->value)))
- {
- int zclass, tag, cons;
-
- /*
- * We know it. If it's represented as an ASN.1 type, bias the CHOICE.
- */
- if (!odr_peektag(o, &zclass, &tag, &cons))
- return opt && odr_ok(o);
- if (zclass == ODR_CONTEXT && tag == 0 && cons == 1)
- odr_choice_bias(o, type->what);
- }
- return
- odr_choice(o, arm, &(*p)->u, &(*p)->which, name) &&
- odr_sequence_end(o);
-}
-
-Z_External *z_ext_record(ODR o, int format, const char *buf, int len)
-{
- Z_External *thisext;
-
- thisext = (Z_External *) odr_malloc(o, sizeof(*thisext));
- thisext->descriptor = 0;
- thisext->indirect_reference = 0;
-
- thisext->direct_reference =
- yaz_oidval_to_z3950oid (o, CLASS_RECSYN, format);
- if (!thisext->direct_reference)
- return 0;
-
- if (len < 0) /* Structured data */
- {
-
- /*
- * We cheat on the pointers here. Obviously, the record field
- * of the backend-fetch structure should have been a union for
- * correctness, but we're stuck with this for backwards
- * compatibility.
- */
- thisext->u.grs1 = (Z_GenericRecord*) buf;
-
- switch (format)
- {
- case VAL_SUTRS:
- thisext->which = Z_External_sutrs;
- break;
- case VAL_GRS1:
- thisext->which = Z_External_grs1;
- break;
- case VAL_EXPLAIN:
- thisext->which = Z_External_explainRecord;
- break;
- case VAL_SUMMARY:
- thisext->which = Z_External_summary;
- break;
- case VAL_OPAC:
- thisext->which = Z_External_OPAC;
- break;
- case VAL_EXTENDED:
- thisext->which = Z_External_extendedService;
- break;
- default:
- return 0;
- }
- }
- else if (format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */
- {
- Odr_oct *sutrs = (Odr_oct *)odr_malloc(o, sizeof(*sutrs));
-
- thisext->which = Z_External_sutrs;
- thisext->u.sutrs = sutrs;
- sutrs->buf = (unsigned char *)odr_malloc(o, len);
- sutrs->len = sutrs->size = len;
- memcpy(sutrs->buf, buf, len);
- }
- else
- {
- thisext->which = Z_External_octet;
- if (!(thisext->u.octet_aligned = (Odr_oct *)
- odr_malloc(o, sizeof(Odr_oct))))
- return 0;
- if (!(thisext->u.octet_aligned->buf = (unsigned char *)
- odr_malloc(o, len)))
- return 0;
- memcpy(thisext->u.octet_aligned->buf, buf, len);
- thisext->u.octet_aligned->len = thisext->u.octet_aligned->size = len;
- }
- return thisext;
-}
-
+++ /dev/null
-ResourceReport-Format-Universe-1
-{Z39-50-resourceReport universe-1 (1000)} DEFINITIONS ::=
-BEGIN
-IMPORTS StringOrNumeric FROM Z39-50-APDU-1995;
---
-
-UniverseReportHits ::= SEQUENCE {
- database StringOrNumeric,
- hits StringOrNumeric
-}
-
-UniverseReportDuplicate ::= SEQUENCE {
- hitno StringOrNumeric
-}
-
-UniverseReport ::= SEQUENCE {
- totalHits INTEGER,
- report CHOICE {
- databaseHits [0] IMPLICIT UniverseReportHits,
- duplicate [1] IMPLICIT UniverseReportDuplicate
- }
-}
-END
+++ /dev/null
-# YC Sample Config File for Z39.50
-# $Id: z.tcl,v 1.12 2003-07-18 19:53:28 mike Exp $
-# ----------------------------------------------------------
-# Prefix Specifications
-#
-# 1: C function prefix
-# 2: C type prefix
-# 3: C preprocessor prefix
-
-# Default prefix
-set default-prefix {z_ Z_ Z_}
-
-# Name clash in extended services (TargetPart, OriginPartToKeep, etc)
-# You can possibly think of better names :)
-set prefix(ESFormat-PersistentResultSet) {z_PR Z_PR Z_PR}
-set prefix(ESFormat-PersistentQuery) {z_PQuery Z_PQuery Z_PQuery}
-set prefix(ESFormat-PeriodicQuerySchedule) {z_PQS Z_PQS Z_PQS}
-set prefix(ESFormat-ItemOrder) {z_IO Z_IO Z_IO}
-set prefix(ESFormat-Update0) {z_IU0 Z_IU0 Z_IU0}
-set prefix(ESFormat-Update) {z_IU Z_IU Z_IU}
-set prefix(ESFormat-ExportSpecification) {z_ES Z_ES Z_ES}
-set prefix(ESFormat-ExportInvocation) {z_EI Z_EI Z_EI}
-
-# ----------------------------------------------------------
-# Settings for core of the protocol
-set m Z39-50-APDU-1995
-
-# Filename
-set filename($m) z-core
-
-# Public header initialization code
-set init($m,h) {
-typedef struct Z_External Z_External;
-YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
-}
-
-set body($m,h) "
-#ifdef __cplusplus
-extern \"C\" \{
-#endif
-
-int z_ANY_type_0 (ODR o, void **p, int opt);
-
-#ifdef __cplusplus
-\}
-#endif
-"
-set body($m,c) {
-
-/* the type-0 query ... */
-int z_ANY_type_0 (ODR o, void **p, int opt)
-{
- return 0;
-}
-
-}
-
-# Type Name overrides
-set map($m,PDU) APDU
-set membermap($m,Operator,and) {Operator_and op_and}
-set membermap($m,Operator,or) {Operator_or op_or}
-#set membermap($m,Operator,and-not) {Operator_and_not op_and_not}
-set map($m,AttributeElement_complex) ComplexAttribute
-set map($m,DeleteSetStatus) DeleteStatus
-set membermap($m,ProximityOperator,private) {ProximityOperator_private zprivate}
-set unionmap($m,AttributeElement,attributeValue) {which value AttributeValue}
-set membermap($m,ElementSpec,externalEspec) externalSpec
-set membermap($m,RPNStructure,op) simple
-set membermap($m,RPNStructure,rpnRpnOp) complex
-set map($m,RPNStructure_complex) Complex
-set membermap($m,Operand,attrTerm) {Operand_APT attributesPlusTerm}
-set membermap($m,Operand,resultSet) {Operand_resultSetId resultSetId}
-set membermap($m,Operand,resultAttr) {Operand_resultAttr resultAttr}
-set membermap($m,Complex,rpn1) s1
-set membermap($m,Complex,rpn2) s2
-set membermap($m,Complex,op) roperator
-set membermap($m,RPNQuery,attributeSet) attributeSetId
-set membermap($m,RPNQuery,rpn) RPNStructure
-set map($m,KnownProximityUnit) ProxUnit
-set membermap($m,ProximityOperator,lessThan) {Prox_lessThan 1}
-set membermap($m,ProximityOperator,lessThanOrEqual) {Prox_lessThanOrEqual 1}
-set membermap($m,ProximityOperator,equal) {Prox_equal 1}
-set membermap($m,ProximityOperator,greaterThanOrEqual) {Prox_greaterThanOrEqual 1}
-set membermap($m,ProximityOperator,greaterThan) {Prox_greaterThan 1}
-set membermap($m,ProximityOperator,notEqual) {Prox_notEqual 1}
-#
-set membermap($m,Records,responseRecords) {Records_DBOSD databaseOrSurDiagnostics}
-set membermap($m,Records,nonSurrogateDiagnostic) {Records_NSD nonSurrogateDiagnostic}
-set membermap($m,Records,multipleNonSurDiagnostics) {Records_multipleNSD multipleNonSurDiagnostics}
-set map($m,Records_DBOSD) NamePlusRecordList
-set map($m,Records_NSD) DiagRec
-set map($m,Records_multipleNSD) DiagRecs
-set membermap($m,NamePlusRecord,name) databaseName
-set unionmap($m,DiagRecs) {num_diagRecs diagRecs}
-set unionmap($m,NamePlusRecordList) {num_records records}
-#
-set membermap($m,ElementSetNames,genericElementSetName) generic
-set map($m,ElementSetNames_databaseSpecific) DatabaseSpecific
-#
-set map($m,OccurrenceByAttributes_s) OccurrenceByAttributesElem
-set map($m,OccurrenceByAttributesElem_byDatabase) byDatabaseList
-#
-set membermap($m,SortElement,datbaseSpecific) databaseSpecific
-set map($m,SortElement_databaseSpecific) SortDbSpecificList
-#
-set map($m,SortKey_sortAttributes) SortAttributes
-set unionmap($m,PresentRequest,recordComposition) {}
-set map($m,PresentRequest_0) RecordComposition
-set unionmap($m,PresentRequest,additionalRanges) {num_ranges additionalRanges}
-set unionmap($m,SortRequest,sortSequence) {}
-set map($m,SortRequest_0) SortKeySpecList
-set unionmap($m,SortKeySpecList) {num_specs specs}
-set map($m,InitializeRequest) InitRequest
-set map($m,InitializeResponse) InitResponse
-set unionmap($m,CloseReason) Close
-set membermap($m,ProtocolVersion,version-1) 1
-set membermap($m,ProtocolVersion,version-2) 2
-set membermap($m,ProtocolVersion,version-3) 3
-set membermap($m,InitRequest,exceptionalRecordSize) maximumRecordSize
-set membermap($m,InitResponse,exceptionalRecordSize) maximumRecordSize
-set map($m,RecordsMultipleNonSurDiagnostics) DiagRecs
-set map($m,RecordsDatabaseOrSurDiagnostics) NamePlusRecordList
-set membermap($m,NamePlusRecord,retrievalRecord) databaseRecord
-set unionmap($m,RecordComposition) {which u RecordComp}
-set unionmap($m,ScanResponse,scanStatus) Scan
-set unionmap($m,AttributeList) {num_attributes attributes}
-set membermap($m,SortKey,sortfield) sortField
-set map($m,CompSpec_0) DbSpecific
-set map($m,DatabaseSpecific_s) DatabaseSpecificUnit
-set map($m,ListStatuses_s) ListStatus
-set map($m,IdAuthenticationIdPass) IdPass
-set map($m,OtherInformation_s) OtherInformationUnit
-set unionmap($m,OtherInformationUnit,information) {which information OtherInfo}
-set unionmap($m,OtherInformation) {num_elements list}
-set unionmap($m,Specification,elementSpec) {}
-set map($m,Specification_0) ElementSpec
-set unionmap($m,Specification,schema) {which schema Schema}
-
-# ----
-set m DiagnosticFormatDiag1
-set filename($m) z-diag1
-set map($m,DiagFormat_tooMany) TooMany
-set map($m,DiagFormat_badSpec) BadSpec
-set map($m,DiagFormat_dbUnavail) DbUnavail
-set map($m,DiagFormat_attribute) Attribute
-set map($m,DiagFormat_attCombo) AttCombo
-set map($m,DiagFormat_term) DiagTerm
-set map($m,DiagFormat_proximity) Proximity
-set map($m,DiagFormat_scan) Scan
-set map($m,DiagFormat_sort) Sort
-set unionmap($m,Sort) {which u SortD}
-set map($m,DiagFormat_segmentation) Segmentation
-set map($m,DiagFormat_extServices) ExtServices
-set map($m,DiagFormat_accessCtrl) AccessCtrl
-set map($m,DiagFormat_recordSyntax) RecordSyntax
-#
-set map($m,Scan_termList2) AttrListList
-set map($m,Sort_inputTooLarge) StringList
-#
-set map($m,AccessCtrl_oid) OidList
-set map($m,AccessCtrl_alternative) AltOidList
-# ----
-set m RecordSyntax-explain
-set filename($m) z-exp
-set map($m,Explain-Record) ExplainRecord
-set map($m,ElementDataType_structured) ElementInfoList
-set map($m,HumanString_s) HumanStringUnit
-set unionmap($m,HumanString) {num_strings strings}
-set membermap($m,CommonInfo,humanString-Language) humanStringLanguage
-set unionmap($m,AttributeOccurrence,attributeValues) {which attributeValues AttributeOcc}
-set unionmap($m,AttributeCombination) {num_occurrences occurrences}
-#
-set membermap($m,NetworkAddress,internetAddress) {NetworkAddress_iA internetAddress}
-set map($m,NetworkAddress_iA) NetworkAddressIA
-set membermap($m,NetworkAddress,osiPresentationAddress) {NetworkAddress_oPA osiPresentationAddress}
-set map($m,NetworkAddress_oPA) NetworkAddressOPA
-set map($m,NetworkAddress_other) NetworkAddressOther
-set unionmap($m,DatabaseList) {num_databases databases}
-set membermap($m,TargetInfo,recent-news) recentNews
-set membermap($m,TargetInfo,usage-restrictions) usageRest
-set membermap($m,DatabaseInfo,user-fee) userFee
-#
-set map($m,ProximitySupport_0) ProxSupportUnit
-set map($m,ProxSupportUnitZprivate) ProxSupportPrivate
-set membermap($m,ProxSupportUnit,private) {ProxSupportUnit_private zprivate}
-#
-set map($m,AttributeOccurrence_specific) AttributeValueList
-set unionmap($m,AttributeValueList) {num_attributes attributes}
-
-set unionmap($m,ExplainRecord) {which u Explain}
-set map($m,SchemaInfo_0) TagTypeMapping
-set map($m,TagSetInfo_0) TagSetElements
-set map($m,TermListInfo_0) TermListElement
-set map($m,TermListDetails_0) EScanInfo
-set map($m,PrivateCapabilities_0) PrivateCapOperator
-set map($m,Costs_0) CostsOtherCharge
-set map($m,Path_s) PathUnit
-set map($m,IconObject_s) IconObjectUnit
-set map($m,NetworkAddressInternetAddress) NetworkAddressIA
-set map($m,NetworkAddressOsiPresentationAddress) NetworkAddressOPA
-set membermap($m,QueryTypeDetails,private) {QueryTypeDetails_private zprivate}
-set membermap($m,PrivateCapOperator,operator) roperator
-set map($m,AccessRestrictions_s) AccessRestrictionsUnit
-# ----
-set m RecordSyntax-SUTRS
-set filename($m) z-sutrs
-#set map($m,SutrsRecord) SUTRS
-set body($m,c) {
-int z_SUTRS (ODR o, Odr_oct **p, int opt, const char *name)
-{
- return odr_implicit_tag(o, odr_octetstring, p, ODR_UNIVERSAL,
- ODR_GENERALSTRING, opt, name);
-}
-}
-
-set init($m,h) {
-typedef Odr_oct Z_SUTRS;
-YAZ_EXPORT int z_SUTRS (ODR o, Odr_oct **p, int opt, const char *name);
-}
-# ----
-set m RecordSyntax-opac
-set filename($m) z-opac
-# ----
-set m RecordSyntax-summary
-set filename($m) z-sum
-# ----
-set m RecordSyntax-generic
-set filename($m) z-grs
-set map($m,ElementData_subtree) GenericRecord
-set map($m,Variant_0) Triple
-set membermap($m,Triple,class) zclass
-set unionmap($m,Triple,value) {which value Triple}
-set unionmap($m,GenericRecord) {num_elements elements}
-# ----
-set m RecordSyntax-ESTaskPackage
-set filename($m) z-estask
-# ----
-set m ResourceReport-Format-Resource-1
-set filename($m) z-rrf1
-set map($m,ResourceReport) ResourceReport1
-set map($m,Estimate) Estimate1
-# ----
-set m ResourceReport-Format-Resource-2
-set filename($m) z-rrf2
-set map($m,ResourceReport) ResourceReport2
-set map($m,Estimate) Estimate2
-# ----
-set m AccessControlFormat-prompt-1
-set filename($m) z-accform1
-set membermap($m,PromptId,enummeratedPrompt) enumeratedPrompt
-set map($m,PromptObject) PromptObject1
-set map($m,Challenge) Challenge1
-set map($m,Challenge1_s) ChallengeUnit1
-set map($m,Response) Response1
-set map($m,Response1_s) ResponseUnit1
-set map($m,PromptObject) PromptObject1
-# ----
-set m AccessControlFormat-des-1
-set filename($m) z-accdes1
-# ----
-set m AccessControlFormat-krb-1
-set filename($m) z-acckrb1
-# ----
-set m ESFormat-PersistentResultSet
-set filename($m) zes-pset
-# ----
-set m ESFormat-PersistentQuery
-set filename($m) zes-pquery
-# ----
-set m ESFormat-PeriodicQuerySchedule
-set filename($m) zes-psched
-# ----
-set m ESFormat-ItemOrder
-set filename($m) zes-order
-set map($m,ItemOrderEsRequest) Request
-set map($m,ItemOrderTaskPackage) TaskPackage
-set map($m,OriginPartToKeep_0) Contact
-set map($m,OriginPartToKeep_1) Billing
-set map($m,OriginPartNotToKeep_0) ResultSetItem
-#
-# ---- (old version)
-set m ESFormat-Update0
-set filename($m) zes-update0
-set map($m,SuppliedRecords_s) SuppliedRecords_elem
-set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
-#
-# ---- (new, current version)
-set m ESFormat-Update
-set filename($m) zes-update
-set map($m,SuppliedRecords_s) SuppliedRecords_elem
-set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
-# ----
-set m ESFormat-ExportSpecification
-set filename($m) zes-exps
-# ----
-set m ESFormat-ExportInvocation
-set filename($m) zes-expi
-# ----
-set m UserInfoFormat-searchResult-1
-set filename($m) z-uifr1
-# ----
-set m ElementSpecificationFormat-eSpec-1
-set filename($m) z-espec1
-set map($m,Espec-1) Espec1
-set map($m,TagPath) ETagPath
-set map($m,ETagPath_s) ETagUnit
-set map($m,ETagUnitSpecificTag) SpecificTag
-set membermap($m,SpecificTag,occurrence) occurrences
-set unionmap($m,ElementRequest) {which u ERequest}
-set unionmap($m,ETagPath) {num_tags tags}
-set map($m,OccurrencesValues) OccurValues
-# ----
-set m UserInfoFormat-dateTime
-set filename($m) z-date
-set map($m,Z3950Date) Date
-set map($m,Z3950Time) Time
-set unionmap($m,Z3950Date,era) {}
-set map($m,DateFlags_0) Era
-set map($m,Z3950DateMonthAndDay) MonthAndDay
-set map($m,Z3950DateQuarter) DateQuater
-set map($m,Z3950DateSeason) DateSeason
-set map($m,Date_0) DateFlags
-set unionmap($m,DateFlags,era) {}
-# ----
-set m UserInfoFormat-multipleSearchTerms-2
-set filename($m) z-mterm2
-# ----
-set m ResourceReport-Format-Universe-1
-set filename($m) z-univ
-# ----
-set m UserInfoFormat-oclcUserInformation
-set filename($m) z-oclcui
-# ----
-set m ESFormat-Admin
-set filename($m) zes-admin
-set map($m,EsRequest) ESAdminRequest
-set map($m,TaskPackage) ESAdminTaskPackage
-set map($m,OriginPartToKeep) ESAdminOriginPartToKeep
-set map($m,OriginPartNotToKeep) ESAdminOriginPartNotToKeep
-set map($m,TargetPart) ESAdminTargetPart
-# ----
-set m NegotiationRecordDefinition-charSetandLanguageNegotiation-3
-set filename($m) z-charneg
-set membermap($m,OriginProposal_0,private) {OriginProposal_0_private zprivate}
-set membermap($m,TargetResponse,private) {TargetResponse_private zprivate}
-# ----------------------------------------------------------
-# "Constructed" types defined by means of C-types are declared here.
-# Each function returns the C-handler and the C-type.
-proc asnBasicEXTERNAL {} {
- return {z_External Z_External}
-}
+++ /dev/null
-Z39-50-APDU-1995 -- OID for this definition, assigned in OID.3.1, is {Z39-50 2 1}
-DEFINITIONS ::=
-BEGIN -- Z39.50 Maintenance Agency Official Text for ANSI/NISO Z39.50-1995 - July 1995
---
-EXPORTS OtherInformation, Term, AttributeSetId, AttributeList, AttributeElement, ElementSetName, SortElement, DatabaseName,
-CompSpec, Specification, Permissions, InternationalString, IntUnit, Unit, StringOrNumeric, Query, Records, ResultSetId,
-DefaultDiagFormat, DiagRec, Segment;
---
-
-PDU ::= CHOICE{
- initRequest [20] IMPLICIT InitializeRequest,
- initResponse [21] IMPLICIT InitializeResponse,
- searchRequest [22] IMPLICIT SearchRequest,
- searchResponse [23] IMPLICIT SearchResponse,
- presentRequest [24] IMPLICIT PresentRequest,
- presentResponse [25] IMPLICIT PresentResponse,
- deleteResultSetRequest [26] IMPLICIT DeleteResultSetRequest,
- deleteResultSetResponse [27] IMPLICIT DeleteResultSetResponse,
- accessControlRequest [28] IMPLICIT AccessControlRequest,
- accessControlResponse [29] IMPLICIT AccessControlResponse,
- resourceControlRequest [30] IMPLICIT ResourceControlRequest,
- resourceControlResponse [31] IMPLICIT ResourceControlResponse,
- triggerResourceControlRequest [32] IMPLICIT TriggerResourceControlRequest,
- resourceReportRequest [33] IMPLICIT ResourceReportRequest,
- resourceReportResponse [34] IMPLICIT ResourceReportResponse,
- scanRequest [35] IMPLICIT ScanRequest,
- scanResponse [36] IMPLICIT ScanResponse,
- -- [37] through [42] reserved
- sortRequest [43] IMPLICIT SortRequest,
- sortResponse [44] IMPLICIT SortResponse,
- segmentRequest [45] IMPLICIT Segment,
- extendedServicesRequest [46] IMPLICIT ExtendedServicesRequest,
- extendedServicesResponse [47] IMPLICIT ExtendedServicesResponse,
- close [48] IMPLICIT Close,
- duplicateDetectionRequest [49] IMPLICIT DuplicateDetectionRequest,
- duplicateDetectionResponse [50] IMPLICIT DuplicateDetectionResponse}
-
-
--- Initialize APDUs
---
- InitializeRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- protocolVersion ProtocolVersion,
- options Options,
- preferredMessageSize [5] IMPLICIT INTEGER,
- exceptionalRecordSize [6] IMPLICIT INTEGER,
- idAuthentication [7] IdAuthentication OPTIONAL, -- see note below
- implementationId [110] IMPLICIT InternationalString OPTIONAL,
- implementationName [111] IMPLICIT InternationalString OPTIONAL,
- implementationVersion [112] IMPLICIT InternationalString OPTIONAL,
- userInformationField [11] EXTERNAL OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---Note:
--- For idAuthentication, the type ANY is retained for compatibility with earlier versions.
--- For interoperability, the following is recommended:
-IdAuthentication ::=
- CHOICE{
- open VisibleString,
- idPass SEQUENCE {
- groupId [0] IMPLICIT InternationalString OPTIONAL,
- userId [1] IMPLICIT InternationalString OPTIONAL,
- password [2] IMPLICIT InternationalString OPTIONAL },
- anonymous NULL,
- other EXTERNAL
- }
--- May use access control formats for 'other'. See Appendix 7 ACC.
---
- InitializeResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- protocolVersion ProtocolVersion,
- options Options,
- preferredMessageSize [5] IMPLICIT INTEGER,
- exceptionalRecordSize [6] IMPLICIT INTEGER,
- result [12] IMPLICIT BOOLEAN, -- reject = FALSE; Accept = TRUE
- implementationId [110] IMPLICIT InternationalString OPTIONAL,
- implementationName [111] IMPLICIT InternationalString OPTIONAL,
- implementationVersion [112] IMPLICIT InternationalString OPTIONAL,
- userInformationField [11] EXTERNAL OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
--- Begin auxiliary definitions for Init PDUs
- ProtocolVersion ::= [3] IMPLICIT BIT STRING{
- version-1 (0), -- This bit should always be set, but does not
- -- correspond to any Z39.50 version.
- version-2 (1), -- "Version 2 supported."
- -- This bit should always be set.
- version-3 (2) -- "Version 3 supported."
--- Values higher than 'version-3' should be ignored. Both the Initialize request and Initialize Response APDUs
--- include a value string corresponding to the supported versions. The highest common version is selected
--- for use. If there are no versions in common, "Result" in the Init Response should indicate "reject."
--- Note: Versions 1 and 2 are identical. Systems supporting version 2 should indicate support for version
--- 1 as well, for interoperability with systems that indicate support for version 1 only (e.g. ISO 10163-1991
--- implementations).
- }
- Options ::= [4] IMPLICIT BIT STRING{
- search (0),
- present (1),
- delSet (2),
- resourceReport (3),
- triggerResourceCtrl (4),
- resourceCtrl (5),
- accessCtrl (6),
- scan (7),
- sort (8),
- -- (not used) (9),
- extendedServices (10),
- level-1Segmentation (11),
- level-2Segmentation (12),
- concurrentOperations (13),
- namedResultSets (14),
- encapsulation (15),
- resultCount (16),
- negotiationModel (17),
- duplicateDetection (18),
- queryType104 (19),
- pQESCorrection (20),
- stringSchema (21)
-}
--- end auxiliary definitions for Init PDUs
-
-
---Search APDUs
- SearchRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- smallSetUpperBound [13] IMPLICIT INTEGER,
- largeSetLowerBound [14] IMPLICIT INTEGER,
- mediumSetPresentNumber [15] IMPLICIT INTEGER,
- replaceIndicator [16] IMPLICIT BOOLEAN,
- resultSetName [17] IMPLICIT InternationalString,
- databaseNames [18] IMPLICIT SEQUENCE OF DatabaseName,
- smallSetElementSetNames [100] ElementSetNames OPTIONAL,
- mediumSetElementSetNames [101] ElementSetNames OPTIONAL,
- preferredRecordSyntax [104] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- query [21] Query,
- -- Following two parameters may be used only if version 3 is in force.
- additionalSearchInfo [203] IMPLICIT OtherInformation OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-
--- Query Definitions
- Query ::= CHOICE{
- type-0 [0] ANY,
- type-1 [1] IMPLICIT RPNQuery,
- type-2 [2] OCTET STRING,
- type-100 [100] OCTET STRING,
- type-101 [101] IMPLICIT RPNQuery,
- type-102 [102] OCTET STRING,
- type-104 [104] IMPLICIT EXTERNAL
-}
---
--- Definitions for RPN query
- RPNQuery ::= SEQUENCE{
- attributeSet AttributeSetId,
- rpn RPNStructure}
---
- RPNStructure ::= CHOICE{
- op [0] Operand,
- rpnRpnOp [1] IMPLICIT SEQUENCE{
- rpn1 RPNStructure,
- rpn2 RPNStructure,
- op Operator }}
- Operand ::= CHOICE{
- attrTerm AttributesPlusTerm,
- resultSet ResultSetId,
- -- If version 2 is in force:
- -- - If query type is 1, one of the above two must be chosen;
- -- - resultAttr (below) may be used only if query type is 101.
- resultAttr ResultSetPlusAttributes}
-
- AttributesPlusTerm ::= [102] IMPLICIT SEQUENCE{
- attributes AttributeList,
- term Term}
- ResultSetPlusAttributes ::= [214] IMPLICIT SEQUENCE{
- resultSet ResultSetId,
- attributes AttributeList}
- AttributeList ::= [44] IMPLICIT SEQUENCE OF AttributeElement
---
- Term ::= CHOICE{
- general [45] IMPLICIT OCTET STRING,
- -- values below may be used only if version 3 is in force
- numeric [215] IMPLICIT INTEGER,
- characterString [216] IMPLICIT InternationalString,
- oid [217] IMPLICIT OBJECT IDENTIFIER,
- dateTime [218] IMPLICIT GeneralizedTime,
- external [219] IMPLICIT EXTERNAL,
- integerAndUnit [220] IMPLICIT IntUnit,
- null [221] IMPLICIT NULL}
-
- Operator ::= [46] CHOICE{
- and [0] IMPLICIT NULL,
- or [1] IMPLICIT NULL,
- and-not [2] IMPLICIT NULL,
- -- If version 2 is in force:
- -- - For query type 1, one of the above three must be chosen;
- -- - prox (below) may be used only if query type is 101.
- prox [3] IMPLICIT ProximityOperator}
- AttributeElement ::= SEQUENCE{
- attributeSet [1] IMPLICIT AttributeSetId OPTIONAL,
- -- Must be omitted if version 2 is in force.
- -- If included, overrides value of attributeSet
- -- in RPNQuery above, but only for this attribute.
- attributeType [120] IMPLICIT INTEGER,
- attributeValue CHOICE{
- numeric [121] IMPLICIT INTEGER,
- -- If version 2 is in force,
- -- Must select 'numeric' for attributeValue.
-
- complex [224] IMPLICIT SEQUENCE{
- list [1] IMPLICIT SEQUENCE OF StringOrNumeric,
- semanticAction [2] IMPLICIT SEQUENCE OF INTEGER OPTIONAL}}}
-
-
- ProximityOperator ::= SEQUENCE{
- exclusion [1] IMPLICIT BOOLEAN OPTIONAL,
- distance [2] IMPLICIT INTEGER,
- ordered [3] IMPLICIT BOOLEAN,
- relationType [4] IMPLICIT INTEGER{
- lessThan (1),
- lessThanOrEqual (2),
- equal (3),
- greaterThanOrEqual (4),
- greaterThan (5),
- notEqual (6)},
- proximityUnitCode [5] CHOICE{
- known [1] IMPLICIT KnownProximityUnit,
- private [2] IMPLICIT INTEGER}}
---
- KnownProximityUnit ::= INTEGER{
- character (1),
- word (2),
- sentence (3),
- paragraph (4),
- section (5),
- chapter (6),
- document (7),
- element (8),
- subelement (9),
- elementType (10),
- byte (11) -- Version 3 only
- }
--- End definitions for RPN Query
-
-
-SearchResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- resultCount [23] IMPLICIT INTEGER,
- numberOfRecordsReturned [24] IMPLICIT INTEGER,
- nextResultSetPosition [25] IMPLICIT INTEGER,
- searchStatus [22] IMPLICIT BOOLEAN,
- resultSetStatus [26] IMPLICIT INTEGER{
- subset (1),
- interim (2),
- none (3)} OPTIONAL,
- presentStatus PresentStatus OPTIONAL,
- records Records OPTIONAL,
- -- Following two parameters may be used only if version 3 is in force.
- additionalSearchInfo [203] IMPLICIT OtherInformation OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---Retrieval APDUs
- PresentRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- resultSetId ResultSetId,
- resultSetStartPoint [30] IMPLICIT INTEGER,
- numberOfRecordsRequested [29] IMPLICIT INTEGER,
- additionalRanges [212] IMPLICIT SEQUENCE OF Range OPTIONAL,
- -- additionalRanges may be included only if version 3 is in force.
- recordComposition CHOICE{
- simple [19] ElementSetNames,
- -- must choose 'simple' if version 2 is in force
- complex [209] IMPLICIT CompSpec} OPTIONAL,
- preferredRecordSyntax [104] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- maxSegmentCount [204] IMPLICIT INTEGER OPTIONAL, -- level 1 or 2
- maxRecordSize [206] IMPLICIT INTEGER OPTIONAL, -- level 2 only
- maxSegmentSize [207] IMPLICIT INTEGER OPTIONAL, -- level 2 only
- otherInfo OtherInformation OPTIONAL}
---
- Segment ::= SEQUENCE{
- -- Segment PDU may only be used when version 3 is in force,
- -- and only when segmentation is in effect.
- referenceId ReferenceId OPTIONAL,
- numberOfRecordsReturned [24] IMPLICIT INTEGER,
- segmentRecords [0] IMPLICIT SEQUENCE OF NamePlusRecord,
- otherInfo OtherInformation OPTIONAL}
---
- PresentResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- numberOfRecordsReturned [24] IMPLICIT INTEGER,
- nextResultSetPosition [25] IMPLICIT INTEGER,
- presentStatus PresentStatus,
- records Records OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
--- begin auxiliary definitions for Search and Present APDUs
-
--- begin definition of records
- Records ::= CHOICE{
- responseRecords [28] IMPLICIT SEQUENCE OF NamePlusRecord,
- nonSurrogateDiagnostic [130] IMPLICIT DefaultDiagFormat,
- multipleNonSurDiagnostics [205] IMPLICIT SEQUENCE OF DiagRec}
---
- NamePlusRecord ::= SEQUENCE{
- name [0] IMPLICIT DatabaseName OPTIONAL,
- record [1] CHOICE{
- retrievalRecord [1] EXTERNAL,
- surrogateDiagnostic [2] DiagRec,
- -- Must select one of the above two, retrievalRecord or
- -- surrogateDiagnostic, unless 'level 2 segmentation' is in effect.
- startingFragment [3] FragmentSyntax,
- intermediateFragment [4] FragmentSyntax,
- finalFragment [5] FragmentSyntax}}
- FragmentSyntax ::= CHOICE{
- externallyTagged EXTERNAL,
- notExternallyTagged OCTET STRING}
-
- DiagRec ::= CHOICE{
- defaultFormat DefaultDiagFormat,
- -- Must choose defaultFormat if version 2 is in effect.
- externallyDefined EXTERNAL}
-
- DefaultDiagFormat::= SEQUENCE{
- diagnosticSetId OBJECT IDENTIFIER,
- condition INTEGER,
- addinfo CHOICE{
- v2Addinfo VisibleString, -- version 2
- v3Addinfo InternationalString -- version 3
- }}
- -- end definition of records
- Range ::= SEQUENCE{
- startingPosition [1] IMPLICIT INTEGER,
- numberOfRecords [2] IMPLICIT INTEGER}
---
- ElementSetNames ::= CHOICE {
- genericElementSetName [0] IMPLICIT InternationalString,
- databaseSpecific [1] IMPLICIT SEQUENCE OF SEQUENCE{
- dbName DatabaseName,
- esn ElementSetName}}
-
- PresentStatus ::= [27] IMPLICIT INTEGER{
- success (0),
- partial-1 (1),
- partial-2 (2),
- partial-3 (3),
- partial-4 (4),
- failure (5)}
-
--- begin definition of composition specification
- CompSpec ::= SEQUENCE{
- selectAlternativeSyntax [1] IMPLICIT BOOLEAN,
- -- See comment for recordSyntax, below.
- generic [2] IMPLICIT Specification OPTIONAL,
- dbSpecific [3] IMPLICIT SEQUENCE OF SEQUENCE{
- db [1] DatabaseName,
- spec [2] IMPLICIT Specification} OPTIONAL,
- -- At least one of generic and dbSpecific must occur, and both may occur. If both, then for
- -- any record not in the list of databases within dbSpecific, generic applies.
- recordSyntax [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL
- -- For each record, the target selects the first record syntax
- -- in this list that it can support. If the list is exhausted, the
- -- target may select an alternative syntax if
- -- selectAlternativeSyntax is 'true'.
- }
- Specification ::= SEQUENCE{
- schema CHOICE {
- oid [1] IMPLICIT OBJECT IDENTIFIER,
- uri [300] IMPLICIT InternationalString
- } OPTIONAL,
- elementSpec [2] CHOICE{
- elementSetName [1] IMPLICIT InternationalString,
- externalEspec [2] IMPLICIT EXTERNAL} OPTIONAL}
--- end definition of composition specification
--- end auxiliary definitions for search and response APDUs
-
--- Delete APDUs
- DeleteResultSetRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- deleteFunction [32] IMPLICIT INTEGER{
- list (0),
- all (1)},
- resultSetList SEQUENCE OF ResultSetId OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---
- DeleteResultSetResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- deleteOperationStatus [0] IMPLICIT DeleteSetStatus,
- deleteListStatuses [1] IMPLICIT ListStatuses OPTIONAL,
- numberNotDeleted [34] IMPLICIT INTEGER OPTIONAL,
- bulkStatuses [35] IMPLICIT ListStatuses OPTIONAL,
- deleteMessage [36] IMPLICIT InternationalString OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
- ListStatuses ::= SEQUENCE OF SEQUENCE{
- id ResultSetId,
- status DeleteSetStatus}
-
- DeleteSetStatus ::= [33] IMPLICIT INTEGER{
- success (0),
- resultSetDidNotExist (1),
- previouslyDeletedByTarget (2),
- systemProblemAtTarget (3),
- accessNotAllowed (4),
- resourceControlAtOrigin (5),
- resourceControlAtTarget (6),
- bulkDeleteNotSupported (7),
- notAllRsltSetsDeletedOnBulkDlte (8),
- notAllRequestedResultSetsDeleted (9),
- resultSetInUse (10)}
---
-
---Access- and Resource-control APDUs
---
- AccessControlRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- securityChallenge CHOICE{
- simpleForm [37] IMPLICIT OCTET STRING,
- externallyDefined [0] EXTERNAL},
- otherInfo OtherInformation OPTIONAL}
-
- AccessControlResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- securityChallengeResponse CHOICE{
- simpleForm [38] IMPLICIT OCTET STRING,
- externallyDefined [0] EXTERNAL} OPTIONAL,
- -- Optional only in version 3; mandatory in version 2. If
- -- omitted (in version 3) then diagnostic must occur.
- diagnostic [223] DiagRec OPTIONAL, -- Version 3 only.
- otherInfo OtherInformation OPTIONAL}
-
-
-
- ResourceControlRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- suspendedFlag [39] IMPLICIT BOOLEAN OPTIONAL,
- resourceReport [40] ResourceReport OPTIONAL,
- partialResultsAvailable [41] IMPLICIT INTEGER{
- subset (1),
- interim (2),
- none (3)} OPTIONAL,
- responseRequired [42] IMPLICIT BOOLEAN,
- triggeredRequestFlag [43] IMPLICIT BOOLEAN OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-
- ResourceControlResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- continueFlag [44] IMPLICIT BOOLEAN,
- resultSetWanted [45] IMPLICIT BOOLEAN OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-
-
- TriggerResourceControlRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- requestedAction [46] IMPLICIT INTEGER{
- resourceReport (1),
- resourceControl (2),
- cancel (3)},
- prefResourceReportFormat [47] IMPLICIT ResourceReportId OPTIONAL,
- resultSetWanted [48] IMPLICIT BOOLEAN OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-
-
- ResourceReportRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- opId [210] IMPLICIT ReferenceId OPTIONAL,
- prefResourceReportFormat [49] IMPLICIT ResourceReportId OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---
- ResourceReportResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- resourceReportStatus [50] IMPLICIT INTEGER{
- success (0),
- partial (1),
- failure-1 (2),
- failure-2 (3),
- failure-3 (4),
- failure-4 (5),
- failure-5 (6),
- failure-6 (7)},
- resourceReport [51] ResourceReport OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---
- ResourceReport ::= EXTERNAL
- ResourceReportId ::= OBJECT IDENTIFIER
-
---Scan APDUs
- ScanRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- databaseNames [3] IMPLICIT SEQUENCE OF DatabaseName,
- attributeSet AttributeSetId OPTIONAL,
- termListAndStartPoint AttributesPlusTerm,
- stepSize [5] IMPLICIT INTEGER OPTIONAL,
- numberOfTermsRequested [6] IMPLICIT INTEGER,
- preferredPositionInResponse [7] IMPLICIT INTEGER OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
- ScanResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- stepSize [3] IMPLICIT INTEGER OPTIONAL,
- scanStatus [4] IMPLICIT INTEGER {
- success (0),
- partial-1 (1),
- partial-2 (2),
- partial-3 (3),
- partial-4 (4),
- partial-5 (5),
- failure (6) },
- numberOfEntriesReturned [5] IMPLICIT INTEGER,
- positionOfTerm [6] IMPLICIT INTEGER OPTIONAL,
- entries [7] IMPLICIT ListEntries OPTIONAL,
- attributeSet [8] IMPLICIT AttributeSetId OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
--- begin auxiliary definitions for Scan
- ListEntries ::= SEQUENCE{
- entries [1] IMPLICIT SEQUENCE OF Entry OPTIONAL,
- nonsurrogateDiagnostics [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL
- -- At least one of entries and nonsurrogateDiagnostics must occur
- }
-
- Entry ::= CHOICE {
- termInfo [1] IMPLICIT TermInfo,
- surrogateDiagnostic [2] DiagRec}
---
- TermInfo ::= SEQUENCE {
- term Term,
- displayTerm [0] IMPLICIT InternationalString OPTIONAL,
- -- Presence of displayTerm means that term is not considered by
- -- the target to be suitable for display, and displayTerm should
- -- instead be displayed. 'term' is the actual term in the term list;
- -- 'displayTerm' is for display purposes only, and is not an actual
- -- term in the term list.
- suggestedAttributes AttributeList OPTIONAL,
- alternativeTerm [4] IMPLICIT SEQUENCE OF AttributesPlusTerm OPTIONAL,
- globalOccurrences [2] IMPLICIT INTEGER OPTIONAL,
- byAttributes [3] IMPLICIT OccurrenceByAttributes OPTIONAL,
- otherTermInfo OtherInformation OPTIONAL}
-
- OccurrenceByAttributes ::= SEQUENCE OF SEQUENCE{
- attributes [1] AttributeList,
- occurrences CHOICE{
- global [2] INTEGER,
- byDatabase [3] IMPLICIT SEQUENCE OF SEQUENCE{
- db DatabaseName,
- num [1] IMPLICIT INTEGER OPTIONAL,
- otherDbInfo OtherInformation OPTIONAL}} OPTIONAL,
- otherOccurInfo OtherInformation OPTIONAL}
--- end auxiliary definitions for Scan
-
--- Sort APDUs
-SortRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- inputResultSetNames [3] IMPLICIT SEQUENCE OF InternationalString,
- sortedResultSetName [4] IMPLICIT InternationalString,
- sortSequence [5] IMPLICIT SEQUENCE OF SortKeySpec,
- -- order of occurrence is from major to minor
- otherInfo OtherInformation OPTIONAL}
-
-SortResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- sortStatus [3] IMPLICIT INTEGER{
- success (0),
- partial-1 (1),
- failure (2)},
- resultSetStatus [4] IMPLICIT INTEGER{
- empty (1),
- interim (2),
- unchanged (3),
- none (4)} OPTIONAL,
- diagnostics [5] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
- resultCount [6] IMPLICIT INTEGER OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
--- begin auxiliary definitions for Sort
- SortKeySpec ::= SEQUENCE{
- sortElement SortElement,
- sortRelation [1] IMPLICIT INTEGER{
- ascending (0),
- descending (1),
- ascendingByFrequency (3),
- descendingByfrequency (4)},
- caseSensitivity [2] IMPLICIT INTEGER{
- caseSensitive (0),
- caseInsensitive (1)},
- missingValueAction [3] CHOICE{
- abort [1] IMPLICIT NULL,
- null [2] IMPLICIT NULL,
- --supply a null value for missing value
- missingValueData [3] IMPLICIT OCTET STRING} OPTIONAL}
-
- SortElement ::= CHOICE{
- generic [1] SortKey,
- datbaseSpecific [2] IMPLICIT SEQUENCE OF SEQUENCE{
- databaseName DatabaseName,
- dbSort SortKey}}
-
- SortKey ::= CHOICE{
- sortfield [0] IMPLICIT InternationalString,
- -- An element, element-group-tag, or alias supported by the target
- -- and denoting a set of elements associated with each record.
- elementSpec [1] IMPLICIT Specification,
- sortAttributes [2] IMPLICIT SEQUENCE{
- id AttributeSetId,
- list AttributeList}}
--- end auxiliary definitions for sort
-
-
-
--- Extended Service APDUs
- ExtendedServicesRequest ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- function [3] IMPLICIT INTEGER {
- create (1),
- delete (2),
- modify (3)},
- packageType [4] IMPLICIT OBJECT IDENTIFIER,
- packageName [5] IMPLICIT InternationalString OPTIONAL,
- -- PackageName mandatory for 'modify' or 'delete'; optional for
- -- 'create'. Following four parameters mandatory for 'create'; should
- -- be included on 'modify' if being modified; not needed on 'delete'.
- userId [6] IMPLICIT InternationalString OPTIONAL,
- retentionTime [7] IMPLICIT IntUnit OPTIONAL,
- permissions [8] IMPLICIT Permissions OPTIONAL,
- description [9] IMPLICIT InternationalString OPTIONAL,
-
--- (ExtendedServiceRequest APDU continued)
- taskSpecificParameters [10] IMPLICIT EXTERNAL OPTIONAL,
- -- Mandatory for 'create'; included on 'modify' if specific
- -- parameters being modified; not necessary on 'delete'. For the
- -- 'EXTERNAL,' use OID of specific ES definition and select
- -- CHOICE [1]: 'esRequest'.
- waitAction [11] IMPLICIT INTEGER{
- wait (1),
- waitIfPossible (2),
- dontWait (3),
- dontReturnPackage (4)},
- elements ElementSetName OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
---
-
-ExtendedServicesResponse ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL,
- operationStatus [3] IMPLICIT INTEGER{
- done (1),
- accepted (2),
- failure (3)},
- diagnostics [4] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
- taskPackage [5] IMPLICIT EXTERNAL OPTIONAL,
- -- Use OID: {Z39-50-recordSyntax (106)} and corresponding
- -- syntax. For the EXTERNAL, 'taskSpecific,' within that
- -- definition, use OID of the specific es, and choose [2],
- -- 'taskPackage'.
- otherInfo OtherInformation OPTIONAL}
-
- Permissions ::= SEQUENCE OF SEQUENCE{
- userId [1] IMPLICIT InternationalString,
- allowableFunctions [2] IMPLICIT SEQUENCE OF INTEGER{
- delete (1),
- modifyContents (2),
- modifyPermissions (3),
- present (4),
- invoke (5)}}
-
-Close ::= SEQUENCE{
- referenceId ReferenceId OPTIONAL, -- See 3.2.11.1.5.
- closeReason CloseReason,
- diagnosticInformation [3] IMPLICIT InternationalString OPTIONAL,
- resourceReportFormat [4] IMPLICIT ResourceReportId OPTIONAL,
- -- For use by origin only, and only on Close request;
- -- origin requests target to include report in response.
- resourceReport [5] ResourceReport OPTIONAL,
- -- For use by target only, unilaterally on Close request;
- -- on Close response may be unilateral or in response
- -- to origin request.
- otherInfo OtherInformation OPTIONAL}
-
- CloseReason ::= [211] IMPLICIT INTEGER{
- finished (0),
- shutdown (1),
- systemProblem (2),
- costLimit (3),
- resources (4),
- securityViolation (5),
- protocolError (6),
- lackOfActivity (7),
- peerAbort (8),
- unspecified (9)}
-
---Duplicate detection APDUs
-DuplicateDetectionRequest ::= SEQUENCE {
- referenceId ReferenceId OPTIONAL,
- inputResultSetIds [3] IMPLICIT SEQUENCE OF InternationalString,
- outputResultSetName [4] IMPLICIT InternationalString,
- applicablePortionOfRecord [5] IMPLICIT EXTERNAL OPTIONAL,
- duplicateDetectionCriteria [6] IMPLICIT SEQUENCE OF
- DuplicateDetectionCriterion OPTIONAL,
- clustering [7] IMPLICIT BOOLEAN OPTIONAL,
- -- 'true' means "clustered".
- -- This parameter may be omitted
- -- only if retentionCriteria CHOICE is
- -- 'numberOfEntries' and its value is 1.
- retentionCriteria [8] IMPLICIT SEQUENCE OF
- RetentionCriterion,
- sortCriteria [9] IMPLICIT SEQUENCE OF
- SortCriterion OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-DuplicateDetectionCriterion ::= CHOICE{
- levelOfMatch [1] IMPLICIT INTEGER,
- -- a percentage; 1-100.
- caseSensitive [2] IMPLICIT NULL,
- punctuationSensitive [3] IMPLICIT NULL,
- regularExpression [4] IMPLICIT EXTERNAL,
- rsDuplicates [5] IMPLICIT NULL
- -- values 6-100 reserved for future assignment.
- }
-
-RetentionCriterion ::= CHOICE{
- numberOfEntries [1] IMPLICIT INTEGER,
- -- greater than 0
- percentOfEntries [2] IMPLICIT INTEGER,
- -- 1-100,
- duplicatesOnly [3] IMPLICIT NULL,
- -- should not be chosen
- -- if clustering is 'true'
- discardRsDuplicates [4] IMPLICIT NULL
- -- values 5-100 reserved for future assignment.
- }
-
-SortCriterion ::= CHOICE{
- mostComprehensive [1] IMPLICIT NULL,
- leastConmprehensive [2] IMPLICIT NULL,
- mostRecent [3] IMPLICIT NULL,
- oldest [4] IMPLICIT NULL,
- leastCost [5] IMPLICIT NULL,
- preferredDatabases [6] IMPLICIT
- SEQUENCE OF InternationalString
- -- values 7-100 reserved for future assignment.
-}
-
-DuplicateDetectionResponse ::= SEQUENCE {
- referenceId ReferenceId OPTIONAL,
- status [3] IMPLICIT INTEGER{
- success (0),
- failure (1)},
- resultSetCount [4] IMPLICIT INTEGER OPTIONAL,
- diagnostics [5] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
--- Global auxiliary definitions
- ReferenceId ::= [2] IMPLICIT OCTET STRING
- ResultSetId ::= [31] IMPLICIT InternationalString
- ElementSetName ::= [103] IMPLICIT InternationalString
- DatabaseName ::= [105] IMPLICIT InternationalString
- AttributeSetId ::= OBJECT IDENTIFIER
-
-
--- OtherInformation
- OtherInformation ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
- category [1] IMPLICIT InfoCategory OPTIONAL,
- information CHOICE{
- characterInfo [2] IMPLICIT InternationalString,
- binaryInfo [3] IMPLICIT OCTET STRING,
- externallyDefinedInfo [4] IMPLICIT EXTERNAL,
- oid [5] IMPLICIT OBJECT IDENTIFIER}}
---
- InfoCategory ::= SEQUENCE{
- categoryTypeId [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- categoryValue [2] IMPLICIT INTEGER}
-
-
--- Units
- -- IntUnit is used when value and unit are supplied together. Unit, alone, is used when just
- -- specifying a unit (without a value). For example, IntUnit is used in Term, in an RPNQuery, or
- -- it can be the datatype of an element within a retrieval record. Unit (alone) would be used in an
- -- element request, when requesting data be returned according to a particular unit.
-
- IntUnit ::= SEQUENCE{
- value [1] IMPLICIT INTEGER,
- unitUsed [2] IMPLICIT Unit}
---
- Unit ::= SEQUENCE{
- unitSystem [1] InternationalString OPTIONAL, -- e.g. 'SI'
- unitType [2] StringOrNumeric OPTIONAL, -- e.g. 'mass'
- unit [3] StringOrNumeric OPTIONAL, -- e.g. 'kilograms'
- scaleFactor [4] IMPLICIT INTEGER OPTIONAL -- e.g. 9 means 10**9
- }
-
---CharacterString
- InternationalString ::= GeneralString
- -- When version 2 is in force, this collapses to VisibleString. That is, only characters in the
- -- visibleString repertoire may be used. (Datatype compatibility with version 2 is not affected,
- -- because references are IMPLICIT.) When version 3 is in force, the semantics of the
- -- GeneralString content may be altered by negotiation during initialization. If no such
- -- negotiation is in effect, then GeneralString semantics are in force.
-
-StringOrNumeric ::= CHOICE{
- string [1] IMPLICIT InternationalString,
- numeric [2] IMPLICIT INTEGER}
-
-END -- IR DEFINITIONS
-
-
-
-DiagnosticFormatDiag1
-{Z39-50-diagnosticFormat diag-1 (2)} DEFINITIONS ::=
-BEGIN
-IMPORTS Term, Specification, AttributeList, SortElement, DatabaseName,
-DefaultDiagFormat, InternationalString FROM Z39-50-APDU-1995;
-
-
-DiagnosticFormat ::= SEQUENCE OF SEQUENCE{
- diagnostic [1] CHOICE{
- defaultDiagRec [1] IMPLICIT DefaultDiagFormat,
- explicitDiagnostic [2] DiagFormat} OPTIONAL,
- message [2] IMPLICIT InternationalString OPTIONAL}
-
-
-DiagFormat ::= CHOICE{
-
-tooMany [1000] IMPLICIT SEQUENCE{
- tooManyWhat [1] IMPLICIT INTEGER{
- argumentWords (1),
- truncatedWords (2),
- booleanOperators (3),
- incompleteSubfields (4),
- characters (5),
- recordsRetrieved (6),
- dataBasesSpecified (7),
- resultSetsCreated (8),
- indexTermsProcessed (9)},
- max [2] IMPLICIT INTEGER OPTIONAL},
-
-
-
-
-
-
-
-badSpec [1001] IMPLICIT SEQUENCE{ -- element set name or specification
- spec [1] IMPLICIT Specification, -- esn or element spec not supported
- db [2] IMPLICIT DatabaseName OPTIONAL,
- -- if db specified, above spec not supported for db; otherwise,
- -- spec not supported period.
- goodOnes [3] IMPLICIT SEQUENCE OF Specification OPTIONAL
- -- target supplies ones that are supported
- },
-
-
-dbUnavail [1002] IMPLICIT SEQUENCE{ -- database unavailable
- db [1] IMPLICIT DatabaseName,
- why [2] IMPLICIT SEQUENCE{
- reasonCode [1] IMPLICIT INTEGER{
- doesNotExist (0),
- existsButUnavail (1),
- locked (2),
- accessDenied (3)} OPTIONAL,
- message [2] IMPLICIT InternationalString OPTIONAL}},
-
-
-unSupOp [1003] IMPLICIT INTEGER{ -- unsupported operator
- and (0),
- or (1),
- and-not (2),
- prox (3)},
-
-
-attribute [1004] IMPLICIT SEQUENCE{
- -- Applies for unsupported attribute set, attribute type,
- -- attribute value, or term (for a given attribute type or value).
-
- id [1] IMPLICIT OBJECT IDENTIFIER,
- -- if only "id" occurs, then attribute set is not supported
- type [2] IMPLICIT INTEGER OPTIONAL,
- -- must occur if value occurs.
- value [3] IMPLICIT INTEGER OPTIONAL,
- -- if omitted, and Type occurs, then Type is what is unsupported
- term [4] Term OPTIONAL
- -- If occurs, term is illegal or not supported, for attribute value,
- -- if value occurs; otherwise, for type.
- },
-
-
-attCombo [1005] IMPLICIT SEQUENCE{ -- attribute combination not supported
- unsupportedCombination [1] IMPLICIT AttributeList,
- recommendedAlternatives [2] IMPLICIT SEQUENCE OF AttributeList OPTIONAL},
-
-
-
-
-term [1006] IMPLICIT SEQUENCE{
- problem [1] IMPLICIT INTEGER{
- codedValue (1),
- unparsable (2),
- tooShort (3),
- type (4)} OPTIONAL,
- term [2] Term},
-
-
-proximity [1007] CHOICE{ -- proximity diagnostics:
- resultSets [1] IMPLICIT NULL, -- proximity between sets not supported
- badSet [2] IMPLICIT InternationalString, -- bad result set specified
- relation [3] IMPLICIT INTEGER, -- 1 to 6 ; relation not supported
- unit [4] IMPLICIT INTEGER, -- unsupported unit code
- distance [5] IMPLICIT INTEGER, -- unsupported distance
- attributes [6] AttributeList, -- proximity not supported with specified
- -- attribute combination
- ordered [7] IMPLICIT NULL, -- ordered flag not supported
- exclusion [8] IMPLICIT NULL -- exclusion flag not supported
- },
-
-
-
-
-
-scan [1008] CHOICE{ -- scan diagnostics:
- nonZeroStepSize [0] IMPLICIT NULL, -- only zero step size supported
- specifiedStepSize [1] IMPLICIT NULL, -- specified step size not supported
- termList1 [3] IMPLICIT NULL, -- term list not supported (no alternative supplied)
- termList2 [4] IMPLICIT SEQUENCE OF AttributeList,
- -- term list not supported (alternatives supplied)
- posInResponse [5] IMPLICIT INTEGER{ --value of positionInResponse not supported
- mustBeOne (1),
- mustBePositive (2),
- mustBeNonNegative (3),
- other (4)},
- resources [6] IMPLICIT NULL, -- resources exhausted looking for satisfying terms
- endOfList [7] IMPLICIT NULL -- beginning or end of term list
- },
-
-
-sort [1009] CHOICE{
- sequence [0] IMPLICIT NULL, -- cannot sort according to sequence
- noRsName [1] IMPLICIT NULL, -- no result set name supplied
- tooMany [2] IMPLICIT INTEGER, -- Too many input result sets,
- -- maximum supplied.
- incompatible [3] IMPLICIT NULL, -- records with different formats
- -- not compatible for sorting
- generic [4] IMPLICIT NULL, -- generic sort not supported
- -- (db specific only)
- dbSpecific [5] IMPLICIT NULL, -- db specific sort not supported
- sortElement [6] SortElement,
- key [7] IMPLICIT INTEGER{
- tooMany (1), -- too many sort keys
- duplicate (2)}, -- duplicate sort keys
- action [8] IMPLICIT NULL, -- unsupported missing data action
- illegal [9] IMPLICIT INTEGER{
- relation (1), -- illegal sort relation
- case (2), -- illegal case value
- action (3), -- illegal missing data action
- sort (4)}, -- illegal sort
- inputTooLarge [10] IMPLICIT SEQUENCE OF InternationalString,
- -- one or more of the input result sets too large to sort
- aggregateTooLarge [11] IMPLICIT NULL -- aggregate result set too large
- },
-
-segmentation [1010] CHOICE{
- segmentCount [0] IMPLICIT NULL,
- -- Cannot guarantee record will fit within max segments. Target
- -- suggests that origin try again to retrieve record, without
- -- including max-segment-count.
- segmentSize [1] IMPLICIT INTEGER
- -- record cannot be segmented into fragments such that the largest
- -- will fit within max segment size specified. Target supplies (in
- -- bytes) the smallest acceptable value of Max-segment-size to
- -- retrieve the record.
- },
-
-
-extServices [1011] CHOICE{
- req [1] IMPLICIT INTEGER{ -- bad request
- nameInUse (1), -- package name already in use
- noSuchName (2), -- no such package, on modify/delete
- quota (3), -- quota exceeded
- type (4)}, -- extended service type not supported
- permission [2] IMPLICIT INTEGER{ -- permission denied on ES, because:
- id (1), -- id not authorized, or
- modifyDelete (2)}, -- cannot modify or delete
- immediate [3] IMPLICIT INTEGER{ -- immediate execution:
- failed (1), -- failed,
- service (2), -- not supported for this service, or
- parameters (3) -- for these parameters.
- }},
-
-
-accessCtrl [1012] CHOICE{
- noUser [1] IMPLICIT NULL, -- no user to display challenge to
- refused [2] IMPLICIT NULL, -- access control information refused by user
- simple [3] IMPLICIT NULL, -- only simple form supported (target used
- -- externally defined)
- oid [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
- -- oid not supported (origin supplies alternative
- -- suggested oids)
- alternative [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
- -- origin insists that target use an alternative
- -- challenge for this data (e.g. stronger
-
- -- authentication or stronger Access control). The
- -- origin supplies suggested alternative oids.
- pwdInv [6] IMPLICIT NULL, -- password invalid
- pwdExp [7] IMPLICIT NULL -- password expired
- },
-
-
-recordSyntax [1013] IMPLICIT SEQUENCE{ -- record cannot be transferred in requested syntax
- unsupportedSyntax [1] IMPLICIT OBJECT IDENTIFIER,
- suggestedAlternatives [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
-}
-
-END
-
-
-
-
-
-RecordSyntax-explain
-{Z39-50-recordSyntax explain (100)} DEFINITIONS ::=
-
-BEGIN
-IMPORTS AttributeSetId, Term, OtherInformation, DatabaseName, ElementSetName, IntUnit, Unit,
- StringOrNumeric, Specification, InternationalString, AttributeList, AttributeElement FROM Z39-50-APDU-1995;
-EXPORTS LanguageCode;
-
-Explain-Record ::= CHOICE{
- -- Each of these may be used as search term when Use attribute is 'explain-category'.
- targetInfo [0] IMPLICIT TargetInfo,
- databaseInfo [1] IMPLICIT DatabaseInfo,
- schemaInfo [2] IMPLICIT SchemaInfo,
- tagSetInfo [3] IMPLICIT TagSetInfo,
- recordSyntaxInfo [4] IMPLICIT RecordSyntaxInfo,
- attributeSetInfo [5] IMPLICIT AttributeSetInfo,
- termListInfo [6] IMPLICIT TermListInfo,
- extendedServicesInfo [7] IMPLICIT ExtendedServicesInfo,
- attributeDetails [8] IMPLICIT AttributeDetails,
- termListDetails [9] IMPLICIT TermListDetails,
- elementSetDetails [10] IMPLICIT ElementSetDetails,
- retrievalRecordDetails [11] IMPLICIT RetrievalRecordDetails,
- sortDetails [12] IMPLICIT SortDetails,
- processing [13] IMPLICIT ProcessingInformation,
- variants [14] IMPLICIT VariantSetInfo,
- units [15] IMPLICIT UnitInfo,
- categoryList [100] IMPLICIT CategoryList}
-
--- Element set name 'B' (brief) retrieves:
--- - 'commonInfo' (except for otherInfo within commonInfo)
--- - key elements
--- - other elements designated as 'non-key brief elements'
--- Esn 'description' retrieves brief elements as well as 'description', and specific additional descriptive
--- elements if designated.
--- Element set name 'F' (full) retrieves all of the above, as well as those designated as "non-brief elements". Some
--- elements designated as OPTIONAL may be mandatory in full records, and are so identified. (Note that all elements
--- that are not part of the brief element set must be designated as OPTIONAL in the ASN.1, otherwise it would be
--- illegal to omit them.)
--- Other esns are defined (below) as needed.
-
--- - - - - - - - - - - - - Info Records
- -- Info records are mainly for software consumption
- -- They describe individual entities within the target system:
- -- The target itself
- -- Individual databases
- -- Schemas
- -- Tag sets
- -- Record syntaxes
- -- Attribute sets
- -- Term lists
- -- Extended services
- -- The information about each Schema, Tag Set, Record Syntax and Attribute Set should
- -- match the universal definitions of these items. The only exception is that a target may omit any
- -- items it doesn't support, for example the description of the bib-1 attribute set may omit attributes
- -- that the target does not support under any circumstances.
- -- Databases that may be searched together can be listed in the dbCominations element of the TargetInfo record.
-TargetInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- name [1] IMPLICIT InternationalString,
- -- Non-key brief elements follow:
- recent-news [2] IMPLICIT HumanString OPTIONAL,
- icon [3] IMPLICIT IconObject OPTIONAL,
- namedResultSets [4] IMPLICIT BOOLEAN,
- multipleDBsearch [5] IMPLICIT BOOLEAN,
- maxResultSets [6] IMPLICIT INTEGER OPTIONAL,
- maxResultSize [7] IMPLICIT INTEGER OPTIONAL,
- maxTerms [8] IMPLICIT INTEGER OPTIONAL,
- timeoutInterval [9] IMPLICIT IntUnit OPTIONAL,
- welcomeMessage [10] IMPLICIT HumanString OPTIONAL,
- -- non-brief elements follow:
- -- 'description' esn retrieves the following two (as well as brief):
- contactInfo [11] IMPLICIT ContactInfo OPTIONAL,
- description [12] IMPLICIT HumanString OPTIONAL,
- nicknames [13] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- usage-restrictions [14] IMPLICIT HumanString OPTIONAL,
- paymentAddr [15] IMPLICIT HumanString OPTIONAL,
- hours [16] IMPLICIT HumanString OPTIONAL,
- dbCombinations [17] IMPLICIT SEQUENCE OF DatabaseList OPTIONAL,
- addresses [18] IMPLICIT SEQUENCE OF NetworkAddress OPTIONAL,
- languages [101] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- -- Languages supported for message strings. Each is a three-character
- -- language code from Z39.53-1994.
--- characterSets [102] this tag reserved for "character sets supported for name and message strings".
- -- commonAccessInfo elements list objects the target supports. All objects listed in
- -- AccessInfo for any individual database should also be listed here.
- commonAccessInfo [19] IMPLICIT AccessInfo OPTIONAL}
-
-
-DatabaseInfo ::= SEQUENCE {
- -- A target may provide "virtual databases" that are combinations of individual database. These
- -- databases are indicated by the presence of subDbs in the combination database's DatabaseDescription.
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- name [1] IMPLICIT DatabaseName,
- -- Non-key brief elements follow:
- explainDatabase [2] IMPLICIT NULL OPTIONAL,
- -- If present, this database is the Explain database, or an Explain database
- -- for a different server, possibly on a different host. The means by which
- -- that server may be accessed is not addressed by this standard. One
- -- suggested possibility is an implementor agreement whereby the
- -- database name is a url which may be used to connect to the server.
- nicknames [3] IMPLICIT SEQUENCE OF DatabaseName OPTIONAL,
- icon [4] IMPLICIT IconObject OPTIONAL,
- user-fee [5] IMPLICIT BOOLEAN,
- available [6] IMPLICIT BOOLEAN,
- titleString [7] IMPLICIT HumanString OPTIONAL,
- -- Non-brief elements follow:
- keywords [8] IMPLICIT SEQUENCE OF HumanString OPTIONAL,
- description [9] IMPLICIT HumanString OPTIONAL,
- associatedDbs [10] IMPLICIT DatabaseList OPTIONAL,
- -- databases that may be searched in combination with this one
-
- subDbs [11] IMPLICIT DatabaseList OPTIONAL,
- -- When present, this database is a composite representing the combined
- -- databases 'subDbs'. The individual subDbs are also available.
- disclaimers [12] IMPLICIT HumanString OPTIONAL,
- news [13] IMPLICIT HumanString OPTIONAL,
- recordCount [14] CHOICE {
- actualNumber [0] IMPLICIT INTEGER,
- approxNumber [1] IMPLICIT INTEGER} OPTIONAL,
- defaultOrder [15] IMPLICIT HumanString OPTIONAL,
- avRecordSize [16] IMPLICIT INTEGER OPTIONAL,
- maxRecordSize [17] IMPLICIT INTEGER OPTIONAL,
- hours [18] IMPLICIT HumanString OPTIONAL,
- bestTime [19] IMPLICIT HumanString OPTIONAL,
- lastUpdate [20] IMPLICIT GeneralizedTime OPTIONAL,
- updateInterval [21] IMPLICIT IntUnit OPTIONAL,
- coverage [22] IMPLICIT HumanString OPTIONAL,
- proprietary [23] IMPLICIT BOOLEAN OPTIONAL, -- mandatory in full record
- copyrightText [24] IMPLICIT HumanString OPTIONAL,
- copyrightNotice [25] IMPLICIT HumanString OPTIONAL,
- producerContactInfo [26] IMPLICIT ContactInfo OPTIONAL,
- supplierContactInfo [27] IMPLICIT ContactInfo OPTIONAL,
- submissionContactInfo [28] IMPLICIT ContactInfo OPTIONAL,
- -- accessInfo lists items connected with the database. All listed items should be in the target's AccessInfo.
- accessInfo [29] IMPLICIT AccessInfo OPTIONAL}
-
-
-SchemaInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- schema [1] IMPLICIT OBJECT IDENTIFIER,
- -- Non-key brief elements follow:
- name [2] IMPLICIT InternationalString,
- -- Non-brief elements follow:
- description [3] IMPLICIT HumanString OPTIONAL,
- tagTypeMapping [4] IMPLICIT SEQUENCE OF SEQUENCE {
- tagType [0] IMPLICIT INTEGER,
- tagSet [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- -- If tagSet is omitted, then this tagType is for a tagSet locally defined
- -- within the schema that cannot be referenced by another schema.
- defaultTagType [2] IMPLICIT NULL OPTIONAL
- } OPTIONAL,
- recordStructure [5] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL}
-
-
- -- ElementInfo referenced in SchemaInfo and RecordSyntaxInfo
- ElementInfo ::= SEQUENCE {
- elementName [1] IMPLICIT InternationalString,
- elementTagPath [2] IMPLICIT Path,
- dataType [3] ElementDataType OPTIONAL, -- If omitted, not specified.
- required [4] IMPLICIT BOOLEAN,
- repeatable [5] IMPLICIT BOOLEAN,
- description [6] IMPLICIT HumanString OPTIONAL}
-
-
- -- Path is referenced by ElementInfo as well as PerElementDetails
- Path ::= SEQUENCE OF SEQUENCE{
- tagType [1] IMPLICIT INTEGER,
- tagValue [2] StringOrNumeric}
- ElementDataType ::= CHOICE{
- primitive [0] IMPLICIT PrimitiveDataType,
- structured [1] IMPLICIT SEQUENCE OF ElementInfo}
- PrimitiveDataType ::= INTEGER{
- octetString (0),
- numeric (1),
- date (2),
- external (3),
- string (4),
- trueOrFalse (5),
- oid (6),
- intUnit (7),
- empty (8),
- noneOfTheAbove (100) -- see 'description'
- }
-
-
-TagSetInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- tagSet [1] IMPLICIT OBJECT IDENTIFIER,
- -- non-key brief elements follow:
- name [2] IMPLICIT InternationalString,
- -- non-brief elements follow:
- description [3] IMPLICIT HumanString OPTIONAL,
- elements [4] IMPLICIT SEQUENCE OF SEQUENCE {
- elementname [1] IMPLICIT InternationalString,
- nicknames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- elementTag [3] StringOrNumeric,
- description [4] IMPLICIT HumanString OPTIONAL,
- dataType [5] PrimitiveDataType OPTIONAL,
- -- If the data type is expected to be structured, that is described in the schema info,
- -- and datatype is omitted here.
- otherTagInfo OtherInformation OPTIONAL} OPTIONAL}
-
-RecordSyntaxInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- recordSyntax [1] IMPLICIT OBJECT IDENTIFIER,
- -- Non-key brief elements follow:
- name [2] IMPLICIT InternationalString,
- -- non-brief elements follow:
- transferSyntaxes [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- description [4] IMPLICIT HumanString OPTIONAL,
- asn1Module [5] IMPLICIT InternationalString OPTIONAL,
- abstractStructure [6] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL
- -- Omitting abstractStructure only means target isn't using
- -- Explain to describe the structure, not that there is no structure.
- }
-
-AttributeSetInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- attributeSet [1] IMPLICIT AttributeSetId,
- -- non-key brief elements follow:
- name [2] IMPLICIT InternationalString,
- -- non-brief elements follow:
- attributes [3] IMPLICIT SEQUENCE OF AttributeType OPTIONAL,
- -- mandatory in full record
- description [4] IMPLICIT HumanString OPTIONAL}
--- AttributeType referenced in AttributeSetInfo
- AttributeType ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- attributeType [2] IMPLICIT INTEGER,
- attributeValues [3] IMPLICIT SEQUENCE OF AttributeDescription}
- AttributeDescription ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- attributeValue [2] StringOrNumeric,
- equivalentAttributes [3] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL
- -- each is an occurrence of 'attributeValue' from AttributeDescription for a
- -- different attribute. Equivalences listed here should be derived from the
- -- attribute set definition, not from a particular server's behavior.
- }
-
-
-TermListInfo ::= SEQUENCE{
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- -- Non-key brief elements follow:
- termLists [2] IMPLICIT SEQUENCE OF SEQUENCE{
- name [1] IMPLICIT InternationalString,
- title [2] IMPLICIT HumanString OPTIONAL,
- -- Title is for users to see and can differ by language. Name, on the
- -- other hand is typically a short string not necessarily meant to be
- -- human-readable, and not variable by language.
- searchCost [3] IMPLICIT INTEGER {
- optimized (0), -- The attribute (or combination) associated
- -- with this list will do fast searches.
- normal (1), -- The attribute (combination) will work as
- -- expected. So there's probably an index for the
- -- attribute (combination) or some similar
- -- mechanism.
- expensive (2), -- Can use the attribute (combination), but it
- -- might not provide satisfactory results.
- -- Probably there is no index, or post-
- -- processing of records is required.
- filter (3) -- can't search with this attribute (combination) alone.
- } OPTIONAL,
- scanable [4] IMPLICIT BOOLEAN, -- 'true' means this list can be scanned.
- broader [5] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- narrower [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL
- -- broader and narrower list alternative term lists related to this one.
- -- The term lists so listed should also be in this termLists structure.
- }
- -- no non-brief elements
- }
-
-
-ExtendedServicesInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- type [1] IMPLICIT OBJECT IDENTIFIER,
- -- Non-key brief elements follow:
- name [2] IMPLICIT InternationalString OPTIONAL,
- -- should be supplied if privateType is 'true'
- privateType [3] IMPLICIT BOOLEAN,
- restrictionsApply [5] IMPLICIT BOOLEAN, -- if 'true' see 'description'
- feeApply [6] IMPLICIT BOOLEAN, -- if 'true' see 'description'
- available [7] IMPLICIT BOOLEAN,
- retentionSupported [8] IMPLICIT BOOLEAN,
- waitAction [9] IMPLICIT INTEGER{
- waitSupported (1),
- waitAlways (2),
- waitNotSupported (3),
- depends (4),
- notSaying (5)},
- -- non-brief elements follow:
- -- To get brief plus 'description' use esn 'description'
- description [10] IMPLICIT HumanString OPTIONAL,
- -- to get above elements and 'specificExplain' use esn 'specificExplain'
- specificExplain [11] IMPLICIT EXTERNAL OPTIONAL,
- -- Use oid of specific ES, and select choice [3] 'explain'. Format
- -- to be developed in conjunction with the specific ES definition.
- -- to get all elements except 'specificExplain', use esn 'asn'
- esASN [12] IMPLICIT InternationalString OPTIONAL -- the ASN.1 for this ES
- }
-
--- - - - - - - - - - - - - Detail records
- -- The detail records describe relationships among entities supported by the target. RetrievalRecordDetails describes
- -- the way that schema elements are mapped into record elements. This mapping may be different for each
- -- combination of database, schema, record syntax. The per-element details describe the default mapping.
- -- Origin-request re-tagging can change that mapping. When multiple databases are listed in a databaseNames
- -- element, the record applies equally to all of the listed databases. This is unrelated to searching the databases
- -- together. AttributeDetails describes how databases can be searched. Each supported attribute is listed, and the
- -- allowable combinations can be described.
-
-
-AttributeDetails ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- -- Non-brief elements follow:
- attributesBySet [2] IMPLICIT SEQUENCE OF AttributeSetDetails OPTIONAL,
- -- mandatory in full record
- attributeCombinations [3] IMPLICIT AttributeCombinations OPTIONAL}
-
-
-
-
--- AttributeSetDetails referenced by AttributeDetails
- AttributeSetDetails ::= SEQUENCE {
- attributeSet [0] IMPLICIT AttributeSetId,
- attributesByType [1] IMPLICIT SEQUENCE OF AttributeTypeDetails }
- AttributeTypeDetails ::= SEQUENCE {
- attributeType [0] IMPLICIT INTEGER,
- defaultIfOmitted [1] IMPLICIT OmittedAttributeInterpretation OPTIONAL,
- attributeValues [2] IMPLICIT SEQUENCE OF AttributeValue OPTIONAL }
- -- If no attributeValues are supplied, all values of this type are fully
- -- supported, and the descriptions in AttributeSetInfo are adequate.
-
- OmittedAttributeInterpretation ::= SEQUENCE {
- defaultValue [0] StringOrNumeric OPTIONAL,
- -- A default value is listed if that's how the server works
- defaultDescription [1] IMPLICIT HumanString OPTIONAL }
- -- The human-readable description should generally be provided.
- -- It is legal for both default elements to be missing, which
- -- means that the target will allow the attribute type to be
- -- omitted, but isn't saying what it will do.
-
- AttributeValue ::= SEQUENCE {
- value [0] StringOrNumeric,
- description [1] IMPLICIT HumanString OPTIONAL,
- subAttributes [2] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
- superAttributes [3] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
- partialSupport [4] IMPLICIT NULL OPTIONAL }
- -- partialSupport indicates that an attributeValue is accepted, but may not be processed in the
- -- "expected" way. One important reason for this is composite databases: in this case partialSupport
- -- may indicate that only some of the subDbs support the attribute, and others ignore it.
-
-
-
-TermListDetails ::= SEQUENCE{ -- one for each termList in TermListInfo
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- termListName [1] IMPLICIT InternationalString,
- -- Non-key elements (all non-brief) follow:
- description [2] IMPLICIT HumanString OPTIONAL,
- attributes [3] IMPLICIT AttributeCombinations OPTIONAL,
- -- Pattern for attributes that hit this list. Mandatory in full record
- scanInfo [4] IMPLICIT SEQUENCE {
- maxStepSize [0] IMPLICIT INTEGER OPTIONAL,
- collatingSequence [1] IMPLICIT HumanString OPTIONAL,
- increasing [2] IMPLICIT BOOLEAN OPTIONAL} OPTIONAL,
- -- Occurs only if list is scanable. If list is scanable and if scanInfo is omitted,
- -- target doesn't consider these important.
- estNumberTerms [5] IMPLICIT INTEGER OPTIONAL,
- sampleTerms [6] IMPLICIT SEQUENCE OF Term OPTIONAL}
-
-
-
-ElementSetDetails ::= SEQUENCE {
- -- ElementSetDetails describes the way that database records are mapped to record elements. This
- -- mapping may be different for each combination of database name and element set. The database record
- -- description is a schema, which may be private to the target. The schema's abstract record structure
- -- and tag sets provide the vocabulary for discussing record content; their presence in the Explain
- -- database does not imply support for complex retrieval specification.
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- elementSetName [2] IMPLICIT ElementSetName,
- recordSyntax [3] IMPLICIT OBJECT IDENTIFIER,
- -- Non-key Brief elements follow:
- schema [4] IMPLICIT OBJECT IDENTIFIER,
- -- Non-brief elements follow:
- description [5] IMPLICIT HumanString OPTIONAL,
- detailsPerElement [6] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL -- mandatory in full record
- }
-
-
-RetrievalRecordDetails ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- schema [2] IMPLICIT OBJECT IDENTIFIER,
- recordSyntax [3] IMPLICIT OBJECT IDENTIFIER,
- -- Non-brief elements follow:
- description [4] IMPLICIT HumanString OPTIONAL,
- detailsPerElement [5] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL
- -- mandatory in full record
- }
-
--- PerElementDetails is referenced in RetrievalRecordDetails and ElementSetDetails.
- PerElementDetails ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- -- If the name is omitted, the record syntax's name for this element
- -- is appropriate.
- recordTag [1] IMPLICIT RecordTag OPTIONAL,
- -- The record tag may be omitted if tags are inappropriate for the record
- -- syntax, or if the origin can be expected to know it for some other reason.
- schemaTags [2] IMPLICIT SEQUENCE OF Path OPTIONAL,
- -- The information from the listed schema elements is combined
- -- in some way to produce the data sent in the listed record tag. The
- -- 'contents' element below may describe the logic used.
- maxSize [3] IMPLICIT INTEGER OPTIONAL,
- minSize [4] IMPLICIT INTEGER OPTIONAL,
- avgSize [5] IMPLICIT INTEGER OPTIONAL,
- fixedSize [6] IMPLICIT INTEGER OPTIONAL,
- repeatable [8] IMPLICIT BOOLEAN,
- required [9] IMPLICIT BOOLEAN,
- -- 'required' really means that target will always supply the element.
- description [12] IMPLICIT HumanString OPTIONAL,
- contents [13] IMPLICIT HumanString OPTIONAL,
- billingInfo [14] IMPLICIT HumanString OPTIONAL,
- restrictions [15] IMPLICIT HumanString OPTIONAL,
- alternateNames [16] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- genericNames [17] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- searchAccess [18] IMPLICIT AttributeCombinations OPTIONAL }
- -- RecordTag referenced in PerElementDetails above
- RecordTag ::= SEQUENCE {
- qualifier [0] StringOrNumeric OPTIONAL,
- -- E.g. tag set for GRS-1
- tagValue [1] StringOrNumeric}
-
-SortDetails ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- -- No non-key brief elements
- -- Non-brief elements follow:
- sortKeys [2] IMPLICIT SEQUENCE OF SortKeyDetails OPTIONAL
- -- mandatory in full record
- }
- SortKeyDetails ::= SEQUENCE {
- description [0] IMPLICIT HumanString OPTIONAL,
- elementSpecifications [1] IMPLICIT SEQUENCE OF Specification OPTIONAL,
- -- each specification is a way of specifying this same sort key
- attributeSpecifications [2] IMPLICIT AttributeCombinations OPTIONAL,
- -- each combination is a way of specifying this same sort key
- sortType [3] CHOICE {
- character [0] IMPLICIT NULL,
- numeric [1] IMPLICIT NULL,
- structured [2] IMPLICIT HumanString} OPTIONAL,
- caseSensitivity [4] IMPLICIT INTEGER {
- always (0), -- always case-sensitive
- never (1), -- never case-sensitive
- default-yes (2), -- case-sensitivity is as specified on request, and if not
- -- specified, case-sensitive.
- default-no (3)} -- case-sensitivity is as specified on request, and if not
- -- specified, not case-sensitive.
- OPTIONAL}
-
-ProcessingInformation ::= SEQUENCE{
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- databaseName [1] IMPLICIT DatabaseName,
- processingContext [2] IMPLICIT INTEGER {
- access (0), -- e.g. choosing databases
- search (1), -- e.g. "search strategies" or search forms
- retrieval (2), -- e.g. recommended element combinations
- record-presentation (3), -- display of retrieved records
- record-handling (4) -- handling (e.g. saving) of retrieved records
- },
- name [3] IMPLICIT InternationalString,
- oid [4] IMPLICIT OBJECT IDENTIFIER,
- -- No non-key brief elements
- -- Non-brief elements follow:
- description [5] IMPLICIT HumanString OPTIONAL,
- -- use element set name 'description' to retrieve all except instructions.
- instructions [6] IMPLICIT EXTERNAL OPTIONAL -- mandatory in full record
- }
-
-
-VariantSetInfo ::= SEQUENCE {
- -- A record in this category describes a variant set definition, i.e., classes, types, and values, for a specific
- -- variant set definition supported by the target. Support by the target of a particular variant set definition
- -- does not imply that the definition is supported for any specific database or element.
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- variantSet [1] IMPLICIT OBJECT IDENTIFIER,
- -- Non-key brief elements follow:
- name [2] IMPLICIT InternationalString,
- -- Non-brief elements follow:
- variants [3] IMPLICIT SEQUENCE OF VariantClass OPTIONAL
- -- mandatory in full record
- }
-
- -- Subsidiary structures for VariantSetInfo
- VariantClass ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- variantClass [2] IMPLICIT INTEGER,
- variantTypes [3] IMPLICIT SEQUENCE OF VariantType}
- VariantType ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- variantType [2] IMPLICIT INTEGER,
- variantValue [3] IMPLICIT VariantValue OPTIONAL}
- VariantValue ::= SEQUENCE {
- dataType [0] PrimitiveDataType,
- values [1] ValueSet OPTIONAL }
- ValueSet ::= CHOICE {
- range [0] IMPLICIT ValueRange,
- enumerated [1] IMPLICIT SEQUENCE OF ValueDescription }
- ValueRange ::= SEQUENCE {
- -- At last one the following must be supplied, both may be supplied.
- lower [0] ValueDescription OPTIONAL,
- upper [1] ValueDescription OPTIONAL }
- ValueDescription ::= CHOICE{
- integer INTEGER,
- string InternationalString,
- octets OCTET STRING,
- oid OBJECT IDENTIFIER,
- unit [1] IMPLICIT Unit,
- valueAndUnit [2] IMPLICIT IntUnit
- -- oid and unit can't be used in a ValueRange
- }
-
-
-
-UnitInfo ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Key elements follow:
- unitSystem [1] IMPLICIT InternationalString,
- -- No non-key brief elements
- -- Non-brief elements follow:
- description [2] IMPLICIT HumanString OPTIONAL,
- units [3] IMPLICIT SEQUENCE OF UnitType OPTIONAL
- -- mandatory in full record
- }
-
- -- Subsidiary structures for UnitInfo
- UnitType ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- unitType [2] StringOrNumeric,
- units [3] IMPLICIT SEQUENCE OF Units}
-
- Units ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- unit [2] StringOrNumeric}
-
-CategoryList ::= SEQUENCE {
- commonInfo [0] IMPLICIT CommonInfo OPTIONAL,
- -- Only one record expected per Explain database. All elements appear in brief presentation.
- categories [1] IMPLICIT SEQUENCE OF CategoryInfo }
- CategoryInfo ::= SEQUENCE {
- category [1] IMPLICIT InternationalString,
- originalCategory [2] IMPLICIT InternationalString OPTIONAL,
- description [3] IMPLICIT HumanString OPTIONAL,
- asn1Module [4] IMPLICIT InternationalString OPTIONAL}
-
-
--- - - - - - - - - - - - - - Subsidiary definitions
-
-CommonInfo ::= SEQUENCE {
- dateAdded [0] IMPLICIT GeneralizedTime OPTIONAL,
- dateChanged [1] IMPLICIT GeneralizedTime OPTIONAL,
- expiry [2] IMPLICIT GeneralizedTime OPTIONAL,
- humanString-Language [3] IMPLICIT LanguageCode OPTIONAL,
- -- following not to occur for brief:
- otherInfo OtherInformation OPTIONAL}
-
-
-HumanString ::= SEQUENCE OF SEQUENCE {
- language [0] IMPLICIT LanguageCode OPTIONAL,
- text [1] IMPLICIT InternationalString}
-
-IconObject ::= SEQUENCE OF SEQUENCE{
- -- Note that the "SEQUENCE OF" is to allow alternative representations of the same Icon; it is not
- -- intended to allow multiple icons.
- bodyType [1] CHOICE{
- ianaType [1] IMPLICIT InternationalString,
- z3950type [2] IMPLICIT InternationalString,
- otherType [3] IMPLICIT InternationalString},
- content [2] IMPLICIT OCTET STRING}
-
-
-LanguageCode ::= InternationalString -- from ANSI/NISO Z39.53-1994
-
-ContactInfo ::= SEQUENCE {
- name [0] IMPLICIT InternationalString OPTIONAL,
- description [1] IMPLICIT HumanString OPTIONAL,
- address [2] IMPLICIT HumanString OPTIONAL,
- email [3] IMPLICIT InternationalString OPTIONAL,
- phone [4] IMPLICIT InternationalString OPTIONAL}
-
-NetworkAddress ::= CHOICE {
- internetAddress [0] IMPLICIT SEQUENCE {
- hostAddress [0] IMPLICIT InternationalString,
- port [1] IMPLICIT INTEGER},
- osiPresentationAddress [1] IMPLICIT SEQUENCE {
- pSel [0] IMPLICIT InternationalString,
- sSel [1] IMPLICIT InternationalString OPTIONAL,
- tSel [2] IMPLICIT InternationalString OPTIONAL,
- nSap [3] IMPLICIT InternationalString},
- other [2] IMPLICIT SEQUENCE {
- type [0] IMPLICIT InternationalString,
- address [1] IMPLICIT InternationalString}}
-
-AccessInfo ::= SEQUENCE {
- -- AccessInfo contains the fundamental information about what facilities are required to use this target
- -- or server. For example, if an origin can handle none of the record syntaxes a database can provide,
- -- it might choose not to access the database.
- queryTypesSupported [0] IMPLICIT SEQUENCE OF QueryTypeDetails OPTIONAL,
- diagnosticsSets [1] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- attributeSetIds [2] IMPLICIT SEQUENCE OF AttributeSetId OPTIONAL,
- schemas [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- recordSyntaxes [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- resourceChallenges [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- restrictedAccess [6] IMPLICIT AccessRestrictions OPTIONAL,
- costInfo [8] IMPLICIT Costs OPTIONAL,
- variantSets [9] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- elementSetNames [10] IMPLICIT SEQUENCE OF ElementSetName OPTIONAL,
- unitSystems [11] IMPLICIT SEQUENCE OF InternationalString}
-
--- begin auxiliary definitions for AccessInfo
--- Begin Query Details
-QueryTypeDetails ::= CHOICE {
- private [0] IMPLICIT PrivateCapabilities,
- rpn [1] IMPLICIT RpnCapabilities,
- iso8777 [2] IMPLICIT Iso8777Capabilities,
- z39-58 [100] IMPLICIT HumanString,
- erpn [101] IMPLICIT RpnCapabilities,
- rankedList [102] IMPLICIT HumanString}
-
-PrivateCapabilities ::= SEQUENCE {
- operators [0] IMPLICIT SEQUENCE OF SEQUENCE {
- operator [0] IMPLICIT InternationalString,
- description [1] IMPLICIT HumanString OPTIONAL } OPTIONAL,
- searchKeys [1] IMPLICIT SEQUENCE OF SearchKey OPTIONAL, -- field names that can be searched
- description [2] IMPLICIT SEQUENCE OF HumanString OPTIONAL }
-
-RpnCapabilities ::= SEQUENCE {
- operators [0] IMPLICIT SEQUENCE OF INTEGER OPTIONAL,
- -- Omitted means all operators are supported.
- resultSetAsOperandSupported [1] IMPLICIT BOOLEAN,
- restrictionOperandSupported [2] IMPLICIT BOOLEAN,
- proximity [3] IMPLICIT ProximitySupport OPTIONAL}
-
-Iso8777Capabilities ::= SEQUENCE {
- searchKeys [0] IMPLICIT SEQUENCE OF SearchKey, -- field names that may be searched
- restrictions [1] IMPLICIT HumanString OPTIONAL
- -- Omitted means supported, not specifying units.
- }
-
-ProximitySupport ::= SEQUENCE {
- anySupport [0] IMPLICIT BOOLEAN,
- -- 'false' means no proximity support, in which case unitsSupported not supplied.
- unitsSupported [1] IMPLICIT SEQUENCE OF CHOICE{
- known [1] IMPLICIT INTEGER, -- values from KnownProximityUnit
- private [2] IMPLICIT SEQUENCE{
- unit [0] IMPLICIT INTEGER,
- description [1] HumanString OPTIONAL}} OPTIONAL}
-
-SearchKey ::= SEQUENCE {
- searchKey [0] IMPLICIT InternationalString,
- description [1] IMPLICIT HumanString OPTIONAL }
--- End Query details
-AccessRestrictions ::= SEQUENCE OF SEQUENCE {
- accessType [0] INTEGER {
- any (0),
- search (1),
- present (2),
- specific-elements (3),
- extended-services (4),
- by-database (5)},
- accessText [1] IMPLICIT HumanString OPTIONAL,
- accessChallenges [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
-
-Costs ::= SEQUENCE {
- connectCharge [0] IMPLICIT Charge OPTIONAL, -- Per-connection charge
- connectTime [1] IMPLICIT Charge OPTIONAL, -- Time-based charge
- displayCharge [2] IMPLICIT Charge OPTIONAL, -- Per-record charge
- searchCharge [3] IMPLICIT Charge OPTIONAL, -- Per-search charge
- subscriptCharge [4] IMPLICIT Charge OPTIONAL, -- Subscription charges
- otherCharges [5] IMPLICIT SEQUENCE OF SEQUENCE{ -- Other charges
- forWhat [1] IMPLICIT HumanString,
- charge [2] IMPLICIT Charge} OPTIONAL}
- Charge ::= SEQUENCE{
- cost [1] IMPLICIT IntUnit,
- perWhat [2] IMPLICIT Unit OPTIONAL,
- -- e.g. "second," "minute," "line," "record"...
- text [3] IMPLICIT HumanString OPTIONAL}
--- End Auxiliary definitions for AccessInfo
-
-DatabaseList ::= SEQUENCE OF DatabaseName
-
-AttributeCombinations ::= SEQUENCE {
- defaultAttributeSet [0] IMPLICIT AttributeSetId,
- -- Default for the combinations. Also probably a good choice for the default
- -- in searches, but that isn't required.
- legalCombinations [1] IMPLICIT SEQUENCE OF AttributeCombination }
-
-
-AttributeCombination ::= SEQUENCE OF AttributeOccurrence
- -- An AttributeCombination is a pattern for legal combination of attributes
-
-
-AttributeOccurrence ::= SEQUENCE {
- -- An AttributeOccurrence lists the legal values for a specific attribute type in a combination.
- attributeSet [0] IMPLICIT AttributeSetId OPTIONAL,
- attributeType [1] IMPLICIT INTEGER,
- mustBeSupplied [2] IMPLICIT NULL OPTIONAL,
- attributeValues CHOICE {
- any-or-none [3] IMPLICIT NULL, -- All supported values are OK
- specific [4] IMPLICIT SEQUENCE OF StringOrNumeric}}
- -- Only these values allowed
-END
-
-
-
-
-
-
-
-
-
-RecordSyntax-SUTRS
-{Z39-50-recordSyntax SUTRS (101)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
- SutrsRecord ::= InternationalString
--- Line terminator is ASCII LF (X'0A').
--- Recommended maximum line length is 72 characters.
-END
-
-
-
-
-
-RecordSyntax-opac
-{Z39-50-recordSyntax opac (102)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
-OPACRecord ::= SEQUENCE {
- bibliographicRecord [1] IMPLICIT EXTERNAL OPTIONAL,
- holdingsData [2] IMPLICIT SEQUENCE OF HoldingsRecord OPTIONAL}
-HoldingsRecord ::= CHOICE {
- marcHoldingsRecord [1] IMPLICIT EXTERNAL,
- holdingsAndCirc [2] IMPLICIT HoldingsAndCircData}
-HoldingsAndCircData ::= SEQUENCE {
--- the following elements are required to display holdings in conformance with NISO standards.
- typeOfRecord [1] IMPLICIT InternationalString OPTIONAL, -- LDR 06
- encodingLevel [2] IMPLICIT InternationalString OPTIONAL, -- LDR 017
- format [3] IMPLICIT InternationalString OPTIONAL, -- 007 00-01
- receiptAcqStatus [4] IMPLICIT InternationalString OPTIONAL, -- 008 06
- generalRetention [5] IMPLICIT InternationalString OPTIONAL, -- 008 12
- completeness [6] IMPLICIT InternationalString OPTIONAL, -- 008 16
- dateOfReport [7] IMPLICIT InternationalString OPTIONAL, -- 008 26-31
- nucCode [8] IMPLICIT InternationalString OPTIONAL, -- 852 $a
- localLocation [9] IMPLICIT InternationalString OPTIONAL, -- 852 $b
- shelvingLocation [10] IMPLICIT InternationalString OPTIONAL, -- 852 $c
- callNumber [11] IMPLICIT InternationalString OPTIONAL, -- 852 $h and $i
- shelvingData [12] IMPLICIT InternationalString OPTIONAL, -- 852 $j thru $m
- copyNumber [13] IMPLICIT InternationalString OPTIONAL, -- 852 $t
- publicNote [14] IMPLICIT InternationalString OPTIONAL, -- 852 $z
- reproductionNote [15] IMPLICIT InternationalString OPTIONAL, -- 843
- termsUseRepro [16] IMPLICIT InternationalString OPTIONAL, -- 845
- enumAndChron [17] IMPLICIT InternationalString OPTIONAL, -- all 85x, 86x
- volumes [18] IMPLICIT SEQUENCE OF Volume OPTIONAL,
- -- repeats for each volume held
- circulationData [19] IMPLICIT SEQUENCE OF CircRecord OPTIONAL
- -- repeats for each circulating item.
- }
-Volume ::= SEQUENCE {
- enumeration [1] IMPLICIT InternationalString OPTIONAL,
- chronology [2] IMPLICIT InternationalString OPTIONAL,
- enumAndChron [3] IMPLICIT InternationalString OPTIONAL }
-CircRecord ::= SEQUENCE {
- availableNow [1] IMPLICIT BOOLEAN,
- availablityDate [2] IMPLICIT InternationalString OPTIONAL,
- availableThru [3] IMPLICIT InternationalString OPTIONAL,
- restrictions [4] IMPLICIT InternationalString OPTIONAL,
- itemId [5] IMPLICIT InternationalString OPTIONAL,
- renewable [6] IMPLICIT BOOLEAN,
- onHold [7] IMPLICIT BOOLEAN,
- enumAndChron [8] IMPLICIT InternationalString OPTIONAL,
- midspine [9] IMPLICIT InternationalString OPTIONAL,
- temporaryLocation [10] IMPLICIT InternationalString OPTIONAL}
-END
-
-
-
-RecordSyntax-summary
-
-{Z39-50-recordSyntax summary (103)} DEFINITIONS ::=
-BEGIN
-IMPORTS OtherInformation, InternationalString FROM Z39-50-APDU-1995;
-BriefBib ::= SEQUENCE {
- title [1] IMPLICIT InternationalString,
- author [2] IMPLICIT InternationalString OPTIONAL,
- callNumber [3] IMPLICIT InternationalString OPTIONAL,
- recordType [4] IMPLICIT InternationalString OPTIONAL,
- bibliographicLevel [5] IMPLICIT InternationalString OPTIONAL,
- format [6] IMPLICIT SEQUENCE OF FormatSpec OPTIONAL,
- publicationPlace [7] IMPLICIT InternationalString OPTIONAL,
- publicationDate [8] IMPLICIT InternationalString OPTIONAL,
- targetSystemKey [9] IMPLICIT InternationalString OPTIONAL,
- satisfyingElement [10] IMPLICIT InternationalString OPTIONAL,
- rank [11] IMPLICIT INTEGER OPTIONAL,
- documentId [12] IMPLICIT InternationalString OPTIONAL,
- abstract [13] IMPLICIT InternationalString OPTIONAL,
- otherInfo OtherInformation OPTIONAL}
-
-FormatSpec ::= SEQUENCE {
- type [1] IMPLICIT InternationalString,
- size [2] IMPLICIT INTEGER OPTIONAL,
- bestPosn [3] IMPLICIT INTEGER OPTIONAL}
-END
-
-
-
-
-
-
-
-
-
-
-RecordSyntax-generic -- For detailed semantics, see Appendix RET.
-{Z39-50-recordSyntax GRS-1 (105)} DEFINITIONS ::=
-BEGIN
-EXPORTS Variant;
-IMPORTS IntUnit, Unit, InternationalString, StringOrNumeric, Term FROM Z39-50-APDU-1995;
-
-GenericRecord ::= SEQUENCE OF TaggedElement
-TaggedElement ::= SEQUENCE {
- tagType [1] IMPLICIT INTEGER OPTIONAL,
- -- If omitted, default should be supplied dynamically by tagSet-M;
- -- otherwise it should be statically specified by the schema.
- tagValue [2] StringOrNumeric,
- tagOccurrence [3] IMPLICIT INTEGER OPTIONAL,
- -- Occurrence within the database record, and relative to the parent. No
- -- default; if omitted, target not telling or it is irrelevant.
- content [4] ElementData,
- metaData [5] IMPLICIT ElementMetaData OPTIONAL,
- appliedVariant [6] IMPLICIT Variant OPTIONAL}
-
-ElementData ::= CHOICE{
- octets OCTET STRING,
- numeric INTEGER,
- date GeneralizedTime,
- ext EXTERNAL,
- string InternationalString,
- trueOrFalse BOOLEAN,
- oid OBJECT IDENTIFIER,
- intUnit [1] IMPLICIT IntUnit,
- elementNotThere [2] IMPLICIT NULL, -- element requested but not there
- elementEmpty [3] IMPLICIT NULL, -- element there, but empty
- noDataRequested [4] IMPLICIT NULL, -- variant request said 'no data'
- diagnostic [5] IMPLICIT EXTERNAL,
- subtree [6] SEQUENCE OF TaggedElement -- recursive, for nested tags
- }
-
-
-ElementMetaData ::= SEQUENCE{
- seriesOrder [1] IMPLICIT Order OPTIONAL, -- only for a non-leaf node
- usageRight [2] IMPLICIT Usage OPTIONAL,
- hits [3] IMPLICIT SEQUENCE OF HitVector OPTIONAL,
- displayName [4] IMPLICIT InternationalString OPTIONAL,
- -- name for element that origin can use for display
- supportedVariants [5] IMPLICIT SEQUENCE OF Variant OPTIONAL,
- message [6] IMPLICIT InternationalString OPTIONAL,
- elementDescriptor [7] IMPLICIT OCTET STRING OPTIONAL,
- surrogateFor [8] IMPLICIT TagPath OPTIONAL,
- -- the retrieved element is a surrogate for the element given by this path
- surrogateElement [9] IMPLICIT TagPath OPTIONAL,
- -- the element given by this path is a surrogate for the retrieved element
- other [99] IMPLICIT EXTERNAL OPTIONAL}
-
- TagPath ::= SEQUENCE OF SEQUENCE{
- tagType [1] IMPLICIT INTEGER OPTIONAL,
- tagValue [2] StringOrNumeric,
- tagOccurrence [3] IMPLICIT INTEGER OPTIONAL}
-
-
-
-Order ::= SEQUENCE{
- ascending [1] IMPLICIT BOOLEAN,
- -- "true" means monotonically increasing (i.e. non-decreasing);
- -- "false" means monotonically decreasing (i.e. non-increasing).
- order [2] IMPLICIT INTEGER
- -- Same as defined by 'elementOrdering' in tagSet-M, though this may be
- -- overridden by schema.
- }
-
-
-
-Usage ::= SEQUENCE {
- type [1] IMPLICIT INTEGER{
- redistributable (1), -- Element is freely redistributable.
- restricted (2), -- Restriction contains statement.
- licensePointer (3) -- Restriction contains license pointer.
- },
- restriction [2] IMPLICIT InternationalString OPTIONAL}
-
-
-
-HitVector ::= SEQUENCE{
- -- Each hit vector points to a fragment within the element, via location and/or token.
- satisfier Term OPTIONAL, -- sourceword, etc.
- offsetIntoElement [1] IMPLICIT IntUnit OPTIONAL,
- length [2] IMPLICIT IntUnit OPTIONAL,
- hitRank [3] IMPLICIT INTEGER OPTIONAL,
- targetToken [4] IMPLICIT OCTET STRING OPTIONAL
- -- Origin may use token subsequently within a variantRequest (in
- -- an elementRequest) to retrieve (or to refer to) the fragment.
- }
-
-
-
-
-Variant ::= SEQUENCE{
- globalVariantSetId [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- -- Applies to the triples below, when variantSetId omitted. If
- -- globalVariantSetId omitted, default applies. Default may be provided by
- -- the tagSet-M element defaultVariantSetId.
-
-
-
-
- triples [2] IMPLICIT SEQUENCE OF SEQUENCE{
- variantSetId [0] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- -- If omitted, globalVariantSetId (above)
- -- applies, unless that too is omitted, in
- -- which case, default used.
- class [1] IMPLICIT INTEGER,
- type [2] IMPLICIT INTEGER,
- value [3] CHOICE{
- integer INTEGER,
- internationalString InternationalString,
- octetString OCTET STRING,
- objectIdentifier OBJECT IDENTIFIER,
- boolean BOOLEAN,
- null NULL,
- -- Following need context tags:
- unit [1] IMPLICIT Unit,
- valueAndUnit [2] IMPLICIT IntUnit}}}
-END
-
-
-
-RecordSyntax-ESTaskPackage
-{Z39-50-recordSyntax ESTaskPackage (106)} DEFINITIONS ::=
-BEGIN
-IMPORTS Permissions, InternationalString, IntUnit, DiagRec FROM Z39-50-APDU-1995;
-
-TaskPackage ::= SEQUENCE{
- packageType [1] IMPLICIT OBJECT IDENTIFIER,
- -- oid of specific ES definition
- packageName [2] IMPLICIT InternationalString OPTIONAL,
- userId [3] IMPLICIT InternationalString OPTIONAL,
- retentionTime [4] IMPLICIT IntUnit OPTIONAL,
- permissions [5] IMPLICIT Permissions OPTIONAL,
- description [6] IMPLICIT InternationalString OPTIONAL,
- targetReference [7] IMPLICIT OCTET STRING OPTIONAL,
- creationDateTime [8] IMPLICIT GeneralizedTime OPTIONAL,
- taskStatus [9] IMPLICIT INTEGER{
- pending (0),
- active (1),
- complete (2),
- aborted (3)},
- packageDiagnostics [10] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
- taskSpecificParameters [11] IMPLICIT EXTERNAL
- -- Use oid for specific ES definition
- -- (same oid as packageType above)
- -- and select [2] "taskPackage."
- }
-END
-
-
-
-
-ResourceReport-Format-Resource-1
-{Z39-50-resourceReport resource-1 (1)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
---
-ResourceReport ::= SEQUENCE{
-estimates [1] IMPLICIT SEQUENCE OF Estimate,
-message [2] IMPLICIT InternationalString}
---
-Estimate ::= SEQUENCE{
-type [1] IMPLICIT EstimateType,
-value [2] IMPLICIT INTEGER, -- the actual estimate
-currency-code [3] IMPLICIT INTEGER OPTIONAL
- -- code for representation of currencies defined in ISO 4217-1990.
- -- Applicable only to monetary estimates.
- }
-EstimateType ::= INTEGER{
-currentSearchRecords (1), -- estimated no. records in current (incomplete) result set for search
-finalSearchRecords (2), -- estimated no. records that will be in result set if search completes
-currentPresentRecords (3), -- estimated number of records in current (incomplete) set of
- -- records to be returned on Present
-finalPresentRecords (4), -- estimated number of records that will be in the set of records
- -- to be returned by Present if Present completes
-currentOpTimeProcessing (5), -- processing time (in .001 CPU seconds) used by operation so far
-finalOpTimeProcessing (6), -- estimated total processing time (in .001 CPU seconds) that will
- -- be used by this operation if it completes
-currentAssocTime (7), -- estimated processing time used by association (in .001 CPU sec.)
-currentOperationCost (8), -- estimated cost for this operation so far
-finalOperationCost (9), -- estimated cost for this operation if it completes
-currentAssocCost (10), -- estimated cost for this association so far
-finalOpTimeElapsed (11), -- estimated elapsed time for operation if it completes (in .001 sec.)
-percentComplete (12), -- estimated percent complete
-currentSearchAssocCost (13), -- estimated search cost for association so far
-currentPresentAssocCost (14), -- estimated present cost for this association so far
-currentConnectAssocCost (15), -- estimated connect time cost for association so far
-currentOtherAssocCost (16) -- estimated other cost (not included in 13-15) for association so far
- }
-END
-
-
-
-
-
-
-
-
-
-
-
-
-
-ResourceReport-Format-Resource-2
-{Z39-50-resourceReport resource-2 (2)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString, StringOrNumeric, IntUnit FROM Z39-50-APDU-1995;
---
-ResourceReport ::= SEQUENCE{
-estimates [1] IMPLICIT SEQUENCE OF Estimate OPTIONAL,
-message [2] IMPLICIT InternationalString OPTIONAL}
---
-Estimate ::= SEQUENCE{
-type [1] StringOrNumeric,
- -- Numeric values of 1-16 are the same as used in Resource-1.
-value [2] IMPLICIT IntUnit
- -- When expressing currency:
- -- unitSystem (of Unit) is 'z3950' (case insensitive)
- -- unitType is 'iso4217-1990' (case insensitive)
- -- unit is currency code from ISO 4217-1990.
-}
-END
-
-
-
-
-
-AccessControlFormat-prompt-1
-{Z39-50-accessControl prompt-1 (1)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString, DiagRec FROM Z39-50-APDU-1995;
---
-PromptObject ::= CHOICE{
- challenge [1] IMPLICIT Challenge,
- response [2] IMPLICIT Response}
-
- Challenge ::= SEQUENCE OF SEQUENCE {
- promptId [1] PromptId,
- -- Target supplies a number (for an enumerated prompt) or string (for a non
- -- -enumerated prompt), for each prompt, and the origin returns it in response, for
- -- this prompt, so target may correlate the prompt response with the prompt.
- defaultResponse [2] IMPLICIT InternationalString OPTIONAL,
- promptInfo [3] CHOICE{
- character [1] IMPLICIT InternationalString,
- encrypted [2] IMPLICIT Encryption} OPTIONAL,
- -- Information corresponding to an enumerated prompt. For example if 'type', within
- -- PromptId, is 'copyright', then promptInfo may contain a copyright statement.
- regExpr [4] IMPLICIT InternationalString OPTIONAL,
- -- A regular expression that promptResponse should match. See IEEE 1003.2
- -- Volume 1, Section 2.8 "Regular Expression Notation." For example if promptId
- -- is "Year of publication," regExpr might be "19[89][0-9]|20[0-9][0-9]".
- responseRequired [5] IMPLICIT NULL OPTIONAL,
- allowedValues [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- -- e.g. promptId="Desired color"; allowed = 'red', 'blue','Green'.
- shouldSave [7] IMPLICIT NULL OPTIONAL,
- -- Target recommends that origin save the data that it prompts from the
- -- user corresponding to this prompt, because it is likely to be requested again (so
- -- origin might not have to prompt the user next time).
- dataType [8] IMPLICIT INTEGER{
- integer (1),
- date (2),
- float (3),
- alphaNumeric (4),
- url-urn (5),
- boolean (6)} OPTIONAL,
- -- Target telling origin type of data it wants. E.g., if "date" is specified,
- -- presumably the origin will try to prompt something "date-like" from the user.
- diagnostic [9] IMPLICIT EXTERNAL OPTIONAL
- -- Intended for repeat requests when there is an error the origin
- -- should report to the user from previous attempt.
- }
-
-
- Response ::= SEQUENCE OF SEQUENCE {
- promptId [1] PromptId,
- -- Corresponds to a prompt in the challenge, or may be unprompted, for
- -- example "newPassword." If unprompted, should be "enumerated."
- -- If this responds to a non-enumerated prompt, then nonEnumeratedPrompt
- -- should contain the prompt string from the challenge.
- promptResponse [2] CHOICE{
- string [1] IMPLICIT InternationalString,
- accept [2] IMPLICIT BOOLEAN,
- acknowledge [3] IMPLICIT NULL,
- diagnostic [4] DiagRec,
- encrypted [5] IMPLICIT Encryption}}
-
-
- PromptId ::= CHOICE{
- enummeratedPrompt [1] IMPLICIT SEQUENCE{
- type [1] IMPLICIT INTEGER{
- groupId (0),
- userId (1),
- password (2),
- newPassword (3),
- copyright (4),
- -- When type on Challenge is 'copyright', promptInfo has text of
- -- copyright message to be displayed verbatim to the user. If
- -- promptResponse indicates 'acceptance', this indicates the user has been
- -- shown, and accepted, the terms of the copyright. This is not intended
- -- to be legally binding, but provides a good-faith attempt on
- -- the part of the target to inform the user of the copyright.
- sessionId (5)},
- suggestedString [2] IMPLICIT InternationalString OPTIONAL},
- nonEnumeratedPrompt [2] IMPLICIT InternationalString}
-
-
- Encryption ::= SEQUENCE{
- cryptType [1] IMPLICIT OCTET STRING OPTIONAL,
- credential [2] IMPLICIT OCTET STRING OPTIONAL,
- --random number, SALT, or other factor
- data [3] IMPLICIT OCTET STRING}
-
-END
-
-
-
-
-AccessControlFormat-des-1
-{Z39-50-accessControlFormat des-1 (2)} DEFINITIONS ::=
-BEGIN
- DES-RN-Object ::= CHOICE {
- challenge [1] IMPLICIT DRNType,
- response [2] IMPLICIT DRNType}
- DRNType ::= SEQUENCE{
- userId [1] IMPLICIT OCTET STRING OPTIONAL,
- salt [2] IMPLICIT OCTET STRING OPTIONAL,
- randomNumber [3] IMPLICIT OCTET STRING}
-END
-
-
-AccessControlFormat-krb-1
-{Z39-50-accessControlFormat krb-1 (3)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
-
- KRBObject ::= CHOICE {
- challenge [1] IMPLICIT KRBRequest,
- response [2] IMPLICIT KRBResponse}
- KRBRequest ::= SEQUENCE{
- service [1] IMPLICIT InternationalString,
- instance [2] IMPLICIT InternationalString OPTIONAL,
- realm [3] IMPLICIT InternationalString OPTIONAL}
- -- target requests a ticket for the given service, instance, and realm
- KRBResponse ::= SEQUENCE{
- userid [1] IMPLICIT InternationalString OPTIONAL,
- ticket [2] IMPLICIT OCTET STRING}
- -- origin responds with a ticket for the requested service
-END
-
-
-
-
-
-
-
-
-
-ESFormat-PersistentResultSet
-{Z39-50-extendedService PersistentResultSet (1)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
-PersistentResultSet ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] IMPLICIT NULL,
- notToKeep [2] OriginPartNotToKeep OPTIONAL},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] IMPLICIT NULL,
- targetPart [2] TargetPart OPTIONAL}}
-OriginPartNotToKeep ::= SEQUENCE{
- originSuppliedResultSet [1] IMPLICIT InternationalString OPTIONAL,
- -- name of transient result set, supplied on request, mandatory unless function is 'delete'
- replaceOrAppend [2] IMPLICIT INTEGER{ -- only if function is "modify"
- replace (1),
- append (2)} OPTIONAL}
-TargetPart ::= SEQUENCE{
- targetSuppliedResultSet [1] IMPLICIT InternationalString OPTIONAL,
- -- Name of transient result set, supplied by target, representing the persistent result set to which
- -- package pertains. Meaningful only when package is presented. (i.e. not on ES response).
- numberOfRecords [2] IMPLICIT INTEGER OPTIONAL}
-END
-
-
-ESFormat-PersistentQuery
-{Z39-50-extendedService PersistentQuery (2)} DEFINITIONS ::=
-BEGIN
-IMPORTS Query, InternationalString, OtherInformation FROM Z39-50-APDU-1995;
-PersistentQuery ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep OPTIONAL,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep OPTIONAL,
- targetPart [2] TargetPart}}
-OriginPartToKeep ::= SEQUENCE{
- dbNames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- additionalSearchInfo [3] OtherInformation OPTIONAL}
-OriginPartNotToKeep ::= CHOICE{
- package [1] IMPLICIT InternationalString,
- query [2] Query}
-TargetPart ::= Query
-END
-
-ESFormat-PeriodicQuerySchedule
-{Z39-50-extendedService PeriodicQuerySchedule (3)} DEFINITIONS ::=
-BEGIN
-IMPORTS Query, InternationalString, IntUnit FROM Z39-50-APDU-1995
-ExportSpecification, Destination FROM ESFormat-ExportSpecification;
-
-PeriodicQuerySchedule ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep,
- targetPart [2] TargetPart}}
-
-OriginPartToKeep ::=SEQUENCE{
- activeFlag [1] IMPLICIT BOOLEAN,
- databaseNames [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- resultSetDisposition [3] IMPLICIT INTEGER{
- replace (1),
- append (2),
- createNew (3) -- Only if origin and target have agreement about
- -- naming convention for the resulting package,
- -- and only if no result set is specified.
- } OPTIONAL, -- Mandatory on 'create' if result set is specified, in
- -- which case it must be 'replace' or 'append.
- alertDestination [4] Destination OPTIONAL,
- exportParameters [5] CHOICE{
- packageName [1] IMPLICIT InternationalString,
- exportPackage [2] ExportSpecification} OPTIONAL}
-
-OriginPartNotToKeep ::= SEQUENCE{
- querySpec [1] CHOICE{
- actualQuery [1] Query,
- packageName [2] IMPLICIT InternationalString} OPTIONAL,
- -- mandatory for 'create'
- originSuggestedPeriod [2] Period OPTIONAL, -- mandatory for 'create'
- expiration [3] IMPLICIT GeneralizedTime OPTIONAL,
- resultSetPackage [4] IMPLICIT InternationalString OPTIONAL}
-
-TargetPart ::= SEQUENCE{
- actualQuery [1] Query,
- targetStatedPeriod [2] Period,
- -- Target supplies the period, which may be same as origin proposed.
- expiration [3] IMPLICIT GeneralizedTime OPTIONAL,
- -- Target supplies value for task package. It may be the same as origin
- -- proposed or different from (and overrides) origin proposal, but if
- -- omitted, there is no expiration.
- resultSetPackage [4] IMPLICIT InternationalString OPTIONAL,
- -- May be omitted only if exportParameters was supplied. Target
- -- supplies same name as origin supplied, if origin did supply a name.
- lastQueryTime [5] IMPLICIT GeneralizedTime,
- lastResultNumber [6] IMPLICIT INTEGER,
- numberSinceModify [7] IMPLICIT INTEGER OPTIONAL}
-
-
-
-
- Period ::= CHOICE{
- unit [1] IMPLICIT IntUnit,
- businessDaily [2] IMPLICIT NULL,
- continuous [3] IMPLICIT NULL,
- other [4] IMPLICIT InternationalString}
-END
-
-
-ESFormat-ItemOrder
-{Z39-50-extendedService ItemOrder (4)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString FROM Z39-50-APDU-1995;
-ItemOrder ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep OPTIONAL,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep OPTIONAL,
- targetPart [2] TargetPart}}
-OriginPartToKeep ::= SEQUENCE{
- supplDescription [1] IMPLICIT EXTERNAL OPTIONAL,
- contact [2] IMPLICIT SEQUENCE{
- name [1] IMPLICIT InternationalString OPTIONAL,
- phone [2] IMPLICIT InternationalString OPTIONAL,
- email [3] IMPLICIT InternationalString OPTIONAL} OPTIONAL,
- addlBilling [3] IMPLICIT SEQUENCE{
- paymentMethod [1] CHOICE{
- billInvoice [0] IMPLICIT NULL,
- prepay [1] IMPLICIT NULL,
- depositAccount [2] IMPLICIT NULL,
- creditCard [3] IMPLICIT CreditCardInfo,
- cardInfoPreviouslySupplied [4] IMPLICIT NULL,
- privateKnown [5] IMPLICIT NULL,
- privateNotKnown [6] IMPLICIT EXTERNAL},
- customerReference [2] IMPLICIT InternationalString OPTIONAL,
- customerPONumber [3] IMPLICIT InternationalString OPTIONAL}
- OPTIONAL}
-CreditCardInfo ::= SEQUENCE{
- nameOnCard [1] IMPLICIT InternationalString,
- expirationDate [2] IMPLICIT InternationalString,
- cardNumber [3] IMPLICIT InternationalString}
-
-OriginPartNotToKeep ::= SEQUENCE{ -- Corresponds to 'requestedItem' in service definition.
- -- Must supply at least one, and may supply both.
- resultSetItem [1] IMPLICIT SEQUENCE{
- resultSetId [1] IMPLICIT InternationalString,
- item [2] IMPLICIT INTEGER} OPTIONAL,
- itemRequest [2] IMPLICIT EXTERNAL OPTIONAL
- -- When itemRequest is an ILL-Request APDU,
- -- use OID {iso standard 10161 abstract-syntax (2) ill-apdus (1)}
- }
-
-TargetPart ::= SEQUENCE{
- itemRequest [1] IMPLICIT EXTERNAL OPTIONAL,
- -- When itemRequest is an ILL-Request APDU, use OID 1.0.10161.2.1 (as above)
- statusOrErrorReport [2] IMPLICIT EXTERNAL OPTIONAL,
- -- When statusOrErrorReport is an ILL Status-Or-Error-Report APDU, use OID 1.0.10161.2.1 (as above)
- auxiliaryStatus [3] IMPLICIT INTEGER{
- notReceived (1),
- loanQueue (2),
- forwarded (3),
- unfilledCopyright (4),
- filledCopyright (5)} OPTIONAL}
-END
-
-
-
-
-ESFormat-Update0
-{Z39-50-extendedService Update (5)} DEFINITIONS ::=
-BEGIN
-IMPORTS DiagRec, InternationalString FROM Z39-50-APDU-1995;
-Update ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep,
- targetPart [2] TargetPart}}
-
-
-OriginPartToKeep ::= SEQUENCE{
- action [1] IMPLICIT INTEGER{
- recordInsert (1),
- recordReplace (2),
- recordDelete (3),
- elementUpdate (4)},
- databaseName [2] IMPLICIT InternationalString,
- schema [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- elementSetName [4] IMPLICIT InternationalString OPTIONAL}
-
-
-OriginPartNotToKeep ::= SuppliedRecords
-
-
-TargetPart ::= SEQUENCE{
- updateStatus [1] IMPLICIT INTEGER{
- success (1),
- partial (2),
- failure (3)},
- globalDiagnostics [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
- -- These are non-surrogate diagnostics relating to the task,
- -- not to individual records.
- taskPackageRecords [3] IMPLICIT SEQUENCE OF TaskPackageRecordStructure
- -- There should be a TaskPackageRecordStructure for every record
- -- supplied. The target should create such a structure for every
- -- record immediately upon creating the task package to include
- -- correlation information and status. The record itself would not
- -- be included until processing for that record is complete.
- }
-
--- Auxiliary definitions for Update
-SuppliedRecords ::= SEQUENCE OF SEQUENCE{
- recordId [1] CHOICE{
- number [1] IMPLICIT INTEGER,
- string [2] IMPLICIT InternationalString,
- opaque [3] IMPLICIT OCTET STRING} OPTIONAL,
- supplementalId [2] CHOICE{
- timeStamp [1] IMPLICIT GeneralizedTime,
- versionNumber [2] IMPLICIT InternationalString,
- previousVersion [3] IMPLICIT EXTERNAL} OPTIONAL,
- correlationInfo [3] IMPLICIT CorrelationInfo OPTIONAL,
- record [4] IMPLICIT EXTERNAL}
-
-CorrelationInfo ::= SEQUENCE{
- -- origin may supply one or both for any record:
- note [1] IMPLICIT InternationalString OPTIONAL,
- id [2] IMPLICIT INTEGER OPTIONAL}
-
-TaskPackageRecordStructure ::= SEQUENCE{
- recordOrSurDiag [1] CHOICE {
- record [1] IMPLICIT EXTERNAL,
- -- Choose 'record' if recordStatus is 'success', and
- -- elementSetName was supplied.
- diagnostic [2] DiagRec
- -- Choose 'diagnostic', if RecordStatus is failure.
- } OPTIONAL,
- -- The parameter recordOrSurDiag will thus be omitted only if
- -- 'elementSetName' was omitted and recordStatus is
- -- 'success'; or if record status is 'queued' or in 'process'.
- correlationInfo [2] IMPLICIT CorrelationInfo OPTIONAL,
- -- This should be included if it was supplied by the origin.
- recordStatus [3] IMPLICIT INTEGER{
- success (1),
- queued (2),
- inProcess (3),
- failure (4)}}
-END
-
-
-ESFormat-ExportSpecification
-{Z39-50-extendedService ExportSpecification (6)} DEFINITIONS ::=
-BEGIN
-EXPORTS ExportSpecification, Destination; IMPORTS CompSpec, InternationalString FROM Z39-50-APDU-1995;
-ExportSpecification ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] IMPLICIT NULL},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep,
- targetPart [2] IMPLICIT NULL}}
-OriginPartToKeep ::= SEQUENCE{
- composition [1] IMPLICIT CompSpec,
- exportDestination [2] Destination}
-
- Destination ::= CHOICE{
- phoneNumber [1] IMPLICIT InternationalString,
- faxNumber [2] IMPLICIT InternationalString,
- x400address [3] IMPLICIT InternationalString,
- emailAddress [4] IMPLICIT InternationalString,
- pagerNumber [5] IMPLICIT InternationalString,
- ftpAddress [6] IMPLICIT InternationalString,
- ftamAddress [7] IMPLICIT InternationalString,
- printerAddress [8] IMPLICIT InternationalString,
- other [100] IMPLICIT SEQUENCE{
- vehicle [1] IMPLICIT InternationalString OPTIONAL,
- destination [2] IMPLICIT InternationalString}}
-END
-
-
-
-
-ESFormat-ExportInvocation
-{Z39-50-extendedService ExportInvocation (7)} DEFINITIONS ::=
-BEGIN
-IMPORTS InternationalString, IntUnit FROM Z39-50-APDU-1995
-ExportSpecification FROM ESFormat-ExportSpecification;
-ExportInvocation ::= CHOICE{
- esRequest [1] IMPLICIT SEQUENCE{
- toKeep [1] OriginPartToKeep,
- notToKeep [2] OriginPartNotToKeep},
- taskPackage [2] IMPLICIT SEQUENCE{
- originPart [1] OriginPartToKeep,
- targetPart [2] TargetPart OPTIONAL}}
-
-OriginPartToKeep ::= SEQUENCE{
- exportSpec [1] CHOICE{
- packageName [1] IMPLICIT InternationalString,
- packageSpec [2] ExportSpecification},
- numberOfCopies [2] IMPLICIT INTEGER}
-
-
-
-
-
-OriginPartNotToKeep ::= SEQUENCE{
- resultSetId [1] IMPLICIT InternationalString,
- records [2] CHOICE{
- all [1] IMPLICIT NULL,
- ranges [2] IMPLICIT SEQUENCE OF SEQUENCE{
- start [1] IMPLICIT INTEGER,
- count [2] IMPLICIT INTEGER OPTIONAL
- -- Count may be omitted only on last range, to indicate
- -- "all remaining records beginning with 'start'."
- }}}
-
-TargetPart ::= SEQUENCE{
- estimatedQuantity [1] IMPLICIT IntUnit OPTIONAL,
- quantitySoFar [2] IMPLICIT IntUnit OPTIONAL,
- estimatedCost [3] IMPLICIT IntUnit OPTIONAL,
- costSoFar [4] IMPLICIT IntUnit OPTIONAL}
-END
-
-
-
-UserInfoFormat-searchResult-1
-{Z39-50-userInfoFormat searchResult-1 (1)} DEFINITIONS ::=
-BEGIN
-IMPORTS DatabaseName, Term, Query, IntUnit, InternationalString FROM Z39-50-APDU-1995;
-SearchInfoReport ::= SEQUENCE OF SEQUENCE{
- subqueryId [1] IMPLICIT InternationalString OPTIONAL,
- -- shorthand identifier of subquery
- fullQuery [2] IMPLICIT BOOLEAN, -- 'true' means this is the full query; 'false',
- -- a sub-query
- subqueryExpression [3] QueryExpression OPTIONAL, -- A subquery of the query as
- -- submitted. May be whole query;
- -- if so, "fullQuery" should be 'true'.
- subqueryInterpretation [4] QueryExpression OPTIONAL, -- how target interpreted subquery
- subqueryRecommendation [5] QueryExpression OPTIONAL, -- target-recommended alternative
- subqueryCount [6] IMPLICIT INTEGER OPTIONAL, -- Number of records for this
- -- subQuery, across all of the specified
- -- databases. (If during search, via resource
- -- control, number of records so far).
- subqueryWeight [7] IMPLICIT IntUnit OPTIONAL, -- relative weight of this subquery
- resultsByDB [8] IMPLICIT ResultsByDB OPTIONAL}
-
-ResultsByDB ::= SEQUENCE OF SEQUENCE{
- databases [1] CHOICE{
- all [1] IMPLICIT NULL,
- -- applies across all of the databases in Search PDU
- list [2] IMPLICIT SEQUENCE OF DatabaseName
- -- applies across all databases in this list
- },
- count [2] IMPLICIT INTEGER OPTIONAL,
- -- Number of records for query component (and, as above, if during search,
- -- via resource control, number of records so far).
- resultSetName [3] IMPLICIT InternationalString OPTIONAL
- -- Target-assigned result set by which subQuery is available. Should not
- -- be provided unless processing for this query component is concluded (i.e.,
- -- when this report comes during search, via resource control, as opposed
- -- to after search, via additionalSearchInfo).
- }
-
-QueryExpression ::= CHOICE {
- term [1] IMPLICIT SEQUENCE{
- queryTerm [1] Term,
- termComment [2] IMPLICIT InternationalString OPTIONAL},
- query [2] Query}
-END
-
-
-
-ElementSpecificationFormat-eSpec-1
-{Z39-50-elementSpec eSpec-1 (1)} DEFINITIONS ::=
-BEGIN
-IMPORTS Variant FROM RecordSyntax-generic
-StringOrNumeric, InternationalString FROM Z39-50-APDU-1995;
---
-Espec-1 ::= SEQUENCE{
- elementSetNames [1] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
- -- Origin may include one or more element set names, each
- -- specifying a set of elements. Each of the elements is to be
- -- treated as an elementRequest in the form of simpleElement,
- -- where occurrence is 1.
- defaultVariantSetId [2] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
- -- If supplied, applies whenever variantRequest
- -- does not include variantSetId.
- defaultVariantRequest [3] IMPLICIT Variant OPTIONAL,
- -- If supplied, then for each simple elementRequest that does not
- -- include a variantRequest, the defaultVariantRequest applies.
- -- (defaultVariantRequest does not apply to a compositeRequest.)
- defaultTagType [4] IMPLICIT INTEGER OPTIONAL,
- -- If supplied, applies whenever 'tagType' (within 'tag' within TagPath)
- -- is omitted.
- elements [5] IMPLICIT SEQUENCE OF ElementRequest OPTIONAL}
---
-
-ElementRequest::= CHOICE{
- simpleElement [1] IMPLICIT SimpleElement,
- compositeElement [2] IMPLICIT SEQUENCE{
- elementList [1] CHOICE{
- primitives [1] IMPLICIT SEQUENCE OF InternationalString,
- -- Origin may specify one or more element
- -- set names, each identifying a set of elements,
- -- and the composite element is the union.
- specs [2] IMPLICIT SEQUENCE OF SimpleElement},
-
- deliveryTag [2] IMPLICIT TagPath,
- -- DeliveryTag tagPath for compositeElement may not
- -- include wildThing or wildPath.
- variantRequest [3] IMPLICIT Variant OPTIONAL}}
-
-SimpleElement ::= SEQUENCE{
- path [1] IMPLICIT TagPath,
- variantRequest [2] IMPLICIT Variant OPTIONAL}
-
-
-TagPath ::= SEQUENCE OF CHOICE{
- specificTag [1] IMPLICIT SEQUENCE{
- tagType [1] IMPLICIT INTEGER OPTIONAL,
- -- If omitted, then 'defaultTagType' (above) applies, if supplied, and
- -- if not supplied, then default listed in schema applies.
- tagValue [2] StringOrNumeric,
- occurrence [3] Occurrences OPTIONAL
- -- default is "first occurrence"
- },
- wildThing [2] Occurrences,
- -- Get Nth "thing" at this level, regardless of tag, for each N specified by
- -- "Occurrences" (which may be 'all' meaning match every element at this level).
- -- E.g., if "Occurrences" is 3, get third element regardless of its tag or the tag of
- -- the first two elements.
- wildPath [3] IMPLICIT NULL
- -- Match any tag, at this level or below, that is on a path for which next tag in this
- -- TagPath sequence occurs. WildPath may not be last member of the TagPath
- -- sequence.
- }
---
-
-Occurrences ::= CHOICE{
- all [1] IMPLICIT NULL,
- last [2] IMPLICIT NULL,
- values [3] IMPLICIT SEQUENCE{
- start [1] IMPLICIT INTEGER,
- -- if 'start' alone is included, then single occurrence is requested
- howMany [2] IMPLICIT INTEGER OPTIONAL
- -- For example, if 'start' is 5 and 'howMany' is 6, then request is for
- -- "occurrences 5 through 10."
- }}
-END
-
-## $Id: Makefile.am,v 1.11 2003-03-11 11:09:17 adam Exp $
+## $Id: Makefile.am,v 1.12 2003-10-27 12:21:45 adam Exp $
## Copyright (C) 2001, Index Data
AM_CPPFLAGS = -I$(top_srcdir)/include
EXTRA_PROGRAMS = zoomtst1 zoomtst2 zoomtst3 zoomtst4 zoomtst5 zoomtst6 zoomtst7 zoomtst8
bin_PROGRAMS = zoomsh
-LDADD = ../lib/libyazmalloc.la ../lib/libyaz.la $(READLINE_LIBS)
+LDADD = ../src/libyaz.la $(READLINE_LIBS)
zoomtst1_SOURCES = zoomtst1.c
zoomtst2_SOURCES = zoomtst2.c
-## $Id: Makefile.am,v 1.14 2003-02-18 10:37:08 adam Exp $
+## $Id: Makefile.am,v 1.15 2003-10-27 12:21:45 adam Exp $
if ISSSL
sslbin=yaz-ztest-ssl
EXTRA_DIST=dummy-records dummy-words dummy-grs
if ISTHR
-extra=../lib/libyazthread.la
+extra=../src/libyazthread.la
endif
-yaz_ztest_LDADD=$(extra) ../lib/libyaz.la \
+yaz_ztest_LDADD=$(extra) ../src/libyaz.la \
$(LIBTHREAD)
-yaz_ztest_ssl_LDADD=$(extra) ../lib/libyazssl.la ../lib/libyaz.la \
+yaz_ztest_ssl_LDADD=$(extra) ../src/libyazssl.la ../src/libyaz.la \
$(SSL_LIBS) $(LIBTHREAD)
AM_CFLAGS=@CFLAGSTHREADS@
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-libzutil.la
-*.lo
+++ /dev/null
-## $Id: Makefile.am,v 1.20 2003-04-23 12:31:07 adam Exp $
-noinst_LTLIBRARIES = libzutil.la
-
-AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS)
-
-libzutil_la_SOURCES = zget.c yaz-ccl.c diagbib1.c logrpn.c \
- otherinfo.c pquery.c sortspec.c z3950oid.c charneg.c \
- zoom-c.c zoom-opt.c zoom-p.h grs1disp.c zgdu.c soap.c srw.c opacdisp.c
-
-srwtst_LDADD = ../odr/libodr.la libzutil.la ../util/libutil.la
-srwtst_SOURCES = srwtst.c
-
-EXTRA_PROGRAMS = srwtst
+++ /dev/null
-/*
- $ $Id: charneg.c,v 1.8 2003-09-02 12:12:13 adam Exp $
- * Helper functions for Character Set and Language Negotiation - 3
- */
-
-#include <stdio.h>
-#include <yaz/otherinfo.h>
-#include <yaz/z-charneg.h>
-#include <yaz/charneg.h>
-#include <yaz/yaz-util.h>
-
-static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value,
- const char *buf)
-{
- Z_External *p;
- oident oid;
- int len = strlen(buf);
-
- if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0;
-
- p->descriptor = 0;
- p->indirect_reference = 0;
-
- oid.proto = PROTO_Z3950;
- oid.oclass = (enum oid_class) oid_class;
- oid.value = (enum oid_value) oid_value;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
-
- p->which = Z_External_octet;
- if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) {
- return 0;
- }
- if (!(p->u.octet_aligned->buf = (unsigned char *)odr_malloc(o, len))) {
- return 0;
- }
- p->u.octet_aligned->len = p->u.octet_aligned->size = len;
- memcpy(p->u.octet_aligned->buf, buf, len);
-
- return p;
-}
-
-static int get_form(const char *charset)
-{
- int form = -1;
-
-
- if (!yaz_matchstr(charset, "UCS-2"))
- form = 2;
- if (!yaz_matchstr(charset, "UCS-4"))
- form = 4;
- if (!yaz_matchstr(charset, "UTF-16"))
- form = 5;
- if (!yaz_matchstr(charset, "UTF-8"))
- form = 8;
-
- return form;
-}
-
-static char *set_form (Odr_oid *encoding)
-{
- static char *charset = 0;
- if ( oid_oidlen(encoding) != 6)
- return 0;
- if (encoding[5] == 2)
- charset = "UCS-2";
- if (encoding[5] == 4)
- charset = "UCS-4";
- if (encoding[5] == 5)
- charset = "UTF-16";
- if (encoding[5] == 8)
- charset = "UTF-8";
- return charset;
-}
-
-static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset)
-{
- int form = get_form (charset);
- Z_OriginProposal_0 *p0 =
- (Z_OriginProposal_0*)odr_malloc(o, sizeof(*p0));
-
- memset(p0, 0, sizeof(*p0));
-
- if (form > 0)
- { /* ISO 10646 (UNICODE) */
- char oidname[20];
-
- Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));
- p0->which = Z_OriginProposal_0_iso10646;
- p0->u.iso10646 = is;
- is->collections = 0;
- sprintf (oidname, "1.0.10646.1.0.%d", form);
- is->encodingLevel = odr_getoidbystr (o, oidname);
- }
- else
- { /* private ones */
- Z_PrivateCharacterSet *pc =
- (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
-
- memset(pc, 0, sizeof(*pc));
-
- p0->which = Z_OriginProposal_0_private;
- p0->u.zprivate = pc;
-
- pc->which = Z_PrivateCharacterSet_externallySpecified;
- pc->u.externallySpecified =
- z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
- }
- return p0;
-}
-
-static Z_OriginProposal *z_get_OriginProposal(
- ODR o, const char **charsets, int num_charsets,
- const char **langs, int num_langs, int selected)
-{
- int i;
- Z_OriginProposal *p = (Z_OriginProposal *) odr_malloc(o, sizeof(*p));
-
- memset(p, 0, sizeof(*p));
-
- p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
- *p->recordsInSelectedCharSets = (selected) ? 1:0;
-
- if (charsets && num_charsets) {
-
- p->num_proposedCharSets = num_charsets;
- p->proposedCharSets =
- (Z_OriginProposal_0**)
- odr_malloc(o, num_charsets*sizeof(Z_OriginProposal_0*));
-
- for (i = 0; i<num_charsets; i++)
- p->proposedCharSets[i] =
- z_get_OriginProposal_0(o, charsets[i]);
- }
- if (langs && num_langs) {
-
- p->num_proposedlanguages = num_langs;
-
- p->proposedlanguages =
- (char **) odr_malloc(o, num_langs*sizeof(char *));
-
- for (i = 0; i<num_langs; i++) {
-
- p->proposedlanguages[i] = (char *)langs[i];
-
- }
- }
- return p;
-}
-
-static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(
- ODR o)
-{
- Z_CharSetandLanguageNegotiation *p =
- (Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p));
-
- memset(p, 0, sizeof(*p));
-
- return p;
-}
-
-/* Create EXTERNAL for negotation proposal. Client side */
-Z_External *yaz_set_proposal_charneg(ODR o,
- const char **charsets, int num_charsets,
- const char **langs, int num_langs,
- int selected)
-{
- Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
- oident oid;
-
- p->descriptor = 0;
- p->indirect_reference = 0;
-
- oid.proto = PROTO_Z3950;
- oid.oclass = CLASS_NEGOT;
- oid.value = VAL_CHARNEG3;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
-
- p->which = Z_External_charSetandLanguageNegotiation;
- p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
- p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal;
- p->u.charNeg3->u.proposal =
- z_get_OriginProposal(o, charsets, num_charsets,
- langs, num_langs, selected);
-
- return p;
-}
-
-/* used by yaz_set_response_charneg */
-static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset,
- const char *lang, int selected)
-{
- Z_TargetResponse *p = (Z_TargetResponse *) odr_malloc(o, sizeof(*p));
- int form = get_form(charset);
-
- memset(p, 0, sizeof(*p));
-
- if (form > 0)
- {
- char oidname[20];
-
- Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));
- p->which = Z_TargetResponse_iso10646;
- p->u.iso10646 = is;
- is->collections = 0;
- sprintf (oidname, "1.0.10646.1.0.%d", form);
- is->encodingLevel = odr_getoidbystr (o, oidname);
- }
- else
- {
- Z_PrivateCharacterSet *pc =
- (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
-
- memset(pc, 0, sizeof(*pc));
-
- p->which = Z_TargetResponse_private;
- p->u.zprivate = pc;
-
- pc->which = Z_PrivateCharacterSet_externallySpecified;
- pc->u.externallySpecified =
- z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
- }
- p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
- *p->recordsInSelectedCharSets = (selected) ? 1:0;
-
- p->selectedLanguage = lang ? (char *)odr_strdup(o, lang) : 0;
- return p;
-}
-
-/* Create charset response. Server side */
-Z_External *yaz_set_response_charneg(ODR o, const char *charset,
- const char *lang, int selected)
-{
- Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
- oident oid;
-
- p->descriptor = 0;
- p->indirect_reference = 0;
-
- oid.proto = PROTO_Z3950;
- oid.oclass = CLASS_NEGOT;
- oid.value = VAL_CHARNEG3;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
-
- p->which = Z_External_charSetandLanguageNegotiation;
- p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
- p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response;
- p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected);
-
- return p;
-}
-
-/* Get negotiation from OtherInformation. Client&Server side */
-Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
-{
- Z_External *pext;
- int i;
-
- if(!p)
- return 0;
-
- for (i=0; i<p->num_elements; i++) {
-
- if ((p->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&
- (pext = p->list[i]->information.externallyDefinedInfo)) {
-
- oident *ent = oid_getentbyoid(pext->direct_reference);
-
- if (ent && ent->value == VAL_CHARNEG3 && ent->oclass == CLASS_NEGOT &&
- pext->which == Z_External_charSetandLanguageNegotiation) {
-
- return pext->u.charNeg3;
- }
- }
- }
- return 0;
-}
-
-/* Get charsets, langs, selected from negotiation.. Server side */
-void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
- char ***charsets, int *num_charsets,
- char ***langs, int *num_langs, int *selected)
-{
- int i;
- Z_OriginProposal *pro = p->u.proposal;
-
- if (num_charsets && charsets)
- {
- if (pro->num_proposedCharSets)
- {
- *num_charsets = pro->num_proposedCharSets;
-
- (*charsets) = (char **)
- nmem_malloc(mem, pro->num_proposedCharSets * sizeof(char *));
-
- for (i=0; i<pro->num_proposedCharSets; i++)
- {
- (*charsets)[i] = 0;
-
- if (pro->proposedCharSets[i]->which ==
- Z_OriginProposal_0_private &&
- pro->proposedCharSets[i]->u.zprivate->which ==
- Z_PrivateCharacterSet_externallySpecified) {
-
- Z_External *pext =
- pro->proposedCharSets[i]->u.zprivate->u.externallySpecified;
-
- if (pext->which == Z_External_octet) {
-
- (*charsets)[i] = (char *)
- nmem_malloc(mem, (1+pext->u.octet_aligned->len) *
- sizeof(char));
-
- memcpy ((*charsets)[i], pext->u.octet_aligned->buf,
- pext->u.octet_aligned->len);
- (*charsets)[i][pext->u.octet_aligned->len] = 0;
-
- }
- }
- else if (pro->proposedCharSets[i]->which ==
- Z_OriginProposal_0_iso10646)
- (*charsets)[i] = set_form (
- pro->proposedCharSets[i]->u.iso10646->encodingLevel);
- }
- }
- else
- *num_charsets = 0;
- }
-
- if (langs && num_langs)
- {
- if (pro->num_proposedlanguages)
- {
- *num_langs = pro->num_proposedlanguages;
-
- (*langs) = (char **)
- nmem_malloc(mem, pro->num_proposedlanguages * sizeof(char *));
-
- for (i=0; i<pro->num_proposedlanguages; i++)
- (*langs)[i] = nmem_strdup(mem, pro->proposedlanguages[i]);
- }
- else
- *num_langs = 0;
- }
-
- if(pro->recordsInSelectedCharSets && selected)
- *selected = *pro->recordsInSelectedCharSets;
-}
-
-/* Return charset, lang, selected from negotiation.. Client side */
-void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
- char **charset, char **lang, int *selected)
-{
- Z_TargetResponse *res = p->u.response;
-
- if (charset && res->which == Z_TargetResponse_private &&
- res->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {
-
- Z_External *pext = res->u.zprivate->u.externallySpecified;
-
- if (pext->which == Z_External_octet) {
-
- *charset = (char *)
- nmem_malloc(mem, (1+pext->u.octet_aligned->len)*sizeof(char));
- memcpy (*charset, pext->u.octet_aligned->buf,
- pext->u.octet_aligned->len);
- (*charset)[pext->u.octet_aligned->len] = 0;
- }
- }
- if (charset && res->which == Z_TargetResponse_iso10646)
- *charset = set_form (res->u.iso10646->encodingLevel);
- if (lang && res->selectedLanguage)
- *lang = nmem_strdup (mem, res->selectedLanguage);
-
- if(selected && res->recordsInSelectedCharSets)
- *selected = *res->recordsInSelectedCharSets;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: diagbib1.c,v 1.6 2003-01-06 08:20:29 adam Exp $
- */
-
-#include <stdio.h>
-
-#include <yaz/diagbib1.h>
-
-static struct {
- int code;
- char *msg;
-} msg_tab[] = {
-{ 1, "Permanent system error" },
-{ 2, "Temporary system error" },
-{ 3, "Unsupported search" },
-{ 4, "Terms only exclusion (stop) words" },
-{ 5, "Too many argument words" },
-{ 6, "Too many boolean operators" },
-{ 7, "Too many truncated words" },
-{ 8, "Too many incomplete subfields" },
-{ 9, "Truncated words too short" },
-{ 10, "Invalid format for record number (search term)" },
-{ 11, "Too many characters in search statement" },
-{ 12, "Too many records retrieved" },
-{ 13, "Present request out of range" },
-{ 14, "System error in presenting records" },
-{ 15, "Record no authorized to be sent intersystem" },
-{ 16, "Record exceeds Preferred-message-size" },
-{ 17, "Record exceeds Maximum-record-size" },
-{ 18, "Result set not supported as a search term" },
-{ 19, "Only single result set as search term supported" },
-{ 20, "Only ANDing of a single result set as search term supported" },
-{ 21, "Result set exists and replace indicator off" },
-{ 22, "Result set naming not supported" },
-{ 23, "Combination of specified databases not supported" },
-{ 24, "Element set names not supported" },
-{ 25, "Specified element set name not valid for specified database" },
-{ 26, "Only a single element set name supported" },
-{ 27, "Result set no longer exists - unilaterally deleted by target" },
-{ 28, "Result set is in use" },
-{ 29, "One of the specified databases is locked" },
-{ 30, "Specified result set does not exist" },
-{ 31, "Resources exhausted - no results available" },
-{ 32, "Resources exhausted - unpredictable partial results available" },
-{ 33, "Resources exhausted - valid subset of results available" },
-{ 100, "Unspecified error" },
-{ 101, "Access-control failure" },
-{ 102, "Security challenge required but could not be issued -"
-" request terminated" },
-{ 103, "Security challenge required but could not be issued -"
-" record not included" },
-{ 104, "Security challenge failed - record not included" },
-{ 105, "Terminated by negative continue response" },
-{ 106, "No abstract syntaxes agreed to for this record" },
-{ 107, "Query type not supported" },
-{ 108, "Malformed query" },
-{ 109, "Database unavailable" },
-{ 110, "Operator unsupported" },
-{ 111, "Too many databases specified" },
-{ 112, "Too many result sets created" },
-{ 113, "Unsupported attribute type" },
-{ 114, "Unsupported Use attribute" },
-{ 115, "Unsupported value for Use attribute" },
-{ 116, "Use attribute required but not supplied" },
-{ 117, "Unsupported Relation attribute" },
-{ 118, "Unsupported Structure attribute" },
-{ 119, "Unsupported Position attribute" },
-{ 120, "Unsupported Truncation attribute" },
-{ 121, "Unsupported Attribute Set" },
-{ 122, "Unsupported Completeness attribute" },
-{ 123, "Unsupported attribute combination" },
-{ 124, "Unsupported coded value for term" },
-{ 125, "Malformed search term" },
-{ 126, "Illegal term value for attribute" },
-{ 127, "Unparsable format for un-normalized value" },
-{ 128, "Illegal result set name" },
-{ 129, "Proximity search of sets not supported" },
-{ 130, "Illegal result set in proximity search" },
-{ 131, "Unsupported proximity relation" },
-{ 132, "Unsupported proximity unit code" },
-{ 201, "Proximity not supported with this attribute combination" },
-{ 202, "Unsupported distance for proximity" },
-{ 203, "Ordered flag not supported for proximity" },
-{ 205, "Only zero step size supported for Scan" },
-{ 206, "Specified step size not supported for Scan" },
-{ 207, "Cannot sort according to sequence" },
-{ 208, "No result set name supplied on Sort" },
-{ 209, "Generic sort not supported (database-specific sort only supported)" },
-{ 210, "Database specific sort not supported" },
-{ 211, "Too many sort keys" },
-{ 212, "Duplicate sort keys" },
-{ 213, "Unsupported missing data action" },
-{ 214, "Illegal sort relation" },
-{ 215, "Illegal case value" },
-{ 216, "Illegal missing data action" },
-{ 217, "Segmentation: Cannot guarantee records will fit in specified segments"
-},
-{ 218, "ES: Package name already in use" },
-{ 219, "ES: no such package, on modify/delete" },
-{ 220, "ES: quota exceeded" },
-{ 221, "ES: extended service type not supported" },
-{ 222, "ES: permission denied on ES - id not authorized" },
-{ 223, "ES: permission denied on ES - cannot modify or delete" },
-{ 224, "ES: immediate execution failed" },
-{ 225, "ES: immediate execution not supported for this service" },
-{ 226, "ES: immediate execution not supported for these parameters" },
-{ 227, "No data available in requested record syntax" },
-{ 228, "Scan: malformed scan" },
-{ 229, "Term type not supported" },
-{ 230, "Sort: too many input results" },
-{ 231, "Sort: incompatible record formats" },
-{ 232, "Scan: term list not supported" },
-{ 233, "Scan: unsupported value of position-in-response" },
-{ 234, "Too many index terms processed" },
-{ 235, "Database does not exist" },
-{ 236, "Access to specified database denied" },
-{ 237, "Sort: illegal sort" },
-{ 238, "Record not available in requested syntax" },
-{ 239, "Record syntax not supported" },
-{ 240, "Scan: Resources exhausted looking for satisfying terms" },
-{ 241, "Scan: Beginning or end of term list" },
-{ 242, "Segmentation: max-segment-size too small to segment record" },
-{ 243, "Present: additional-ranges parameter not supported" },
-{ 244, "Present: comp-spec parameter not supported" },
-{ 245, "Type-1 query: restriction ('resultAttr') operand not supported" },
-{ 246, "Type-1 query: 'complex' attributeValue not supported" },
-{ 247, "Type-1 query: 'attributeSet' as part of AttributeElement not supported" },
-{ 1001, "Malformed APDU"},
-{ 1002, "ES: EXTERNAL form of Item Order request not supported" },
-{ 1003, "ES: Result set item form of Item Order request not supported" },
-{ 1004, "ES: Extended services not supported unless access control is in effect" },
-{ 1005, "Response records in Search response not supported" },
-{ 1006, "Response records in Search response not possible for specified database (or database combination)" },
-{ 1007, "No Explain server. Addinfo: pointers to servers that have a surrogate Explain database for this server" },
-{ 1008, "ES: missing mandatory parameter for specified function. Addinfo: parameter" },
-{ 1009, "ES: Item Order, unsupported OID in itemRequest. Addinfo: OID" },
-{ 1010, "Init/AC: Bad Userid" },
-{ 1011, "Init/AC: Bad Userid and/or Password" },
-{ 1012, "Init/AC: No searches remaining (pre-purchased searches exhausted)" },
-{ 1013, "Init/AC: Incorrect interface type (specified id valid only when used with a particular access method or client)" },
-{ 1014, "Init/AC: Authentication System error" },
-{ 1015, "Init/AC: Maximum number of simultaneous sessions for Userid" },
-{ 1016, "Init/AC: Blocked network address"},
-{ 1017, "Init/AC: No databases available for specified userId"},
-{ 1018, "Init/AC: System temporarily out of resources"},
-{ 1019, "Init/AC: System not available due to maintenance" },
-{ 1020, "Init/AC: System temporarily unavailable (Addinfo: when it's expected back up)"},
-{ 1021, "Init/AC: Account has expired"},
-{ 1022, "Init/AC: Password has expired so a new one must be supplied"},
-{ 1023, "Init/AC: Password has been changed by an administrator so a new one must be supplied"},
-{ 1024, "Unsupported Attribute" },
-{ 1025, "Service not supported for this database" },
-{ 1026, "Record cannot be opened because it is locked"},
-{ 1027, "SQL error" },
-{ 1028, "Record deleted" },
-{ 1029, "Scan: too many terms requested. Addinfo: max terms supported" },
-/* 1030 - 1039 /currently unnassigned */
-
-/* The following, 1040 - 1047, were approved at the June 1998 ZIG meeting.
- These were originally proposed for addition to the Extended Services
- diagnostic set. */
-{ 1040, "ES: Invalid function" },
-{ 1041, "ES: Error in retention time" },
-{ 1042, "ES: Permissions data not understood" },
-{ 1043, "ES: Invalid OID for task specific parameters" },
-{ 1044, "ES: Invalid action" },
-{ 1045, "ES: Unknown schema" },
-{ 1046, "ES: Too many records in package" },
-{ 1047, "ES: Invalid wait action" },
-/* The following, 1048 - 1053, were approved at the October 1998 ZIG
- meeting. */
-{ 1048, "ES: Cannot create task package -- exceeds maximum permissable size"},
-{ 1049, "ES: Cannot return task package -- exceeds maximum permissable size"},
-{ 1050, "ES: Extended services request too large"},
-{ 1051, "Scan: Attribute set id required -- not supplied"},
-{ 1052, "ES: Cannot process task package record -- exceeds maximum "
- "permissible record size for ES" },
-{ 1053, "ES: Cannot return task package record -- exceeds maximum "
- "permissible record size for ES response" },
-/* The following, 1054 - 1057, were approved at the March 1999 ZIG
- meeting. 1054 and 1055 are added for support of the Model for Z39.50
- Negotiation During Initialization
- <http://lcweb.loc.gov/z3950/agency/nego.html>. 1056 was added in
- conjunction with the clarification Single-PDU, Multi-database Searching
- -- Status <http://lcweb.loc.gov/z3950/agency/clarify/db-status.html> */
-{ 1054, "Init: Required negotiation record not included"},
-{ 1055, "Init: negotiation option required"},
-{ 1056, "Attribute not supported for database" },
-{ 1057, "ES: Unsupported value of task package parameter"},
-/* The following, 1058 - 1066, were approved at the August 1999 ZIG
- meeting. 1058 through 1065 are added for support of the Z39.50 Duplicate
- Detection Service <http://lcweb.loc.gov/z3950/agency/amend/dedup.html>. */
-{ 1058, "Duplicate Detection: Cannot dedup on requested record portion" },
-{ 1059, "Duplicate Detection: Requested detection criterion not supported" },
-{ 1060, "Duplicate Detection: Requested level of match not supported" },
-{ 1061, "Duplicate Detection: Requested regular expression not supported" },
-{ 1062, "Duplicate Detection: Cannot do clustering" },
-{ 1063, "Duplicate Detection: Retention criterion not supported"},
-{ 1064, "Duplicate Detection: Requested number (or percentage) of entries "
- "for retention too large" },
-{ 1065, "Duplicate Detection: Requested sort criterion not supported" },
-{ 1066, "CompSpec: Unknown schema, or schema not supported."},
-/* The following, 1067 - 1069, were approved at the January 2000 ZIG
- meeting. 1067 and 1068 are added for support of encapsulation
- <http://lcweb.loc.gov/z3950/agency/amend/encapsulation.html> . */
-{ 1067, "Encapsulation: Encapsulated sequence of PDUs not supported" },
-{ 1068, "Encapsulation: Base operation (and encapsulated PDUs) not executed "
- "based on pre-screening analysis" },
-{ 1069, "No syntaxes available for this request" },
-/* The following, 1070-1071, were approved at the July 2000 ZIG meeting.
- These are defined in conjunction with the clarification Server Selected
- Record Syntax <http://lcweb.loc.gov/z3950/agency/clarify/altsyntax.html> */
-{ 1070, "user not authorized to receive record(s) in requested syntax" },
-{ 1071, "preferredRecordSyntax not supplied" },
-/* The following diagnostic was approved at the October 2001 ZIG meeting.
- See http://lists.w3.org/Archives/Public/www-zig/2001Jun/0006.html */
-{ 1072, "Query term includes characters that do not translate into the "
- "target character set"},
-{ 0, NULL}
-};
-
-const char *diagbib1_str (int code)
-{
- int i;
- for (i=0; msg_tab[i].msg; i++)
- if (msg_tab[i].code == code)
- return msg_tab[i].msg;
- return "Unknown error";
-}
+++ /dev/null
-/*
- * Copyright (c) 2002, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: grs1disp.c,v 1.1 2002-10-22 10:29:58 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <yaz/proto.h>
-
-static void display_variant(WRBUF w, Z_Variant *v, int level)
-{
- int i;
-
- for (i = 0; i < v->num_triples; i++)
- {
- printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
- *v->triples[i]->type);
- if (v->triples[i]->which == Z_Triple_internationalString)
- printf(",value=%s\n", v->triples[i]->value.internationalString);
- else
- printf("\n");
- }
-}
-
-static void display_grs1(WRBUF w, Z_GenericRecord *r, int level)
-{
- int i;
-
- if (!r)
- {
- return;
- }
- for (i = 0; i < r->num_elements; i++)
- {
- Z_TaggedElement *t;
-
- wrbuf_printf(w, "%*s", level * 4, "");
- t = r->elements[i];
- wrbuf_printf(w, "(");
- if (t->tagType)
- wrbuf_printf(w, "%d,", *t->tagType);
- else
- wrbuf_printf(w, "?,");
- if (t->tagValue->which == Z_StringOrNumeric_numeric)
- wrbuf_printf(w, "%d) ", *t->tagValue->u.numeric);
- else
- wrbuf_printf(w, "%s) ", t->tagValue->u.string);
- if (t->content->which == Z_ElementData_subtree)
- {
- if (!t->content->u.subtree)
- printf (" (no subtree)\n");
- else
- {
- wrbuf_printf(w, "\n");
- display_grs1(w, t->content->u.subtree, level+1);
- }
- }
- else if (t->content->which == Z_ElementData_string)
- wrbuf_printf(w, "%s\n", t->content->u.string);
- else if (t->content->which == Z_ElementData_numeric)
- wrbuf_printf(w, "%d\n", *t->content->u.numeric);
- else if (t->content->which == Z_ElementData_oid)
- {
- int *ip = t->content->u.oid;
- oident *oent;
-
- if ((oent = oid_getentbyoid(t->content->u.oid)))
- wrbuf_printf(w, "OID: %s\n", oent->desc);
- else
- {
- wrbuf_printf(w, "{");
- while (ip && *ip >= 0)
- wrbuf_printf(w, " %d", *(ip++));
- wrbuf_printf(w, " }\n");
- }
- }
- else if (t->content->which == Z_ElementData_noDataRequested)
- wrbuf_printf(w, "[No data requested]\n");
- else if (t->content->which == Z_ElementData_elementEmpty)
- wrbuf_printf(w, "[Element empty]\n");
- else if (t->content->which == Z_ElementData_elementNotThere)
- wrbuf_printf(w, "[Element not there]\n");
- else if (t->content->which == Z_ElementData_date)
- wrbuf_printf(w, "Date: %s\n", t->content->u.date);
- else if (t->content->which == Z_ElementData_ext)
- {
- printf ("External\n");
- /* we cannot print externals here. Srry */
- }
- else
- wrbuf_printf(w, "? type = %d\n",t->content->which);
- if (t->appliedVariant)
- display_variant(w, t->appliedVariant, level+1);
- if (t->metaData && t->metaData->supportedVariants)
- {
- int c;
-
- wrbuf_printf(w, "%*s---- variant list\n", (level+1)*4, "");
- for (c = 0; c < t->metaData->num_supportedVariants; c++)
- {
- wrbuf_printf(w, "%*svariant #%d\n", (level+1)*4, "", c);
- display_variant(w, t->metaData->supportedVariants[c], level+2);
- }
- }
- }
-}
-
-void yaz_display_grs1(WRBUF wrbuf, Z_GenericRecord *r, int flags)
-{
- display_grs1 (wrbuf, r, 0);
-}
-
+++ /dev/null
-/*
- * Copyright (C) 1995-2003, Index Data
- * All rights reserved.
- *
- * $Id: logrpn.c,v 1.11 2003-02-27 19:56:00 adam Exp $
- */
-#include <stdio.h>
-
-#include <yaz/log.h>
-#include <yaz/logrpn.h>
-
-static const char *relToStr(int v)
-{
- const char *str = 0;
- switch (v)
- {
- case 1: str = "Less than"; break;
- case 2: str = "Less than or equal"; break;
- case 3: str = "Equal"; break;
- case 4: str = "Greater or equal"; break;
- case 5: str = "Greater than"; break;
- case 6: str = "Not equal"; break;
- case 100: str = "Phonetic"; break;
- case 101: str = "Stem"; break;
- case 102: str = "Relevance"; break;
- case 103: str = "AlwaysMatches"; break;
- }
- return str;
-}
-static void attrStr (int type, int value, enum oid_value ast, char *str)
-{
- const char *rstr;
- *str = '\0';
- switch (ast)
- {
- case VAL_BIB1:
- case VAL_EXP1:
- case VAL_GILS:
- switch (type)
- {
- case 1:
- sprintf (str, "use");
- break;
- case 2:
- rstr = relToStr(value);
- if (rstr)
- sprintf (str, "relation=%s", rstr);
- else
- sprintf (str, "relation=%d", value);
- break;
- case 3:
- switch (value)
- {
- case 1:
- sprintf (str, "position=First in field");
- break;
- case 2:
- sprintf (str, "position=First in any subfield");
- break;
- case 3:
- sprintf (str, "position=Any position in field");
- break;
- default:
- sprintf (str, "position");
- }
- break;
- case 4:
- switch (value)
- {
- case 1:
- sprintf (str, "structure=Phrase");
- break;
- case 2:
- sprintf (str, "structure=Word");
- break;
- case 3:
- sprintf (str, "structure=Key");
- break;
- case 4:
- sprintf (str, "structure=Year");
- break;
- case 5:
- sprintf (str, "structure=Date");
- break;
- case 6:
- sprintf (str, "structure=Word list");
- break;
- case 100:
- sprintf (str, "structure=Date (un)");
- break;
- case 101:
- sprintf (str, "structure=Name (norm)");
- break;
- case 102:
- sprintf (str, "structure=Name (un)");
- break;
- case 103:
- sprintf (str, "structure=Structure");
- break;
- case 104:
- sprintf (str, "structure=urx");
- break;
- case 105:
- sprintf (str, "structure=free-form-text");
- break;
- case 106:
- sprintf (str, "structure=document-text");
- break;
- case 107:
- sprintf (str, "structure=local-number");
- break;
- case 108:
- sprintf (str, "structure=string");
- break;
- case 109:
- sprintf (str, "structure=numeric string");
- break;
- default:
- sprintf (str, "structure");
- }
- break;
- case 5:
- switch (value)
- {
- case 1:
- sprintf (str, "truncation=Right");
- break;
- case 2:
- sprintf (str, "truncation=Left");
- break;
- case 3:
- sprintf (str, "truncation=Left&right");
- break;
- case 100:
- sprintf (str, "truncation=Do not truncate");
- break;
- case 101:
- sprintf (str, "truncation=Process #");
- break;
- case 102:
- sprintf (str, "truncation=re-1");
- break;
- case 103:
- sprintf (str, "truncation=re-2");
- break;
- case 104:
- sprintf (str, "truncation=CCL");
- break;
- default:
- sprintf (str, "truncation");
- }
- break;
- case 6:
- switch (value)
- {
- case 1:
- sprintf (str, "completeness=Incomplete subfield");
- break;
- case 2:
- sprintf (str, "completeness=Complete subfield");
- break;
- case 3:
- sprintf (str, "completeness=Complete field");
- break;
- default:
- sprintf (str, "completeness");
- }
- break;
- }
- break;
- default:
- break;
- }
- if (*str)
- sprintf (str + strlen(str), " (%d=%d)", type, value);
- else
- sprintf (str, "%d=%d", type, value);
-}
-
-/*
- * zlog_attributes: print attributes of term
- */
-static void zlog_attributes (Z_AttributesPlusTerm *t, int level,
- enum oid_value ast)
-{
- int of, i;
- char str[80];
- int num_attributes = t->attributes->num_attributes;
-
- for (of = 0; of < num_attributes; of++)
- {
- const char *attset_name = "";
- Z_AttributeElement *element;
- element = t->attributes->attributes[of];
- if (element->attributeSet)
- {
- oident *attrset;
- attrset = oid_getentbyoid (element->attributeSet);
- attset_name = attrset->desc;
- }
- switch (element->which)
- {
- case Z_AttributeValue_numeric:
- attrStr (*element->attributeType,
- *element->value.numeric, ast, str);
- yaz_log (LOG_LOG, "%*.0s%s %s", level, "", attset_name, str);
- break;
- case Z_AttributeValue_complex:
- yaz_log (LOG_LOG, "%*.0s%s attributeType=%d complex",
- level, "", attset_name, *element->attributeType);
- for (i = 0; i<element->value.complex->num_list; i++)
- {
- if (element->value.complex->list[i]->which ==
- Z_StringOrNumeric_string)
- yaz_log (LOG_LOG, "%*.0s string: '%s'", level, "",
- element->value.complex->list[i]->u.string);
- else if (element->value.complex->list[i]->which ==
- Z_StringOrNumeric_numeric)
- yaz_log (LOG_LOG, "%*.0s numeric: '%d'", level, "",
- *element->value.complex->list[i]->u.numeric);
- }
- break;
- default:
- yaz_log (LOG_LOG, "%.*s%s attribute unknown",
- level, "", attset_name);
- }
- }
-}
-
-static void zlog_structure (Z_RPNStructure *zs, int level, enum oid_value ast)
-{
- if (zs->which == Z_RPNStructure_complex)
- {
- Z_Operator *op = zs->u.complex->roperator;
- const char *rstr = 0;
- const char *unit = "private";
- switch (op->which)
- {
- case Z_Operator_and:
- yaz_log (LOG_LOG, "%*.0s and", level, "");
- break;
- case Z_Operator_or:
- yaz_log (LOG_LOG, "%*.0s or", level, "");
- break;
- case Z_Operator_and_not:
- yaz_log (LOG_LOG, "%*.0s and-not", level, "");
- break;
- case Z_Operator_prox:
- if (op->u.prox->which == Z_ProximityOperator_known)
- {
- switch(*op->u.prox->u.known)
- {
- case Z_ProxUnit_character: unit = "character"; break;
- case Z_ProxUnit_word: unit = "word"; break;
- case Z_ProxUnit_sentence: unit = "sentence"; break;
- case Z_ProxUnit_paragraph: unit = "paragraph"; break;
- case Z_ProxUnit_section: unit = "section"; break;
- case Z_ProxUnit_chapter: unit = "chapter"; break;
- case Z_ProxUnit_document: unit = "document"; break;
- case Z_ProxUnit_element: unit = "element"; break;
- case Z_ProxUnit_subelement: unit = "subelement"; break;
- case Z_ProxUnit_elementType: unit = "elementType"; break;
- case Z_ProxUnit_byte: unit = "byte"; break;
- default: unit = "unknown"; break;
- }
- }
- rstr = relToStr(*op->u.prox->relationType);
- yaz_log (LOG_LOG, "%*.0s prox excl=%s dist=%d order=%s "
- "rel=%s unit=%s",
- level, "", op->u.prox->exclusion ?
- (*op->u.prox->exclusion ? "T" : "F") : "N",
- *op->u.prox->distance,
- *op->u.prox->ordered ? "T" : "F",
- rstr ? rstr : "unknown",
- unit);
- break;
- default:
- yaz_log (LOG_LOG, "%*.0s unknown complex", level, "");
- return;
- }
- zlog_structure (zs->u.complex->s1, level+2, ast);
- zlog_structure (zs->u.complex->s2, level+2, ast);
- }
- else if (zs->which == Z_RPNStructure_simple)
- {
- if (zs->u.simple->which == Z_Operand_APT)
- {
- Z_AttributesPlusTerm *zapt = zs->u.simple->u.attributesPlusTerm;
-
- switch (zapt->term->which)
- {
- case Z_Term_general:
- yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
- zapt->term->u.general->len,
- zapt->term->u.general->buf);
- break;
- case Z_Term_characterString:
- yaz_log (LOG_LOG, "%*.0s term '%s' (string)", level, "",
- zapt->term->u.characterString);
- break;
- case Z_Term_numeric:
- yaz_log (LOG_LOG, "%*.0s term '%d' (numeric)", level, "",
- *zapt->term->u.numeric);
- break;
- case Z_Term_null:
- yaz_log (LOG_LOG, "%*.0s term (null)", level, "");
- break;
- default:
- yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
- }
- zlog_attributes (zapt, level+2, ast);
- }
- else if (zs->u.simple->which == Z_Operand_resultSetId)
- {
- yaz_log (LOG_LOG, "%*.0s set '%s'", level, "",
- zs->u.simple->u.resultSetId);
- }
- else
- yaz_log (LOG_LOG, "%*.0s unknown simple structure", level, "");
- }
- else
- yaz_log (LOG_LOG, "%*.0s unknown structure", level, "");
-}
-
-void log_rpn_query (Z_RPNQuery *rpn)
-{
- oident *attrset;
- enum oid_value ast;
-
- attrset = oid_getentbyoid (rpn->attributeSetId);
- if (attrset)
- {
- ast = attrset->value;
- yaz_log (LOG_LOG, "RPN query. Type: %s", attrset->desc);
- }
- else
- {
- ast = VAL_NONE;
- yaz_log (LOG_LOG, "RPN query. Unknown type");
- }
- zlog_structure (rpn->RPNStructure, 0, ast);
-}
-
-void log_scan_term (Z_AttributesPlusTerm *zapt, oid_value ast)
-{
- int level = 0;
- if (zapt->term->which == Z_Term_general)
- {
- yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
- zapt->term->u.general->len, zapt->term->u.general->buf);
- }
- else
- yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
- zlog_attributes (zapt, level+2, ast);
-}
-
-void yaz_log_zquery (Z_Query *q)
-{
- switch (q->which)
- {
- case Z_Query_type_1: case Z_Query_type_101:
- log_rpn_query (q->u.type_1);
- break;
- case Z_Query_type_104:
- if (q->u.type_104->which == Z_External_CQL)
- yaz_log (LOG_LOG, "CQL: %s", q->u.type_104->u.cql);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: opacdisp.c,v 1.4 2003-07-30 10:00:27 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <yaz/proto.h>
-
-static void opac_element_str(WRBUF wrbuf, int l, const char *elem,
- const char *data)
-{
- if (data)
- {
- while (--l >= 0)
- wrbuf_puts(wrbuf, " ");
- wrbuf_puts(wrbuf, "<");
- wrbuf_puts(wrbuf, elem);
- wrbuf_puts(wrbuf, ">");
- wrbuf_xmlputs(wrbuf, data);
- wrbuf_puts(wrbuf, "</");
- wrbuf_puts(wrbuf, elem);
- wrbuf_puts(wrbuf, ">\n");
- }
-}
-
-static void opac_element_bool(WRBUF wrbuf, int l, const char *elem, int *data)
-{
- if (data)
- {
- while (--l >= 0)
- wrbuf_puts(wrbuf, " ");
- wrbuf_puts(wrbuf, "<");
- wrbuf_puts(wrbuf, elem);
- if (*data)
- wrbuf_puts(wrbuf, " value=\"1\"");
- else
- wrbuf_puts(wrbuf, " value=\"0\"");
- wrbuf_puts(wrbuf, "/>\n");
- }
-}
-
-void yaz_display_OPAC(WRBUF wrbuf, Z_OPACRecord *r, int flags)
-{
- int i;
- wrbuf_puts(wrbuf, "<holdings>\n");
-
- for (i = 0; i < r->num_holdingsData; i++)
- {
- Z_HoldingsRecord *h = r->holdingsData[i];
- wrbuf_puts(wrbuf, " <holding>\n");
-
- if (h->which == Z_HoldingsRecord_marcHoldingsRecord)
- {
- wrbuf_puts (wrbuf, " <marc/>\n");
- /* h->u.marcHoldingsRecord) */
- }
- else if (h->which == Z_HoldingsRecord_holdingsAndCirc)
- {
- int j;
-
- Z_HoldingsAndCircData *d = h->u.holdingsAndCirc;
-
- opac_element_str(wrbuf, 2, "typeOfRecord", d->typeOfRecord);
- opac_element_str(wrbuf, 2, "encodingLevel", d->encodingLevel);
- opac_element_str(wrbuf, 2, "format", d->format);
- opac_element_str(wrbuf, 2, "receiptAcqStatus", d->receiptAcqStatus);
- opac_element_str (wrbuf, 2, "generalRetention", d->generalRetention);
- opac_element_str (wrbuf, 2, "completeness", d->completeness);
- opac_element_str (wrbuf, 2, "dateOfReport", d->dateOfReport);
- opac_element_str (wrbuf, 2, "nucCode", d->nucCode);
- opac_element_str (wrbuf, 2, "localLocation", d->localLocation);
- opac_element_str (wrbuf, 2, "shelvingLocation", d->shelvingLocation);
- opac_element_str (wrbuf, 2, "callNumber", d->callNumber);
- opac_element_str (wrbuf, 2, "copyNumber", d->copyNumber);
- opac_element_str (wrbuf, 2, "publicNote", d->publicNote);
- opac_element_str (wrbuf, 2, "reproductionNote", d->reproductionNote);
- opac_element_str (wrbuf, 2, "termsUseRepro", d->termsUseRepro);
- opac_element_str (wrbuf, 2, "enumAndChron", d->enumAndChron);
- if (d->num_volumes)
- {
- wrbuf_puts (wrbuf, " <volumes>\n");
- for (j = 0; j<d->num_volumes; j++)
- {
- wrbuf_puts (wrbuf, " <volume>\n");
- opac_element_str (wrbuf, 4, "enumeration",
- d->volumes[j]->enumeration);
- opac_element_str (wrbuf, 4, "chronology",
- d->volumes[j]->chronology);
- opac_element_str (wrbuf, 4, "enumAndChron",
- d->volumes[j]->enumAndChron);
- wrbuf_puts (wrbuf, " </volume>\n");
- }
- wrbuf_puts (wrbuf, " </volumes>\n");
- }
- if (d->num_circulationData)
- {
- wrbuf_puts (wrbuf, " <circulations>\n");
- for (j = 0; j<d->num_circulationData; j++)
- {
- wrbuf_puts (wrbuf," <circulation>\n");
- opac_element_bool (wrbuf, 4, "availableNow",
- d->circulationData[j]->availableNow);
- opac_element_str (wrbuf, 4, "availabiltyDate",
- d->circulationData[j]->availablityDate);
- opac_element_str (wrbuf, 4, "availableThru",
- d->circulationData[j]->availableThru);
- opac_element_str (wrbuf, 4, "restrictions",
- d->circulationData[j]->restrictions);
- opac_element_str (wrbuf, 4, "itemId",
- d->circulationData[j]->itemId);
- opac_element_bool (wrbuf, 4, "renewable",
- d->circulationData[j]->renewable);
- opac_element_bool (wrbuf, 4, "onHold",
- d->circulationData[j]->onHold);
- opac_element_str (wrbuf, 4, "enumAndChron",
- d->circulationData[j]->enumAndChron);
- opac_element_str (wrbuf, 4, "midspine",
- d->circulationData[j]->midspine);
- opac_element_str (wrbuf, 4, "temporaryLocation",
- d->circulationData[j]->temporaryLocation);
- wrbuf_puts (wrbuf, " </circulation>\n");
- }
- wrbuf_puts (wrbuf, " </circulations>\n");
- }
- }
- wrbuf_puts(wrbuf, " </holding>\n");
- }
- wrbuf_puts(wrbuf, "</holdings>\n");
-}
+++ /dev/null
-/*
- * Copyright (c) 1999-2003, Index Data
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: otherinfo.c,v 1.7 2003-01-06 08:20:29 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include <yaz/otherinfo.h>
-
-void yaz_oi_APDU(Z_APDU *apdu, Z_OtherInformation ***oip)
-{
- switch (apdu->which)
- {
- case Z_APDU_initRequest:
- *oip = &apdu->u.initRequest->otherInfo;
- break;
- case Z_APDU_searchRequest:
- *oip = &apdu->u.searchRequest->otherInfo;
- break;
- case Z_APDU_presentRequest:
- *oip = &apdu->u.presentRequest->otherInfo;
- break;
- case Z_APDU_sortRequest:
- *oip = &apdu->u.sortRequest->otherInfo;
- break;
- case Z_APDU_scanRequest:
- *oip = &apdu->u.scanRequest->otherInfo;
- break;
- case Z_APDU_extendedServicesRequest:
- *oip = &apdu->u.extendedServicesRequest->otherInfo;
- break;
- case Z_APDU_deleteResultSetRequest:
- *oip = &apdu->u.deleteResultSetRequest->otherInfo;
- break;
- case Z_APDU_initResponse:
- *oip = &apdu->u.initResponse->otherInfo;
- break;
- case Z_APDU_searchResponse:
- *oip = &apdu->u.searchResponse->otherInfo;
- break;
- case Z_APDU_presentResponse:
- *oip = &apdu->u.presentResponse->otherInfo;
- break;
- case Z_APDU_sortResponse:
- *oip = &apdu->u.sortResponse->otherInfo;
- break;
- case Z_APDU_scanResponse:
- *oip = &apdu->u.scanResponse->otherInfo;
- break;
- case Z_APDU_extendedServicesResponse:
- *oip = &apdu->u.extendedServicesResponse->otherInfo;
- break;
- case Z_APDU_deleteResultSetResponse:
- *oip = &apdu->u.deleteResultSetResponse->otherInfo;
- break;
- case Z_APDU_duplicateDetectionRequest:
- *oip = &apdu->u.duplicateDetectionRequest->otherInfo;
- break;
- case Z_APDU_duplicateDetectionResponse:
- *oip = &apdu->u.duplicateDetectionResponse->otherInfo;
- break;
- default:
- *oip = 0;
- break;
- }
-}
-
-Z_OtherInformationUnit *yaz_oi_update (
- Z_OtherInformation **otherInformationP, ODR odr,
- int *oid, int categoryValue, int delete_flag)
-{
- int i;
- Z_OtherInformation *otherInformation;
-
- if (!otherInformationP)
- return 0;
- otherInformation = *otherInformationP;
- if (!otherInformation)
- {
- if (!odr)
- return 0;
- otherInformation = *otherInformationP = (Z_OtherInformation *)
- odr_malloc (odr, sizeof(*otherInformation));
- otherInformation->num_elements = 0;
- otherInformation->list = 0;
- }
- for (i = 0; i<otherInformation->num_elements; i++)
- {
- if (!oid)
- {
- if (!otherInformation->list[i]->category)
- return otherInformation->list[i];
- }
- else
- {
- if (otherInformation->list[i]->category &&
- categoryValue ==
- *otherInformation->list[i]->category->categoryValue &&
- !oid_oidcmp (oid, otherInformation->list[i]->category->
- categoryTypeId))
- {
- Z_OtherInformationUnit *this_list = otherInformation->list[i];
-
- if (delete_flag)
- {
- (otherInformation->num_elements)--;
- while (i < otherInformation->num_elements)
- {
- otherInformation->list[i] =
- otherInformation->list[i+1];
- i++;
- }
- }
- return this_list;
- }
- }
- }
- if (!odr)
- return 0;
- else
- {
- Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**)
- odr_malloc(odr, (otherInformation->num_elements+1) *
- sizeof(*newlist));
- for (i = 0; i<otherInformation->num_elements; i++)
- newlist[i] = otherInformation->list[i];
- otherInformation->list = newlist;
-
- otherInformation->list[i] = (Z_OtherInformationUnit*)
- odr_malloc (odr, sizeof(Z_OtherInformationUnit));
- if (oid)
- {
- otherInformation->list[i]->category = (Z_InfoCategory*)
- odr_malloc (odr, sizeof(Z_InfoCategory));
- otherInformation->list[i]->category->categoryTypeId = (int*)
- odr_oiddup (odr, oid);
- otherInformation->list[i]->category->categoryValue = (int*)
- odr_malloc (odr, sizeof(int));
- *otherInformation->list[i]->category->categoryValue =
- categoryValue;
- }
- else
- otherInformation->list[i]->category = 0;
- otherInformation->list[i]->which = Z_OtherInfo_characterInfo;
- otherInformation->list[i]->information.characterInfo = 0;
-
- otherInformation->num_elements = i+1;
- return otherInformation->list[i];
- }
-}
-
-void yaz_oi_set_string_oid (
- Z_OtherInformation **otherInformation, ODR odr,
- int *oid, int categoryValue,
- const char *str)
-{
- Z_OtherInformationUnit *oi =
- yaz_oi_update(otherInformation, odr, oid, categoryValue, 0);
- if (!oi)
- return;
- oi->which = Z_OtherInfo_characterInfo;
- oi->information.characterInfo = odr_strdup (odr, str);
-}
-
-void yaz_oi_set_string_oidval (
- Z_OtherInformation **otherInformation, ODR odr,
- int oidval, int categoryValue,
- const char *str)
-{
- int oid[OID_SIZE];
- struct oident ent;
- ent.proto = PROTO_Z3950;
- ent.oclass = CLASS_USERINFO;
- ent.value = (oid_value) oidval;
- if (!oid_ent_to_oid (&ent, oid))
- return ;
- yaz_oi_set_string_oid(otherInformation,
- odr, oid, categoryValue, str);
-}
-
-char *yaz_oi_get_string_oid (
- Z_OtherInformation **otherInformation,
- int *oid, int categoryValue, int delete_flag)
-{
- Z_OtherInformationUnit *oi;
-
- if ((oi = yaz_oi_update(otherInformation, 0, oid, 1, delete_flag)) &&
- oi->which == Z_OtherInfo_characterInfo)
- return oi->information.characterInfo;
- return 0;
-}
-
-char *yaz_oi_get_string_oidval(Z_OtherInformation **otherInformation,
- int oidval, int categoryValue, int delete_flag)
-{
- int oid[OID_SIZE];
- struct oident ent;
- ent.proto = PROTO_Z3950;
- ent.oclass = CLASS_USERINFO;
- ent.value = (oid_value) oidval;
-
- if (!oid_ent_to_oid (&ent, oid))
- return 0;
- return yaz_oi_get_string_oid (otherInformation, oid, categoryValue,
- delete_flag);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: pquery.c,v 1.20 2003-01-06 08:20:29 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <yaz/proto.h>
-#include <yaz/oid.h>
-#include <yaz/pquery.h>
-
-static oid_value p_query_dfset = VAL_NONE;
-
-struct yaz_pqf_parser {
- const char *query_buf;
- const char *query_ptr;
- const char *lex_buf;
- size_t lex_len;
- int query_look;
- char *left_sep;
- char *right_sep;
- int escape_char;
- int term_type;
- int external_type;
- int error;
-};
-
-static Z_RPNStructure *rpn_structure (struct yaz_pqf_parser *li, ODR o,
- oid_proto,
- int num_attr, int max_attr,
- int *attr_list, char **attr_clist,
- oid_value *attr_set);
-
-static enum oid_value query_oid_getvalbyname (struct yaz_pqf_parser *li)
-{
- enum oid_value value;
- char buf[32];
-
- if (li->lex_len > 31)
- return VAL_NONE;
- memcpy (buf, li->lex_buf, li->lex_len);
- buf[li->lex_len] = '\0';
- value = oid_getvalbyname (buf);
- return value;
-}
-
-static int compare_term (struct yaz_pqf_parser *li, const char *src,
- size_t off)
-{
- size_t len=strlen(src);
-
- if (li->lex_len == len+off && !memcmp (li->lex_buf+off, src, len-off))
- return 1;
- return 0;
-}
-
-static int query_token (struct yaz_pqf_parser *li)
-{
- int sep_char = ' ';
- const char *sep_match;
- const char **qptr = &li->query_ptr;
-
- while (**qptr == ' ')
- (*qptr)++;
- if (**qptr == '\0')
- return 0;
- li->lex_len = 0;
- if ((sep_match = strchr (li->left_sep, **qptr)))
- {
- sep_char = li->right_sep[sep_match - li->left_sep];
- ++(*qptr);
- }
- li->lex_buf = *qptr;
-
- if (**qptr == li->escape_char && isdigit ((*qptr)[1]))
- {
- ++(li->lex_len);
- ++(*qptr);
- return 'l';
- }
- while (**qptr && **qptr != sep_char)
- {
- if (**qptr == '\\')
- {
- ++(li->lex_len);
- ++(*qptr);
- }
- ++(li->lex_len);
- ++(*qptr);
- }
- if (**qptr)
- ++(*qptr);
- if (sep_char == ' ' &&
- li->lex_len >= 1 && li->lex_buf[0] == li->escape_char)
- {
- if (compare_term (li, "and", 1))
- return 'a';
- if (compare_term (li, "or", 1))
- return 'o';
- if (compare_term (li, "not", 1))
- return 'n';
- if (compare_term (li, "attr", 1))
- return 'l';
- if (compare_term (li, "set", 1))
- return 's';
- if (compare_term (li, "attrset", 1))
- return 'r';
- if (compare_term (li, "prox", 1))
- return 'p';
- if (compare_term (li, "term", 1))
- return 'y';
- }
- return 't';
-}
-
-static int lex (struct yaz_pqf_parser *li)
-{
- return li->query_look = query_token (li);
-}
-
-static int escape_string(char *out_buf, const char *in, int len)
-{
-
- char *out = out_buf;
- while (--len >= 0)
- if (*in == '\\' && len > 0)
- {
- --len;
- switch (*++in)
- {
- case 't':
- *out++ = '\t';
- break;
- case 'n':
- *out++ = '\n';
- break;
- case 'r':
- *out++ = '\r';
- break;
- case 'f':
- *out++ = '\f';
- break;
- case 'x':
- if (len > 1)
- {
- char s[4];
- int n = 0;
- s[0] = *++in;
- s[1] = *++in;
- s[2] = '\0';
- len = len - 2;
- sscanf (s, "%x", &n);
- *out++ = n;
- }
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- if (len > 1)
- {
- char s[4];
- int n = 0;
- s[0] = *in;
- s[1] = *++in;
- s[2] = *++in;
- s[3] = '\0';
- len = len - 2;
- sscanf (s, "%o", &n);
- *out++ = n;
- }
- break;
- default:
- *out++ = *in;
- break;
- }
- in++;
- }
- else
- *out++ = *in++;
- return out - out_buf;
-}
-
-static int p_query_parse_attr(struct yaz_pqf_parser *li, ODR o,
- int num_attr, int *attr_list,
- char **attr_clist, oid_value *attr_set)
-{
- const char *cp;
- if (!(cp = strchr (li->lex_buf, '=')) ||
- (size_t) (cp-li->lex_buf) > li->lex_len)
- {
- attr_set[num_attr] = query_oid_getvalbyname (li);
- if (attr_set[num_attr] == VAL_NONE)
- {
- li->error = YAZ_PQF_ERROR_ATTSET;
- return 0;
- }
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- if (!(cp = strchr (li->lex_buf, '=')))
- {
- li->error = YAZ_PQF_ERROR_BADATTR;
- return 0;
- }
- }
- else
- {
- if (num_attr > 0)
- attr_set[num_attr] = attr_set[num_attr-1];
- else
- attr_set[num_attr] = VAL_NONE;
- }
- attr_list[2*num_attr] = atoi(li->lex_buf);
- cp++;
- if (*cp >= '0' && *cp <= '9')
- {
- attr_list[2*num_attr+1] = atoi (cp);
- attr_clist[num_attr] = 0;
- }
- else
- {
- int len = li->lex_len - (cp - li->lex_buf);
- attr_list[2*num_attr+1] = 0;
- attr_clist[num_attr] = (char *) odr_malloc (o, len+1);
- len = escape_string(attr_clist[num_attr], cp, len);
- attr_clist[num_attr][len] = '\0';
- }
- return 1;
-}
-
-static Z_AttributesPlusTerm *rpn_term (struct yaz_pqf_parser *li, ODR o,
- oid_proto proto,
- int num_attr, int *attr_list,
- char **attr_clist, oid_value *attr_set)
-{
- Z_AttributesPlusTerm *zapt;
- Odr_oct *term_octet;
- Z_Term *term;
- Z_AttributeElement **elements;
-
- zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
- term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
- term = (Z_Term *)odr_malloc (o, sizeof(*term));
-
- if (!num_attr)
- elements = (Z_AttributeElement**)odr_nullval();
- else
- {
- int i, k = 0;
- int *attr_tmp;
-
- elements = (Z_AttributeElement**)
- odr_malloc (o, num_attr * sizeof(*elements));
-
- attr_tmp = (int *)odr_malloc (o, num_attr * 2 * sizeof(int));
- memcpy (attr_tmp, attr_list, num_attr * 2 * sizeof(int));
- for (i = num_attr; --i >= 0; )
- {
- int j;
- for (j = i+1; j<num_attr; j++)
- if (attr_tmp[2*j] == attr_tmp[2*i])
- break;
- if (j < num_attr)
- continue;
- elements[k] =
- (Z_AttributeElement*)odr_malloc (o,sizeof(**elements));
- elements[k]->attributeType = &attr_tmp[2*i];
- elements[k]->attributeSet =
- yaz_oidval_to_z3950oid(o, CLASS_ATTSET, attr_set[i]);
-
- if (attr_clist[i])
- {
- elements[k]->which = Z_AttributeValue_complex;
- elements[k]->value.complex = (Z_ComplexAttribute *)
- odr_malloc (o, sizeof(Z_ComplexAttribute));
- elements[k]->value.complex->num_list = 1;
- elements[k]->value.complex->list =
- (Z_StringOrNumeric **)
- odr_malloc (o, 1 * sizeof(Z_StringOrNumeric *));
- elements[k]->value.complex->list[0] =
- (Z_StringOrNumeric *)
- odr_malloc (o, sizeof(Z_StringOrNumeric));
- elements[k]->value.complex->list[0]->which =
- Z_StringOrNumeric_string;
- elements[k]->value.complex->list[0]->u.string =
- attr_clist[i];
- elements[k]->value.complex->semanticAction = (int **)
- odr_nullval();
- elements[k]->value.complex->num_semanticAction = 0;
- }
- else
- {
- elements[k]->which = Z_AttributeValue_numeric;
- elements[k]->value.numeric = &attr_tmp[2*i+1];
- }
- k++;
- }
- num_attr = k;
- }
- zapt->attributes = (Z_AttributeList *)
- odr_malloc (o, sizeof(*zapt->attributes));
- zapt->attributes->num_attributes = num_attr;
- zapt->attributes->attributes = elements;
-
- zapt->term = term;
-
- term_octet->buf = (unsigned char *)odr_malloc (o, 1 + li->lex_len);
- term_octet->size = term_octet->len =
- escape_string ((char *) (term_octet->buf), li->lex_buf, li->lex_len);
- term_octet->buf[term_octet->size] = 0; /* null terminate */
-
- switch (li->term_type)
- {
- case Z_Term_general:
- term->which = Z_Term_general;
- term->u.general = term_octet;
- break;
- case Z_Term_characterString:
- term->which = Z_Term_characterString;
- term->u.characterString = (char*) term_octet->buf;
- /* null terminated above */
- break;
- case Z_Term_numeric:
- term->which = Z_Term_numeric;
- term->u.numeric = odr_intdup (o, atoi((char*) (term_octet->buf)));
- break;
- case Z_Term_null:
- term->which = Z_Term_null;
- term->u.null = odr_nullval();
- break;
- case Z_Term_external:
- term->which = Z_Term_external;
- term->u.external = 0;
- break;
- default:
- term->which = Z_Term_null;
- term->u.null = odr_nullval();
- break;
- }
- return zapt;
-}
-
-static Z_Operand *rpn_simple (struct yaz_pqf_parser *li, ODR o, oid_proto proto,
- int num_attr, int *attr_list, char **attr_clist,
- oid_value *attr_set)
-{
- Z_Operand *zo;
-
- zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
- switch (li->query_look)
- {
- case 't':
- zo->which = Z_Operand_APT;
- if (!(zo->u.attributesPlusTerm =
- rpn_term (li, o, proto, num_attr, attr_list, attr_clist,
- attr_set)))
- return 0;
- lex (li);
- break;
- case 's':
- lex (li);
- if (!li->query_look)
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- zo->which = Z_Operand_resultSetId;
- zo->u.resultSetId = (char *)odr_malloc (o, li->lex_len+1);
- memcpy (zo->u.resultSetId, li->lex_buf, li->lex_len);
- zo->u.resultSetId[li->lex_len] = '\0';
- lex (li);
- break;
- default:
- /* we're only called if one of the above types are seens so
- this shouldn't happen */
- li->error = YAZ_PQF_ERROR_INTERNAL;
- return 0;
- }
- return zo;
-}
-
-static Z_ProximityOperator *rpn_proximity (struct yaz_pqf_parser *li, ODR o)
-{
- Z_ProximityOperator *p = (Z_ProximityOperator *)odr_malloc (o, sizeof(*p));
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- if (*li->lex_buf == '1')
- {
- p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
- *p->exclusion = 1;
- }
- else if (*li->lex_buf == '0')
- {
- p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
- *p->exclusion = 0;
- }
- else
- p->exclusion = NULL;
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- p->distance = (int *)odr_malloc (o, sizeof(*p->distance));
- *p->distance = atoi (li->lex_buf);
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- p->ordered = (int *)odr_malloc (o, sizeof(*p->ordered));
- *p->ordered = atoi (li->lex_buf);
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- p->relationType = (int *)odr_malloc (o, sizeof(*p->relationType));
- *p->relationType = atoi (li->lex_buf);
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- if (*li->lex_buf == 'k')
- p->which = 0;
- else if (*li->lex_buf == 'p')
- p->which = 1;
- else
- p->which = atoi (li->lex_buf);
-
- if (!lex (li))
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return NULL;
- }
- p->which = Z_ProximityOperator_known;
- p->u.known = (int *)odr_malloc (o, sizeof(*p->u.known));
- *p->u.known = atoi (li->lex_buf);
- return p;
-}
-
-static Z_Complex *rpn_complex (struct yaz_pqf_parser *li, ODR o, oid_proto proto,
- int num_attr, int max_attr,
- int *attr_list, char **attr_clist,
- oid_value *attr_set)
-{
- Z_Complex *zc;
- Z_Operator *zo;
-
- zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
- zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
- zc->roperator = zo;
- switch (li->query_look)
- {
- case 'a':
- zo->which = Z_Operator_and;
- zo->u.and_not = odr_nullval();
- break;
- case 'o':
- zo->which = Z_Operator_or;
- zo->u.and_not = odr_nullval();
- break;
- case 'n':
- zo->which = Z_Operator_and_not;
- zo->u.and_not = odr_nullval();
- break;
- case 'p':
- zo->which = Z_Operator_prox;
- zo->u.prox = rpn_proximity (li, o);
- if (!zo->u.prox)
- return NULL;
- break;
- default:
- /* we're only called if one of the above types are seens so
- this shouldn't happen */
- li->error = YAZ_PQF_ERROR_INTERNAL;
- return NULL;
- }
- lex (li);
- if (!(zc->s1 =
- rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
- attr_clist, attr_set)))
- return NULL;
- if (!(zc->s2 =
- rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
- attr_clist, attr_set)))
- return NULL;
- return zc;
-}
-
-static void rpn_term_type (struct yaz_pqf_parser *li, ODR o)
-{
- if (!li->query_look)
- return ;
- if (compare_term (li, "general", 0))
- li->term_type = Z_Term_general;
- else if (compare_term (li, "numeric", 0))
- li->term_type = Z_Term_numeric;
- else if (compare_term (li, "string", 0))
- li->term_type = Z_Term_characterString;
- else if (compare_term (li, "oid", 0))
- li->term_type = Z_Term_oid;
- else if (compare_term (li, "datetime", 0))
- li->term_type = Z_Term_dateTime;
- else if (compare_term (li, "null", 0))
- li->term_type = Z_Term_null;
- else if (compare_term(li, "range", 0))
- {
- /* prepare for external: range search .. */
- li->term_type = Z_Term_external;
- li->external_type = VAL_MULTISRCH2;
- }
- lex (li);
-}
-
-static Z_RPNStructure *rpn_structure (struct yaz_pqf_parser *li, ODR o,
- oid_proto proto,
- int num_attr, int max_attr,
- int *attr_list,
- char **attr_clist,
- oid_value *attr_set)
-{
- Z_RPNStructure *sz;
-
- sz = (Z_RPNStructure *)odr_malloc (o, sizeof(*sz));
- switch (li->query_look)
- {
- case 'a':
- case 'o':
- case 'n':
- case 'p':
- sz->which = Z_RPNStructure_complex;
- if (!(sz->u.complex =
- rpn_complex (li, o, proto, num_attr, max_attr, attr_list,
- attr_clist, attr_set)))
- return NULL;
- break;
- case 't':
- case 's':
- sz->which = Z_RPNStructure_simple;
- if (!(sz->u.simple =
- rpn_simple (li, o, proto, num_attr, attr_list,
- attr_clist, attr_set)))
- return NULL;
- break;
- case 'l':
- lex (li);
- if (!li->query_look)
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- if (num_attr >= max_attr)
- {
- li->error = YAZ_PQF_ERROR_TOOMANY;
- return 0;
- }
- if (!p_query_parse_attr(li, o, num_attr, attr_list,
- attr_clist, attr_set))
- return 0;
- num_attr++;
- lex (li);
- return
- rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
- attr_clist, attr_set);
- case 'y':
- lex (li);
- rpn_term_type (li, o);
- return
- rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
- attr_clist, attr_set);
- case 0: /* operator/operand expected! */
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- return sz;
-}
-
-Z_RPNQuery *p_query_rpn_mk (ODR o, struct yaz_pqf_parser *li, oid_proto proto,
- const char *qbuf)
-{
- Z_RPNQuery *zq;
- int attr_array[1024];
- char *attr_clist[512];
- oid_value attr_set[512];
- oid_value topSet = VAL_NONE;
-
- zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
- lex (li);
- if (li->query_look == 'r')
- {
- lex (li);
- topSet = query_oid_getvalbyname (li);
- if (topSet == VAL_NONE)
- {
- li->error = YAZ_PQF_ERROR_ATTSET;
- return NULL;
- }
-
- lex (li);
- }
- if (topSet == VAL_NONE)
- topSet = p_query_dfset;
- if (topSet == VAL_NONE)
- topSet = VAL_BIB1;
-
- zq->attributeSetId = yaz_oidval_to_z3950oid(o, CLASS_ATTSET, topSet);
-
- if (!zq->attributeSetId)
- {
- li->error = YAZ_PQF_ERROR_ATTSET;
- return 0;
- }
-
- if (!(zq->RPNStructure = rpn_structure (li, o, proto, 0, 512,
- attr_array, attr_clist, attr_set)))
- return 0;
- if (li->query_look)
- {
- li->error = YAZ_PQF_ERROR_EXTRA;
- return 0;
- }
- return zq;
-}
-
-Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto,
- const char *qbuf)
-{
- struct yaz_pqf_parser li;
-
- li.error = 0;
- li.left_sep = "{\"";
- li.right_sep = "}\"";
- li.escape_char = '@';
- li.term_type = Z_Term_general;
- li.query_buf = li.query_ptr = qbuf;
- li.lex_buf = 0;
- return p_query_rpn_mk (o, &li, proto, qbuf);
-}
-
-
-Z_AttributesPlusTerm *p_query_scan_mk (struct yaz_pqf_parser *li,
- ODR o, oid_proto proto,
- Odr_oid **attributeSetP,
- const char *qbuf)
-{
- int attr_list[1024];
- char *attr_clist[512];
- oid_value attr_set[512];
- int num_attr = 0;
- int max_attr = 512;
- oid_value topSet = VAL_NONE;
- Z_AttributesPlusTerm *apt;
-
- lex (li);
- if (li->query_look == 'r')
- {
- lex (li);
- topSet = query_oid_getvalbyname (li);
-
- lex (li);
- }
- if (topSet == VAL_NONE)
- topSet = p_query_dfset;
- if (topSet == VAL_NONE)
- topSet = VAL_BIB1;
-
- *attributeSetP = yaz_oidval_to_z3950oid (o, CLASS_ATTSET, topSet);
-
- while (1)
- {
- if (li->query_look == 'l')
- {
- lex (li);
- if (!li->query_look)
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- if (num_attr >= max_attr)
- {
- li->error = YAZ_PQF_ERROR_TOOMANY;
- return 0;
- }
- if (!p_query_parse_attr(li, o, num_attr, attr_list,
- attr_clist, attr_set))
- return 0;
- num_attr++;
- lex (li);
- }
- else if (li->query_look == 'y')
- {
- lex (li);
- rpn_term_type (li, o);
- }
- else
- break;
- }
- if (!li->query_look)
- {
- li->error = YAZ_PQF_ERROR_MISSING;
- return 0;
- }
- apt = rpn_term (li, o, proto, num_attr, attr_list, attr_clist, attr_set);
-
- lex (li);
-
- if (li->query_look != 0)
- {
- li->error = YAZ_PQF_ERROR_EXTRA;
- return 0;
- }
- return apt;
-}
-
-Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
- Odr_oid **attributeSetP,
- const char *qbuf)
-{
- struct yaz_pqf_parser li;
-
- li.error = 0;
- li.left_sep = "{\"";
- li.right_sep = "}\"";
- li.escape_char = '@';
- li.term_type = Z_Term_general;
- li.query_buf = li.query_ptr = qbuf;
- li.lex_buf = 0;
-
- return p_query_scan_mk (&li, o, proto, attributeSetP, qbuf);
-}
-
-int p_query_attset (const char *arg)
-{
- p_query_dfset = oid_getvalbyname (arg);
- return (p_query_dfset == VAL_NONE) ? -1 : 0;
-}
-
-YAZ_PQF_Parser yaz_pqf_create (void)
-{
- YAZ_PQF_Parser p = (YAZ_PQF_Parser) xmalloc (sizeof(*p));
-
- p->error = 0;
- p->left_sep = "{\"";
- p->right_sep = "}\"";
- p->escape_char = '@';
- p->term_type = Z_Term_general;
-
- return p;
-}
-
-void yaz_pqf_destroy (YAZ_PQF_Parser p)
-{
- xfree (p);
-}
-
-Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf)
-{
- if (!p)
- return 0;
- p->query_buf = p->query_ptr = qbuf;
- p->lex_buf = 0;
- return p_query_rpn_mk (o, p, PROTO_Z3950, qbuf);
-}
-
-Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o,
- Odr_oid **attributeSetP,
- const char *qbuf)
-{
- if (!p)
- return 0;
- p->query_buf = p->query_ptr = qbuf;
- p->lex_buf = 0;
- return p_query_scan_mk (p, o, PROTO_Z3950, attributeSetP, qbuf);
-}
-
-int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off)
-{
- switch (p->error)
- {
- case YAZ_PQF_ERROR_NONE:
- *msg = "no error"; break;
- case YAZ_PQF_ERROR_EXTRA:
- *msg = "extra token"; break;
- case YAZ_PQF_ERROR_MISSING:
- *msg = "missing token"; break;
- case YAZ_PQF_ERROR_ATTSET:
- *msg = "unknown attribute set"; break;
- case YAZ_PQF_ERROR_TOOMANY:
- *msg = "too many attributes"; break;
- case YAZ_PQF_ERROR_BADATTR:
- *msg = "bad attribute specification"; break;
- case YAZ_PQF_ERROR_INTERNAL:
- *msg = "internal error"; break;
- default:
- *msg = "unknown error"; break;
- }
- *off = p->query_ptr - p->query_buf;
- return p->error;
-}
+++ /dev/null
-/*
- * Copyright (c) 1995-2001, Index Data
- * See the file LICENSE for details.
- *
- * $Id: query.c,v 1.4 2001-11-13 23:00:43 adam Exp $
- */
-
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <yaz/odr.h>
-#include <yaz/proto.h>
-
-static Z_Complex *makecomplex(ODR o, char **buf);
-static Z_Operand *makesimple(ODR o, char **buf);
-Z_RPNStructure *makerpn(ODR o, char **buf);
-
-void skip_spaces(char**p)
-{
- while (**p && isspace(**p))
- (*p)++;
-}
-
-static Z_Operand *makesimple(ODR o, char **buf)
-{
- Z_Operand *r;
- Z_AttributesPlusTerm *t;
- char *b;
-
- r = odr_malloc(o, sizeof(*r));
- if (**buf == 's' && *((*buf) + 1) == '=')
- {
- char *b = odr_malloc(o, 100);
-
- r->which = Z_Operand_resultSetId;
- r->u.resultSetId = b;
- (*buf)++;
- (*buf)++;
- while (**buf && !isspace(**buf))
- *(b++) = *((*buf)++);
- *b = 0;
- return r;
- }
- else if (**buf != '"')
- return 0;
- (*buf)++;
- r->which = Z_Operand_APT;
- r->u.attributesPlusTerm = t = odr_malloc(o, sizeof(*t));
- t->attributes = odr_malloc(o, sizeof(*t));
- t->attributes->num_attributes = 0;
- t->attributes->attributes = 0;
- t->term = odr_malloc(o, sizeof(*t->term));
- t->term->which = Z_Term_general;
- t->term->u.general = odr_malloc(o, sizeof(Odr_oct));
- t->term->u.general->buf = odr_malloc(o, 100);
- t->term->u.general->size = 100;
- t->term->u.general->len = 0;
- b = (char*) t->term->u.general->buf;
- while (**buf && **buf != '"')
- {
- *(b++) = *((*buf)++);
- t->term->u.general->len++;
- }
- if (**buf != '"')
- return 0;
- (*buf)++;
- return r;
-}
-
-static Z_Complex *makecomplex(ODR o, char **buf)
-{
- Z_Complex *r;
- char op[100], *b;
-
- r = odr_malloc(o, sizeof(*r));
- r->roperator = odr_malloc(o, sizeof(*r->roperator));
-
- b = op;
- while (**buf && !isspace(**buf))
- *(b++) = *((*buf)++);
- *b = 0;
- if (!strcmp(op, "and"))
- r->roperator->which = Z_Operator_and;
- else if (!strcmp(op, "or"))
- r->roperator->which = Z_Operator_or;
- else if (!strcmp(op, "not"))
- r->roperator->which = Z_Operator_and_not;
- r->roperator->u.and = "";
- while (**buf && !isspace(**buf))
- (*buf)++;
- if (!(r->s1 = makerpn(o, buf)))
- return 0;
- if (!(r->s2 = makerpn(o, buf)))
- return 0;
- return r;
-}
-
-Z_RPNStructure *makerpn(ODR o, char **buf)
-{
- Z_RPNStructure *r;
-
- r = odr_malloc(o, sizeof(*r));
- skip_spaces(buf);
- if (**buf == '"' || **buf == 's')
- {
- r->which = Z_RPNStructure_simple;
- if (!(r->u.simple = makesimple(o, buf)))
- return 0;
- return r;
- }
- r->which = Z_RPNStructure_complex;
- if (!(r->u.complex = makecomplex(o, buf)))
- return 0;
- return r;
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: soap.c,v 1.9 2003-04-23 20:36:05 adam Exp $
- */
-
-#include <yaz/soap.h>
-
-#if HAVE_XML2
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-static const char *soap_v1_1 = "http://schemas.xmlsoap.org/soap/envelope/";
-static const char *soap_v1_2 = "http://www.w3.org/2001/06/soap-envelope";
-
-int z_soap_error(ODR o, Z_SOAP *p,
- const char *fault_code, const char *fault_string,
- const char *details)
-{
- p->which = Z_SOAP_error;
- p->u.soap_error = (Z_SOAP_Fault *)
- odr_malloc(o, sizeof(*p->u.soap_error));
- p->u.soap_error->fault_code = odr_strdup(o, fault_code);
- p->u.soap_error->fault_string = odr_strdup(o, fault_string);
- if (details)
- p->u.soap_error->details = odr_strdup(o, details);
- else
- p->u.soap_error->details = 0;
- return -1;
-}
-
-int z_soap_codec_enc(ODR o, Z_SOAP **pp,
- char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers,
- const char *encoding)
-{
- if (o->direction == ODR_DECODE)
- {
- Z_SOAP *p;
- xmlNodePtr ptr, pptr;
- xmlDocPtr doc;
- int i, ret;
-
- if (!content_buf || !*content_buf || !content_len)
- return -1;
-
- *pp = p = (Z_SOAP *) odr_malloc(o, sizeof(*p));
- p->ns = soap_v1_1;
-
- doc = xmlParseMemory(*content_buf, *content_len);
- if (!doc)
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "Bad XML Document", 0);
- /* check that root node is Envelope */
- ptr = xmlDocGetRootElement(doc);
- if (!ptr || ptr->type != XML_ELEMENT_NODE ||
- strcmp(ptr->name, "Envelope") || !ptr->ns)
- {
- xmlFreeDoc(doc);
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "No Envelope element", 0);
- }
- else
- {
- /* determine SOAP version */
- const char * ns_envelope = ptr->ns->href;
- if (!strcmp(ns_envelope, soap_v1_1))
- p->ns = soap_v1_1;
- else if (!strcmp(ns_envelope, soap_v1_2))
- p->ns = soap_v1_2;
- else
- {
- xmlFreeDoc(doc);
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "Bad SOAP version", 0);
- }
- }
- ptr = ptr->children;
- while(ptr && ptr->type == XML_TEXT_NODE)
- ptr = ptr->next;
- if (ptr && ptr->type == XML_ELEMENT_NODE &&
- !strcmp(ptr->ns->href, p->ns) &&
- !strcmp(ptr->name, "Header"))
- {
- ptr = ptr->next;
- while(ptr && ptr->type == XML_TEXT_NODE)
- ptr = ptr->next;
- }
- /* check that Body is present */
- if (!ptr || ptr->type != XML_ELEMENT_NODE ||
- strcmp(ptr->name, "Body"))
- {
- xmlFreeDoc(doc);
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "SOAP Body element not found", 0);
- }
- if (strcmp(ptr->ns->href, p->ns))
- {
- xmlFreeDoc(doc);
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "SOAP bad NS for Body element", 0);
- }
- pptr = ptr;
- ptr = ptr->children;
- while (ptr && ptr->type == XML_TEXT_NODE)
- ptr = ptr->next;
- if (!ptr || ptr->type != XML_ELEMENT_NODE)
- {
- xmlFreeDoc(doc);
- return z_soap_error(o, p, "SOAP-ENV:Client",
- "SOAP No content for Body", 0);
- }
- /* check for fault package */
- if (!strcmp(ptr->ns->href, p->ns)
- && !strcmp(ptr->name, "Fault") && ptr->children)
- {
- ptr = ptr->children;
-
- p->which = Z_SOAP_fault;
- p->u.fault = odr_malloc(o, sizeof(*p->u.fault));
- p->u.fault->fault_code = 0;
- p->u.fault->fault_string = 0;
- p->u.fault->details = 0;
- while (ptr)
- {
- if (ptr->children && ptr->children->type == XML_TEXT_NODE)
- {
- if (!strcmp(ptr->name, "faultcode"))
- p->u.fault->fault_code =
- odr_strdup(o, ptr->children->content);
- if (!strcmp(ptr->name, "faultstring"))
- p->u.fault->fault_string =
- odr_strdup(o, ptr->children->content);
- if (!strcmp(ptr->name, "details"))
- p->u.fault->details =
- odr_strdup(o, ptr->children->content);
- }
- ptr = ptr->next;
- }
- ret = 0;
- }
- else
- {
- for (i = 0; handlers[i].ns; i++)
- if (!strcmp(ptr->ns->href, handlers[i].ns))
- break;
- if (handlers[i].ns)
- {
- void *handler_data = 0;
- ret = (*handlers[i].f)(o, pptr, &handler_data,
- handlers[i].client_data,
- handlers[i].ns);
- if (ret || !handler_data)
- z_soap_error(o, p, "SOAP-ENV:Client",
- "SOAP Handler returned error", 0);
- else
- {
- p->which = Z_SOAP_generic;
- p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
- p->u.generic->no = i;
- p->u.generic->ns = handlers[i].ns;
- p->u.generic->p = handler_data;
- }
- }
- else
- {
- ret = z_soap_error(o, p, "SOAP-ENV:Client",
- "No handler for NS", ptr->ns->href);
- }
- }
- xmlFreeDoc(doc);
- return ret;
- }
- else if (o->direction == ODR_ENCODE)
- {
- Z_SOAP *p = *pp;
- xmlNsPtr ns_env;
- xmlNodePtr envelope_ptr, body_ptr;
-
- xmlDocPtr doc = xmlNewDoc("1.0");
-
- envelope_ptr = xmlNewNode(0, "Envelope");
- ns_env = xmlNewNs(envelope_ptr, p->ns, "SOAP-ENV");
- xmlSetNs(envelope_ptr, ns_env);
-
- body_ptr = xmlNewChild(envelope_ptr, ns_env, "Body", 0);
- xmlDocSetRootElement(doc, envelope_ptr);
-
- if (p->which == Z_SOAP_fault || p->which == Z_SOAP_error)
- {
- Z_SOAP_Fault *f = p->u.fault;
- xmlNodePtr fault_ptr = xmlNewChild(body_ptr, ns_env, "Fault", 0);
- xmlNewChild(fault_ptr, ns_env, "faultcode", f->fault_code);
- xmlNewChild(fault_ptr, ns_env, "faultstring", f->fault_string);
- if (f->details)
- xmlNewChild(fault_ptr, ns_env, "details", f->details);
- }
- else if (p->which == Z_SOAP_generic)
- {
- int ret, no = p->u.generic->no;
-
- ret = (*handlers[no].f)(o, body_ptr, &p->u.generic->p,
- handlers[no].client_data,
- handlers[no].ns);
- if (ret)
- return ret;
- }
- if (p->which == Z_SOAP_generic && !strcmp(p->ns, "SRU"))
- {
- xmlDocSetRootElement(doc, body_ptr->children);
- }
- if (1)
- {
- xmlChar *buf_out;
- int len_out;
- if (encoding)
- xmlDocDumpMemoryEnc(doc, &buf_out, &len_out, encoding);
- else
- xmlDocDumpMemory(doc, &buf_out, &len_out);
- *content_buf = (char *) odr_malloc(o, len_out);
- *content_len = len_out;
- memcpy(*content_buf, buf_out, len_out);
- xmlFree(buf_out);
- }
- xmlFreeDoc(doc);
- return 0;
- }
- return 0;
-}
-#else
-int z_soap_codec_enc(ODR o, Z_SOAP **pp,
- char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers, const char *encoding)
-{
- static char *err_xml =
- "<?xml version=\"1.0\"?>\n"
- "<SOAP-ENV:Envelope"
- " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
- "\t<SOAP-ENV:Body>\n"
- "\t\t<SOAP-ENV:Fault>\n"
- "\t\t\t<faultcode>SOAP-ENV:Server</faultcode>\n"
- "\t\t\t<faultstring>HTTP error</faultstring>\n"
- "\t\t\t<detail>SOAP not supported in this YAZ configuration</detail>\n"
- "\t\t</SOAP-ENV:Fault>\n"
- "\t</SOAP-ENV:Body>\n"
- "</SOAP-ENV:Envelope>\n";
- if (o->direction == ODR_ENCODE)
- {
- *content_buf = err_xml;
- *content_len = strlen(err_xml);
- }
- return -1;
-}
-#endif
-int z_soap_codec(ODR o, Z_SOAP **pp,
- char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers)
-{
- return z_soap_codec_enc(o, pp, content_buf, content_len, handlers, 0);
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2001, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: sortspec.c,v 1.4 2001-11-13 23:00:43 adam Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <yaz/proto.h>
-#include <yaz/oid.h>
-#include <yaz/sortspec.h>
-
-Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg)
-{
- char sort_string_buf[32], sort_flags[32];
- Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
- odr_malloc (out, sizeof(*sksl));
- int off;
-
- sksl->num_specs = 0;
- sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
-
- while ((sscanf (arg, "%31s %31s%n", sort_string_buf,
- sort_flags, &off)) == 2 && off > 1)
- {
- int i;
- char *sort_string_sep;
- char *sort_string = sort_string_buf;
- Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
- Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
-
- arg += off;
- sksl->specs[sksl->num_specs++] = sks;
- sks->sortElement = (Z_SortElement *)
- odr_malloc (out, sizeof(*sks->sortElement));
- sks->sortElement->which = Z_SortElement_generic;
- sks->sortElement->u.generic = sk;
-
- if ((sort_string_sep = strchr (sort_string, '=')))
- {
- int i = 0;
- sk->which = Z_SortKey_sortAttributes;
- sk->u.sortAttributes = (Z_SortAttributes *)
- odr_malloc (out, sizeof(*sk->u.sortAttributes));
- sk->u.sortAttributes->id =
- yaz_oidval_to_z3950oid(out, CLASS_ATTSET, VAL_BIB1);
- sk->u.sortAttributes->list = (Z_AttributeList *)
- odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
- sk->u.sortAttributes->list->attributes = (Z_AttributeElement **)
- odr_malloc (out, 10 *
- sizeof(*sk->u.sortAttributes->list->attributes));
- while (i < 10 && sort_string && sort_string_sep)
- {
- Z_AttributeElement *el = (Z_AttributeElement *)
- odr_malloc (out, sizeof(*el));
- sk->u.sortAttributes->list->attributes[i] = el;
- el->attributeSet = 0;
- el->attributeType = odr_intdup (out, atoi (sort_string));
- el->which = Z_AttributeValue_numeric;
- el->value.numeric =
- odr_intdup (out, atoi (sort_string_sep + 1));
- i++;
- sort_string = strchr(sort_string, ',');
- if (sort_string)
- {
- sort_string++;
- sort_string_sep = strchr (sort_string, '=');
- }
- }
- sk->u.sortAttributes->list->num_attributes = i;
- }
- else
- {
- sk->which = Z_SortKey_sortField;
- sk->u.sortField = odr_strdup (out, sort_string);
- }
- sks->sortRelation = odr_intdup (out, Z_SortRelation_ascending);
- sks->caseSensitivity = odr_intdup (out, Z_SortCase_caseSensitive);
-
- sks->which = Z_SortKeySpec_null;
- sks->u.null = odr_nullval ();
-
- for (i = 0; sort_flags[i]; i++)
- {
- switch (sort_flags[i])
- {
- case 'd':
- case 'D':
- case '>':
- *sks->sortRelation = Z_SortRelation_descending;
- break;
- case 'a':
- case 'A':
- case '<':
- *sks->sortRelation = Z_SortRelation_ascending;
- break;
- case 'i':
- case 'I':
- *sks->caseSensitivity = Z_SortCase_caseInsensitive;
- break;
- case 'S':
- case 's':
- *sks->caseSensitivity = Z_SortCase_caseSensitive;
- break;
- }
- }
- }
- if (!sksl->num_specs)
- return 0;
- return sksl;
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: srw.c,v 1.15 2003-05-12 22:36:10 adam Exp $
- */
-
-#include <yaz/srw.h>
-
-#if HAVE_XML2
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len)
-{
- if (val)
- {
- xmlDocPtr doc = xmlParseMemory(val,len);
- if (doc)
- {
- xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
- xmlNodePtr t = xmlDocGetRootElement(doc);
- xmlAddChild(c, xmlCopyNode(t,1));
- xmlFreeDoc(doc);
- }
- }
-}
-
-static void add_xsd_string_n(xmlNodePtr ptr, const char *elem, char *val,
- int len)
-{
- if (val)
- {
- xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
- xmlNodePtr t = xmlNewTextLen(val, len);
- xmlAddChild(c, t);
- }
-}
-
-static void add_xsd_string(xmlNodePtr ptr, const char *elem, char *val)
-{
- if (val)
- xmlNewChild(ptr, 0, elem, val);
-}
-
-static void add_xsd_integer(xmlNodePtr ptr, const char *elem, int *val)
-{
- if (val)
- {
- char str[30];
- sprintf(str, "%d", *val);
- xmlNewChild(ptr, 0, elem, str);
- }
-}
-
-static int match_element(xmlNodePtr ptr, const char *elem)
-{
- if (ptr->type == XML_ELEMENT_NODE && !strcmp(ptr->name, elem))
- return 1;
- return 0;
-}
-
-#define CHECK_TYPE 0
-
-static int match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o,
- char **val, int *len)
-{
-#if CHECK_TYPE
- struct _xmlAttr *attr;
-#endif
- if (!match_element(ptr, elem))
- return 0;
-#if CHECK_TYPE
- for (attr = ptr->properties; attr; attr = attr->next)
- if (!strcmp(attr->name, "type") &&
- attr->children && attr->children->type == XML_TEXT_NODE)
- {
- const char *t = strchr(attr->children->content, ':');
- if (t)
- t = t + 1;
- else
- t = attr->children->content;
- if (!strcmp(t, "string"))
- break;
- }
- if (!attr)
- return 0;
-#endif
- ptr = ptr->children;
- if (!ptr || ptr->type != XML_TEXT_NODE)
- return 0;
- *val = odr_strdup(o, ptr->content);
- if (len)
- *len = strlen(ptr->content);
- return 1;
-}
-
-
-static int match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o,
- char **val)
-{
- return match_xsd_string_n(ptr, elem, o, val, 0);
-}
-
-static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o,
- char **val, int *len)
-{
- xmlBufferPtr buf;
-
- if (!match_element(ptr, elem))
- return 0;
- ptr = ptr->children;
- if (!ptr)
- return 0;
- buf = xmlBufferCreate();
-
- xmlNodeDump(buf, ptr->doc, ptr, 0, 0);
-
- *val = odr_malloc(o, buf->use+1);
- memcpy (*val, buf->content, buf->use);
- (*val)[buf->use] = '\0';
-
- if (len)
- *len = buf->use;
-
- xmlBufferFree(buf);
-
- return 1;
-}
-
-
-static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val)
-{
-#if CHECK_TYPE
- struct _xmlAttr *attr;
-#endif
- if (!match_element(ptr, elem))
- return 0;
-#if CHECK_TYPE
- for (attr = ptr->properties; attr; attr = attr->next)
- if (!strcmp(attr->name, "type") &&
- attr->children && attr->children->type == XML_TEXT_NODE)
- {
- const char *t = strchr(attr->children->content, ':');
- if (t)
- t = t + 1;
- else
- t = attr->children->content;
- if (!strcmp(t, "integer"))
- break;
- }
- if (!attr)
- return 0;
-#endif
- ptr = ptr->children;
- if (!ptr || ptr->type != XML_TEXT_NODE)
- return 0;
- *val = odr_intdup(o, atoi(ptr->content));
- return 1;
-}
-
-static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs,
- int *num, void *client_data, const char *ns)
-{
- if (o->direction == ODR_DECODE)
- {
- int i;
- xmlNodePtr ptr;
- *num = 0;
- for (ptr = pptr->children; ptr; ptr = ptr->next)
- {
- if (ptr->type == XML_ELEMENT_NODE &&
- !strcmp(ptr->name, "record"))
- (*num)++;
- }
- if (!*num)
- return 1;
- *recs = odr_malloc(o, *num * sizeof(**recs));
- for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
- {
- if (ptr->type == XML_ELEMENT_NODE &&
- !strcmp(ptr->name, "record"))
- {
- xmlNodePtr rptr;
- (*recs)[i].recordSchema = 0;
- (*recs)[i].recordPacking = Z_SRW_recordPacking_string;
- (*recs)[i].recordData_buf = 0;
- (*recs)[i].recordData_len = 0;
- (*recs)[i].recordPosition = 0;
- for (rptr = ptr->children; rptr; rptr = rptr->next)
- {
- if (match_xsd_string(rptr, "recordSchema", o,
- &(*recs)[i].recordSchema))
- ;
- else if (match_xsd_string_n(rptr, "recordData", o,
- &(*recs)[i].recordData_buf,
- &(*recs)[i].recordData_len))
- ;
- else if (match_xsd_XML_n(rptr, "recordXML", o,
- &(*recs)[i].recordData_buf,
- &(*recs)[i].recordData_len))
- (*recs)[i].recordPacking = Z_SRW_recordPacking_XML;
- else if (match_xsd_integer(rptr, "recordPosition", o,
- &(*recs)[i].recordPosition))
- ;
- }
- }
- }
- }
- else if (o->direction == ODR_ENCODE)
- {
- int i;
- for (i = 0; i < *num; i++)
- {
- xmlNodePtr rptr = xmlNewChild(pptr, 0, "record", 0);
- add_xsd_string(rptr, "recordSchema", (*recs)[i].recordSchema);
- switch((*recs)[i].recordPacking)
- {
- case Z_SRW_recordPacking_string:
- add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
- (*recs)[i].recordData_len);
- break;
- case Z_SRW_recordPacking_XML:
- add_XML_n(rptr, "recordXML", (*recs)[i].recordData_buf,
- (*recs)[i].recordData_len);
- break;
- }
- add_xsd_integer(rptr, "recordPosition", (*recs)[i].recordPosition);
- }
- }
- return 0;
-}
-
-static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs,
- int *num, void *client_data, const char *ns)
-{
- if (o->direction == ODR_DECODE)
- {
- int i;
- xmlNodePtr ptr;
- *num = 0;
- for (ptr = pptr->children; ptr; ptr = ptr->next)
- {
- if (ptr->type == XML_ELEMENT_NODE &&
- !strcmp(ptr->name, "diagnostic"))
- (*num)++;
- }
- if (!*num)
- return 1;
- *recs = odr_malloc(o, *num * sizeof(**recs));
- for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
- {
- if (ptr->type == XML_ELEMENT_NODE &&
- !strcmp(ptr->name, "diagnostic"))
- {
- xmlNodePtr rptr;
- (*recs)[i].code = 0;
- (*recs)[i].details = 0;
- for (rptr = ptr->children; rptr; rptr = rptr->next)
- {
- if (match_xsd_integer(rptr, "code", o,
- &(*recs)[i].code))
- ;
- else if (match_xsd_string(rptr, "details", o,
- &(*recs)[i].details))
- ;
- }
- i++;
- }
- }
- }
- else if (o->direction == ODR_ENCODE)
- {
- int i;
- for (i = 0; i < *num; i++)
- {
- xmlNodePtr rptr = xmlNewChild(pptr, 0, "diagnostic", 0);
- add_xsd_integer(rptr, "code", (*recs)[i].code);
- add_xsd_string(rptr, "details", (*recs)[i].details);
- }
- }
- return 0;
-}
-
-
-int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
- void *client_data, const char *ns)
-{
- xmlNodePtr pptr = vptr;
- if (o->direction == ODR_DECODE)
- {
- xmlNodePtr method = pptr->children;
-
- while (method && method->type == XML_TEXT_NODE)
- method = method->next;
-
- if (!method || method->type != XML_ELEMENT_NODE)
- return -1;
- if (!strcmp(method->name, "searchRetrieveRequest"))
- {
- Z_SRW_PDU **p = handler_data;
- xmlNodePtr ptr = method->children;
- Z_SRW_searchRetrieveRequest *req;
-
- *p = odr_malloc(o, sizeof(**p));
- (*p)->which = Z_SRW_searchRetrieve_request;
- req = (*p)->u.request = odr_malloc(o, sizeof(*req));
- req->query_type = Z_SRW_query_type_cql;
- req->query.cql = 0;
- req->sort_type = Z_SRW_sort_type_none;
- req->sort.none = 0;
- req->startRecord = 0;
- req->maximumRecords = 0;
- req->recordSchema = 0;
- req->recordPacking = 0;
- req->database = 0;
-
- for (; ptr; ptr = ptr->next)
- {
- if (match_xsd_string(ptr, "query", o,
- &req->query.cql))
- req->query_type = Z_SRW_query_type_cql;
- else if (match_xsd_string(ptr, "pQuery", o,
- &req->query.pqf))
- req->query_type = Z_SRW_query_type_pqf;
- else if (match_xsd_string(ptr, "xQuery", o,
- &req->query.xcql))
- req->query_type = Z_SRW_query_type_xcql;
- else if (match_xsd_string(ptr, "sortKeys", o,
- &req->sort.sortKeys))
- req->sort_type = Z_SRW_sort_type_sort;
- else if (match_xsd_string(ptr, "recordSchema", o,
- &req->recordSchema))
- ;
- else if (match_xsd_string(ptr, "recordPacking", o,
- &req->recordPacking))
- ;
- else if (match_xsd_integer(ptr, "startRecord", o,
- &req->startRecord))
- ;
- else if (match_xsd_integer(ptr, "maximumRecords", o,
- &req->maximumRecords))
- ;
- else if (match_xsd_string(ptr, "database", o,
- &req->database))
- ;
- /* missing is xQuery, xSortKeys .. */
- }
- }
- else if (!strcmp(method->name, "searchRetrieveResponse"))
- {
- Z_SRW_PDU **p = handler_data;
- xmlNodePtr ptr = method->children;
- Z_SRW_searchRetrieveResponse *res;
-
- *p = odr_malloc(o, sizeof(**p));
- (*p)->which = Z_SRW_searchRetrieve_response;
- res = (*p)->u.response = odr_malloc(o, sizeof(*res));
-
- res->numberOfRecords = 0;
- res->resultSetId = 0;
- res->resultSetIdleTime = 0;
- res->records = 0;
- res->num_records = 0;
- res->diagnostics = 0;
- res->num_diagnostics = 0;
- res->nextRecordPosition = 0;
-
- for (; ptr; ptr = ptr->next)
- {
- if (match_xsd_integer(ptr, "numberOfRecords", o,
- &res->numberOfRecords))
- ;
- else if (match_xsd_string(ptr, "resultSetId", o,
- &res->resultSetId))
- ;
- else if (match_xsd_integer(ptr, "resultSetIdleTime", o,
- &res->resultSetIdleTime))
- ;
- else if (match_element(ptr, "records"))
- yaz_srw_records(o, ptr, &res->records,
- &res->num_records, client_data,
- ns);
- else if (match_element(ptr, "diagnostics"))
- yaz_srw_diagnostics(o, ptr, &res->diagnostics,
- &res->num_diagnostics,
- client_data, ns);
- else if (match_xsd_integer(ptr, "nextRecordPosition", o,
- &res->nextRecordPosition))
- ;
- }
- }
- else if (!strcmp(method->name, "explainRequest"))
- {
- Z_SRW_PDU **p = handler_data;
- Z_SRW_explainRequest *req;
-
- *p = odr_malloc(o, sizeof(**p));
- (*p)->which = Z_SRW_explain_request;
- req = (*p)->u.explain_request = odr_malloc(o, sizeof(*req));
- req->dummy = 0;
- }
- else if (!strcmp(method->name, "explainResponse"))
- {
- Z_SRW_PDU **p = handler_data;
- Z_SRW_explainResponse *res;
- xmlNodePtr ptr = method->children;
-
- *p = odr_malloc(o, sizeof(**p));
- (*p)->which = Z_SRW_explain_response;
- res = (*p)->u.explain_response = odr_malloc(o, sizeof(*res));
- res->explainData_buf = 0;
- res->explainData_len = 0;
- res->explainPacking = Z_SRW_recordPacking_string;
- for (; ptr; ptr = ptr->next)
- {
- match_xsd_string_n(ptr, "Explain", o,
- &res->explainData_buf,
- &res->explainData_len);
- }
- }
- else
- return -1;
-
- }
- else if (o->direction == ODR_ENCODE)
- {
- Z_SRW_PDU **p = handler_data;
- if ((*p)->which == Z_SRW_searchRetrieve_request)
- {
- Z_SRW_searchRetrieveRequest *req = (*p)->u.request;
- xmlNodePtr ptr = xmlNewChild(pptr, 0,
- "searchRetrieveRequest", 0);
- xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
-
- xmlSetNs(ptr, ns_srw);
-
- switch(req->query_type)
- {
- case Z_SRW_query_type_cql:
- add_xsd_string(ptr, "query", req->query.cql);
- break;
- case Z_SRW_query_type_xcql:
- add_xsd_string(ptr, "xQuery", req->query.xcql);
- break;
- case Z_SRW_query_type_pqf:
- add_xsd_string(ptr, "pQuery", req->query.pqf);
- break;
- }
- switch(req->sort_type)
- {
- case Z_SRW_sort_type_none:
- break;
- case Z_SRW_sort_type_sort:
- add_xsd_string(ptr, "sortKeys", req->sort.sortKeys);
- break;
- case Z_SRW_sort_type_xSort:
- add_xsd_string(ptr, "xSortKeys", req->sort.xSortKeys);
- break;
- }
- add_xsd_integer(ptr, "startRecord", req->startRecord);
- add_xsd_integer(ptr, "maximumRecords", req->maximumRecords);
- add_xsd_string(ptr, "recordSchema", req->recordSchema);
- add_xsd_string(ptr, "recordPacking", req->recordPacking);
- add_xsd_string(ptr, "database", req->database);
- }
- else if ((*p)->which == Z_SRW_searchRetrieve_response)
- {
- Z_SRW_searchRetrieveResponse *res = (*p)->u.response;
- xmlNodePtr ptr = xmlNewChild(pptr, 0,
- "searchRetrieveResponse", 0);
- xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
-
- xmlSetNs(ptr, ns_srw);
- add_xsd_integer(ptr, "numberOfRecords", res->numberOfRecords);
- add_xsd_string(ptr, "resultSetId", res->resultSetId);
- add_xsd_integer(ptr, "resultSetIdleTime", res->resultSetIdleTime);
- if (res->num_records)
- {
- xmlNodePtr rptr = xmlNewChild(ptr, 0, "records", 0);
- yaz_srw_records(o, rptr, &res->records, &res->num_records,
- client_data, ns);
- }
- if (res->num_diagnostics)
- {
- xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0);
- yaz_srw_diagnostics(o, rptr, &res->diagnostics,
- &res->num_diagnostics, client_data, ns);
- }
- add_xsd_integer(ptr, "nextRecordPosition", res->nextRecordPosition);
- }
- else if ((*p)->which == Z_SRW_explain_request)
- {
- xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainRequest", 0);
- xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
-
- xmlSetNs(ptr, ns_srw);
- }
- else if ((*p)->which == Z_SRW_explain_response)
- {
- Z_SRW_explainResponse *res = (*p)->u.explain_response;
- xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainResponse", 0);
- xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
-
- xmlSetNs(ptr, ns_srw);
-
- add_xsd_string_n(ptr, "Explain", res->explainData_buf,
- res->explainData_len);
- }
- else
- return -1;
-
- }
- return 0;
-}
-
-Z_SRW_PDU *yaz_srw_get(ODR o, int which)
-{
- Z_SRW_PDU *sr = odr_malloc(o, sizeof(*o));
- sr->which = which;
- switch(which)
- {
- case Z_SRW_searchRetrieve_request:
- sr->u.request = (Z_SRW_searchRetrieveRequest *)
- odr_malloc(o, sizeof(*sr->u.request));
- sr->u.request->query_type = Z_SRW_query_type_cql;
- sr->u.request->query.cql = 0;
- sr->u.request->sort_type = Z_SRW_sort_type_none;
- sr->u.request->sort.none = 0;
- sr->u.request->startRecord = 0;
- sr->u.request->maximumRecords = 0;
- sr->u.request->recordSchema = 0;
- sr->u.request->recordPacking = 0;
- sr->u.request->database = 0;
- break;
- case Z_SRW_searchRetrieve_response:
- sr->u.response = (Z_SRW_searchRetrieveResponse *)
- odr_malloc(o, sizeof(*sr->u.response));
- sr->u.response->numberOfRecords = 0;
- sr->u.response->resultSetId = 0;
- sr->u.response->resultSetIdleTime = 0;
- sr->u.response->records = 0;
- sr->u.response->num_records = 0;
- sr->u.response->diagnostics = 0;
- sr->u.response->num_diagnostics = 0;
- sr->u.response->nextRecordPosition = 0;
- break;
- case Z_SRW_explain_request:
- sr->u.explain_request = (Z_SRW_explainRequest *)
- odr_malloc(o, sizeof(*sr->u.explain_request));
- sr->u.explain_request->dummy = 0;
- break;
- case Z_SRW_explain_response:
- sr->u.explain_response = (Z_SRW_explainResponse *)
- odr_malloc(o, sizeof(*sr->u.explain_response));
- sr->u.explain_response->explainPacking = 0;
- sr->u.explain_response->explainData_buf = 0;
- sr->u.explain_response->explainData_len = 0;
- }
- return sr;
-}
-
-#endif
-
-
-static struct {
- int code;
- const char *msg;
-} yaz_srw_codes [] = {
-{1, "Permanent system error"},
-{2, "System temporarily unavailable"},
-{3, "Authentication error"},
-/* Diagnostics Relating to CQL */
-{10, "Illegal query"},
-{11, "Unsupported query type (XCQL vs CQL)"},
-{12, "Too many characters in query"},
-{13, "Unbalanced or illegal use of parentheses"},
-{14, "Unbalanced or illegal use of quotes"},
-{15, "Illegal or unsupported index set"},
-{16, "Illegal or unsupported index"},
-{17, "Illegal or unsupported combination of index and index set"},
-{18, "Illegal or unsupported combination of indexes"},
-{19, "Illegal or unsupported relation"},
-{20, "Illegal or unsupported relation modifier"},
-{21, "Illegal or unsupported combination of relation modifers"},
-{22, "Illegal or unsupported combination of relation and index"},
-{23, "Too many characters in term"},
-{24, "Illegal combination of relation and term"},
-{25, "Special characters not quoted in term"},
-{26, "Non special character escaped in term"},
-{27, "Empty term unsupported"},
-{28, "Masking character not supported"},
-{29, "Masked words too short"},
-{30, "Too many masking characters in term"},
-{31, "Anchoring character not supported"},
-{32, "Anchoring character in illegal or unsupported position"},
-{33, "Combination of proximity/adjacency and masking characters not supported"},
-{34, "Combination of proximity/adjacency and anchoring characters not supported"},
-{35, "Terms only exclusion (stop) words"},
-{36, "Term in invalid format for index or relation"},
-{37, "Illegal or unsupported boolean operator"},
-{38, "Too many boolean operators in query"},
-{39, "Proximity not supported"},
-{40, "Illegal or unsupported proximity relation"},
-{41, "Illegal or unsupported proximity distance"},
-{42, "Illegal or unsupported proximity unit"},
-{43, "Illegal or unsupported proximity ordering"},
-{44, "Illegal or unsupported combination of proximity modifiers"},
-{45, "Index set name (prefix) assigned to multiple identifiers"},
-/* Diagnostics Relating to Result Sets */
-{50, "Result sets not supported"},
-{51, "Result set does not exist"},
-{52, "Result set temporarily unavailable"},
-{53, "Result sets only supported for retrieval"},
-{54, "Retrieval may only occur from an existing result set"},
-{55, "Combination of result sets with search terms not supported"},
-{56, "Only combination of single result set with search terms supported"},
-{57, "Result set created but no records available"},
-{58, "Result set created with unpredictable partial results available"},
-{59, "Result set created with valid partial results available"},
-/* Diagnostics Relating to Records */
-{60, "Too many records retrieved"},
-{61, "First record position out of range"},
-{62, "Negative number of records requested"},
-{63, "System error in retrieving records"},
-{64, "Record temporarily unavailable"},
-{65, "Record does not exist"},
-{66, "Unknown schema for retrieval"},
-{67, "Record not available in this schema"},
-{68, "Not authorised to send record"},
-{69, "Not authorised to send record in this schema"},
-{70, "Record too large to send"},
-/* Diagnostics Relating to Sorting */
-{80, "Sort not supported"},
-{81, "Unsupported sort type (sortKeys vs xSortKeys)"},
-{82, "Illegal or unsupported sort sequence"},
-{83, "Too many records"},
-{84, "Too many sort keys"},
-{85, "Duplicate sort keys"},
-{86, "Incompatible record formats"},
-{87, "Unsupported schema for sort"},
-{88, "Unsupported tag path for sort"},
-{89, "Tag path illegal or unsupported for schema"},
-{90, "Illegal or unsupported direction value"},
-{91, "Illegal or unsupported case value"},
-{92, "Illegal or unsupported missing value action"},
-/* Diagnostics Relating to Explain */
-{100, "Explain not supported"},
-{101, "Explain request type not supported (SOAP vs GET)"},
-{102, "Explain record temporarily unavailable"},
-{0, 0}
-};
-
-const char *yaz_diag_srw_str (int code)
-{
- int i;
- for (i = 0; yaz_srw_codes[i].code; i++)
- if (yaz_srw_codes[i].code == code)
- return yaz_srw_codes[i].msg;
- return 0;
-}
-
-
-/* bib1:srw */
-static int srw_bib1_map[] = {
- 1, 1,
- 2, 2,
- 3, 11,
- 4, 35,
- 5, 12,
- 6, 38,
- 7, 30,
- 8, 32,
- 9, 29,
- 10, 10,
- 11, 12,
- 11, 23,
- 12, 60,
- 13, 61,
- 13, 62,
- 14, 63,
- 14, 64,
- 14, 65,
- 15, 68,
- 15, 69,
- 16, 70,
- 17, 70,
- 18, 50,
- 19, 55,
- 20, 56,
- 21, 52,
- 22, 50,
- 23, 1, /* bad map */
- 24, 63, /* bad map */
- 25, 63, /* bad map */
- 26, 63, /* bad map */
- 27, 51,
- 28, 52,
- 29, 52,
- 30, 51,
- 31, 57,
- 32, 58,
- 33, 59,
- 100, 1, /* bad map */
- 101, 3,
- 102, 3,
- 103, 3,
- 104, 3,
- 105, 3,
- 106, 66,
- 107, 11,
- 108, 10,
- 108, 13,
- 108, 14,
- 108, 25,
- 108, 26,
- 108, 27,
- 108, 45,
-
- 109, 1,
- 110, 37,
- 111, 1,
- 112, 58,
- 113, 10,
- 114, 16,
- 115, 16,
- 116, 16,
- 117, 19,
- 118, 22,
- 119, 32,
- 119, 31,
- 120, 28,
- 121, 15,
- 122, 32,
- 123, 22,
- 123, 17,
- 123, 18,
- 124, 24,
- 125, 36,
- 126, 36,
- 127, 36,
- 128, 51,
- 129, 39,
- 130, 43,
- 131, 40,
- 132, 42,
- 201, 44,
- 201, 33,
- 201, 34,
- 202, 41,
- 203, 43,
- 205, 1, /* bad map */
- 206, 1, /* bad map */
- 207, 89,
- 208, 1, /* bad map */
- 209, 80,
- 210, 80,
- 210, 81,
- 211, 84,
- 212, 85,
- 213, 92,
- 214, 90,
- 215, 91,
- 216, 92,
- 217, 63,
- 218, 1, /* bad map */
- 219, 1, /* bad map */
- 220, 1, /* bad map */
- 221, 1, /* bad map */
- 222, 1, /* bad map */
- 223, 1, /* bad map */
- 224, 1, /* bad map */
- 225, 1, /* bad map */
- 226, 1, /* bad map */
- 227, 66,
- 228, 1, /* bad map */
- 229, 36,
- 230, 83,
- 231, 89,
- 232, 1,
- 233, 1, /* bad map */
- 234, 1, /* bad map */
- 235, 2,
- 236, 3,
- 237, 82,
- 238, 67,
- 239, 66,
- 240, 1, /* bad map */
- 241, 1, /* bad map */
- 242, 70,
- 243, 1, /* bad map */
- 244, 66,
- 245, 10,
- 246, 10,
- 247, 10,
- 1001, 1, /* bad map */
- 1002, 1, /* bad map */
- 1003, 1, /* bad map */
- 1004, 1, /* bad map */
- 1005, 1, /* bad map */
- 1006, 1, /* bad map */
- 1007, 100,
- 1008, 1,
- 1009, 1,
- 1010, 3,
- 1011, 3,
- 1012, 3,
- 1013, 3,
- 1014, 3,
- 1015, 3,
- 1015, 3,
- 1016, 3,
- 1017, 3,
- 1018, 2,
- 1019, 2,
- 1020, 2,
- 1021, 3,
- 1022, 3,
- 1023, 3,
- 1024, 16,
- 1025, 3,
- 1026, 64,
- 1027, 1,
- 1028, 65,
- 1029, 1,
- 1040, 1,
- /* 1041-1065 */
- 1066, 66,
- 1066, 67,
- 0
-};
-
-int yaz_diag_bib1_to_srw (int code)
-{
- const int *p = srw_bib1_map;
- while (*p)
- {
- if (code == p[0])
- return p[1];
- p += 2;
- }
- return 1;
-}
-
-int yaz_diag_srw_to_bib1(int code)
-{
- const int *p = srw_bib1_map;
- while (*p)
- {
- if (code == p[1])
- return p[0];
- p += 2;
- }
- return 1;
-}
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: srwtst.c,v 1.5 2003-03-03 19:57:37 adam Exp $
- */
-
-#include <yaz/srw.h>
-
-#if HAVE_XML2
-Z_SOAP_Handler h[2] = {
- {"http://www.loc.gov/zing/srw/v1.0/", 0, (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
-};
-
-int main(int argc, char **argv)
-{
- char buf[163840];
- char *content_buf = buf;
- int content_len;
- int ret;
- size_t no;
- Z_SOAP *soap_package = 0;
- ODR decode, encode;
- int debug = 0;
-
- nmem_init();
- if (argc == 2 && !strcmp(argv[1], "debug"))
- debug = 1;
- no = fread(buf, 1, sizeof(buf), stdin);
- if (no < 1 || no == sizeof(buf))
- {
- fprintf(stderr, "Bad file or too big\n");
- exit (1);
- }
- decode = odr_createmem(ODR_DECODE);
- encode = odr_createmem(ODR_ENCODE);
- content_len = no;
- ret = z_soap_codec(decode, &soap_package,
- &content_buf, &content_len, h);
- if (!soap_package)
- {
- fprintf(stderr, "Decoding seriously failed\n");
- exit(1);
- }
- if (debug)
- {
- fprintf(stderr, "got NS = %s\n", soap_package->ns);
- if (soap_package->which == Z_SOAP_generic &&
- soap_package->u.generic->no == 0)
- {
- Z_SRW_PDU *sr = soap_package->u.generic->p;
- if (sr->which == Z_SRW_searchRetrieve_request)
- {
- Z_SRW_searchRetrieveRequest *req = sr->u.request;
- switch(req->query_type)
- {
- case Z_SRW_query_type_cql:
- fprintf(stderr, "CQL: %s\n", req->query.cql);
- break;
- case Z_SRW_query_type_xcql:
- fprintf(stderr, "XCQL\n");
- break;
- case Z_SRW_query_type_pqf:
- fprintf(stderr, "PQF: %s\n", req->query.pqf);
- break;
- }
- }
- else if (sr->which == Z_SRW_searchRetrieve_response)
- {
- Z_SRW_searchRetrieveResponse *res = sr->u.response;
- if (res->records && res->num_records)
- {
- int i;
- for (i = 0; i<res->num_records; i++)
- {
- fprintf (stderr, "%d\n", i);
- if (res->records[i].recordData_buf)
- fwrite(res->records[i].recordData_buf, 1,
- res->records[i].recordData_len, stderr);
- }
- }
- }
-
- }
- }
- ret = z_soap_codec(encode, &soap_package,
- &content_buf, &content_len, h);
- if (content_buf && content_len)
- fwrite (content_buf, content_len, 1, stdout);
- else
- {
- fprintf(stderr, "No output!\n");
- exit(1);
- }
- odr_destroy(decode);
- odr_destroy(encode);
- nmem_exit();
- exit(0);
-}
-#else
-int main(int argc, char **argv)
-{
- fprintf(stderr, "SOAP disabled\n");
- exit(1);
-}
-#endif
+++ /dev/null
-/*
- * Copyright (c) 1996-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: yaz-ccl.c,v 1.23 2003-06-24 23:03:04 adam Exp $
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <yaz/yaz-ccl.h>
-#include <yaz/pquery.h>
-
-Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
-{
- YAZ_PQF_Parser parser = yaz_pqf_create();
- WRBUF wr = wrbuf_alloc();
- Z_RPNQuery *q;
-
- ccl_pquery(wr, p);
-
- q = yaz_pqf_parse(parser, o, wrbuf_buf(wr));
-
- wrbuf_free(wr, 1);
- yaz_pqf_destroy(parser);
- return q;
-}
-
-Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
-{
- YAZ_PQF_Parser parser = yaz_pqf_create();
- WRBUF wr = wrbuf_alloc();
- Z_AttributesPlusTerm *q;
- Odr_oid *setp;
-
- ccl_pquery(wr, p);
-
- q = yaz_pqf_scan(parser, o, &setp, wrbuf_buf(wr));
-
- wrbuf_free(wr, 1);
- yaz_pqf_destroy(parser);
- return q;
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: z3950oid.c,v 1.5 2003-01-06 08:20:29 adam Exp $
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <yaz/proto.h>
-
-Odr_oid *yaz_oidval_to_z3950oid (ODR o, int oid_class, int oid_value)
-{
- oident ident;
- int oid[OID_SIZE];
-
- ident.proto = PROTO_Z3950;
- ident.oclass = (enum oid_class) oid_class;
- ident.value = (enum oid_value) oid_value;
-
- if (ident.value == VAL_NONE)
- return 0;
-
- return odr_oiddup(o, oid_ent_to_oid(&ident, oid));
-}
-
-Odr_oid *yaz_str_to_z3950oid (ODR o, int oid_class, const char *str)
-{
- struct oident ident;
- int oid[OID_SIZE];
-
- ident.proto = PROTO_Z3950;
- ident.oclass = (enum oid_class) oid_class;
- ident.value = oid_getvalbyname(str);
-
- if (ident.value == VAL_NONE)
- return 0;
-
- return odr_oiddup(o, oid_ent_to_oid(&ident, oid));
-}
-
-const char *yaz_z3950oid_to_str (Odr_oid *oid, int *oid_class)
-{
- struct oident *ident = oid_getentbyoid(oid);
-
- if (!ident || ident->value == VAL_NONE)
- return 0;
- *oid_class = ident->oclass;
- return ident->desc;
-}
-
-
-const char* yaz_z3950_oid_value_to_str(oid_value ov, oid_class oc)
-{
- struct oident tmpentry;
- int tmp_oid[OID_SIZE];
-
- tmpentry.proto = PROTO_Z3950;
- tmpentry.oclass = oc;
- tmpentry.value = ov;
-
- if( oid_ent_to_oid(&tmpentry,tmp_oid) )
- {
- return tmpentry.desc;
- }
- else
- {
- return "";
- }
-}
-
-
-/*
- * Local variables:
- * tab-width: 8
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=8 fdm=marker
- * vim<600: sw=4 ts=8
- */
+++ /dev/null
-/*
- * Copyright (c) 2002-2003, Index Data.
- * See the file LICENSE for details.
- *
- * $Id: zgdu.c,v 1.9 2003-03-11 11:09:17 adam Exp $
- */
-
-#include <yaz/odr.h>
-#include <yaz/yaz-version.h>
-#include <yaz/zgdu.h>
-
-static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
- char **content_buf, int *content_len)
-{
- int i = off;
-
- *headers = 0;
- while (i < o->size-1 && o->buf[i] == '\r')
- {
- int po;
- i++;
- if (o->buf[i] != '\n')
- {
- o->error = OHTTP;
- return 0;
- }
- i++;
- if (o->buf[i] == '\r')
- break;
- for (po = i; ; i++)
- {
- if (i == o->size)
- {
- o->error = OHTTP;
- return 0;
- }
- else if (o->buf[i] == ':')
- break;
- }
- *headers = (Z_HTTP_Header *) odr_malloc(o, sizeof(**headers));
- (*headers)->name = (char*) odr_malloc(o, i - po + 1);
- memcpy ((*headers)->name, o->buf + po, i - po);
- (*headers)->name[i - po] = '\0';
- i++;
- while (i < o->size-1 && o->buf[i] == ' ')
- i++;
- for (po = i; i < o->size-1 && o->buf[i] != '\r' ; i++)
- ;
-
- (*headers)->value = (char*) odr_malloc(o, i - po + 1);
- memcpy ((*headers)->value, o->buf + po, i - po);
- (*headers)->value[i - po] = '\0';
-
- headers = &(*headers)->next;
- }
- *headers = 0;
- i++;
- if (o->buf[i] != '\n')
- {
- o->error = OHTTP;
- return 0;
- }
- i++;
-
- if (i > o->size)
- {
- o->error = OHTTP;
- return 0;
- }
- else if (i == o->size)
- {
- *content_buf = 0;
- *content_len = 0;
- }
- else
- {
- *content_len = o->size - i;
- *content_buf = (char*) odr_malloc(o, *content_len + 1);
- memcpy(*content_buf, o->buf + i, *content_len);
- (*content_buf)[*content_len] = '\0';
- }
- return 1;
-}
-
-void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n,
- const char *v)
-{
- while (*hp)
- hp = &(*hp)->next;
- *hp = (Z_HTTP_Header *) odr_malloc(o, sizeof(**hp));
- (*hp)->name = odr_strdup(o, n);
- (*hp)->value = odr_strdup(o, v);
- (*hp)->next = 0;
-}
-
-const char *z_HTTP_header_lookup(Z_HTTP_Header *hp, const char *n)
-{
- for (; hp; hp = hp->next)
- if (!strcmp(hp->name, n))
- return hp->value;
- return 0;
-}
-
-
-Z_GDU *z_get_HTTP_Request(ODR o)
-{
- Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p));
- Z_HTTP_Request *hreq;
-
- p->which = Z_GDU_HTTP_Request;
- p->u.HTTP_Request = (Z_HTTP_Request *) odr_malloc(o, sizeof(*hreq));
- hreq = p->u.HTTP_Request;
- hreq->headers = 0;
- hreq->content_len = 0;
- hreq->content_buf = 0;
- hreq->version = "1.1";
- hreq->method = "POST";
- hreq->path = "/";
- z_HTTP_header_add(o, &hreq->headers, "User-Agent",
- "YAZ/" YAZ_VERSION);
- return p;
-}
-
-Z_GDU *z_get_HTTP_Response(ODR o, int code)
-{
- Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p));
- Z_HTTP_Response *hres;
-
- p->which = Z_GDU_HTTP_Response;
- p->u.HTTP_Response = (Z_HTTP_Response *) odr_malloc(o, sizeof(*hres));
- hres = p->u.HTTP_Response;
- hres->headers = 0;
- hres->content_len = 0;
- hres->content_buf = 0;
- hres->code = code;
- hres->version = "1.1";
- z_HTTP_header_add(o, &hres->headers, "Server",
- "YAZ/" YAZ_VERSION);
- if (code != 200)
- {
- hres->content_buf = (char*) odr_malloc(o, 400);
- sprintf (hres->content_buf,
- "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
- "<HTML>\n"
- " <HEAD>\n"
- " <TITLE>YAZ " YAZ_VERSION "</TITLE>\n"
- " </HEAD>\n"
- " <BODY>\n"
- " <P><A HREF=\"http://www.indexdata.dk/yaz/\">YAZ</A> "
- YAZ_VERSION "</P>\n"
- " <P>Error: %d</P>\n"
- " <P>Description: %.50s</P>\n"
- " </BODY>\n"
- "</HTML>\n",
- code, z_HTTP_errmsg(code));
- hres->content_len = strlen(hres->content_buf);
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
- }
- return p;
-}
-
-const char *z_HTTP_errmsg(int code)
-{
- if (code == 200)
- return "OK";
- else if (code == 400)
- return "Bad Request";
- else if (code == 404)
- return "Not Found";
- else if (code == 405)
- return "Method Not Allowed";
- else if (code == 500)
- return "Internal Error";
- else
- return "Unknown Error";
-}
-
-int z_GDU (ODR o, Z_GDU **p, int opt, const char *name)
-{
- if (o->direction == ODR_DECODE) {
- *p = (Z_GDU *) odr_malloc(o, sizeof(**p));
- if (o->size > 10 && !memcmp(o->buf, "HTTP/", 5))
- {
- int i, po;
- Z_HTTP_Response *hr;
- (*p)->which = Z_GDU_HTTP_Response;
-
- hr = (*p)->u.HTTP_Response = (Z_HTTP_Response *)
- odr_malloc(o, sizeof(*hr));
- po = i = 5;
- while (i < o->size-2 && o->buf[i] != ' ' && o->buf[i] != '\r')
- i++;
- hr->version = (char *) odr_malloc(o, i - po + 1);
- if (i - po)
- memcpy(hr->version, o->buf + po, i - po);
- hr->version[i-po] = 0;
- if (o->buf[i] != ' ')
- {
- o->error = OHTTP;
- return 0;
- }
- i++;
- hr->code = 0;
- while (i < o->size-2 && o->buf[i] >= '0' && o->buf[i] <= '9')
- {
- hr->code = hr->code*10 + (o->buf[i] - '0');
- i++;
- }
- while (i < o->size-1 && o->buf[i] != '\r')
- i++;
- return decode_headers_content(o, i, &hr->headers,
- &hr->content_buf, &hr->content_len);
- }
- else if (o->size > 5 &&
- o->buf[0] >= 0x20 && o->buf[0] < 0x7f
- && o->buf[1] >= 0x20 && o->buf[1] < 0x7f
- && o->buf[2] >= 0x20 && o->buf[2] < 0x7f
- && o->buf[3] >= 0x20 && o->buf[3] < 0x7f)
- {
- int i, po;
- Z_HTTP_Request *hr;
-
- (*p)->which = Z_GDU_HTTP_Request;
- hr = (*p)->u.HTTP_Request =
- (Z_HTTP_Request *) odr_malloc(o, sizeof(*hr));
-
- /* method .. */
- for (i = 0; o->buf[i] != ' '; i++)
- if (i >= o->size-5 || i > 30)
- {
- o->error = OHTTP;
- return 0;
- }
- hr->method = (char *) odr_malloc(o, i+1);
- memcpy (hr->method, o->buf, i);
- hr->method[i] = '\0';
- /* path */
- po = i+1;
- for (i = po; o->buf[i] != ' '; i++)
- if (i >= o->size-5)
- {
- o->error = OHTTP;
- return 0;
- }
- hr->path = (char *) odr_malloc(o, i - po + 1);
- memcpy (hr->path, o->buf+po, i - po);
- hr->path[i - po] = '\0';
- /* HTTP version */
- i++;
- if (i > o->size-5 || memcmp(o->buf+i, "HTTP/", 5))
- {
- o->error = OHTTP;
- return 0;
- }
- i+= 5;
- po = i;
- while (o->buf[i] != '\r')
- {
- if (i >= o->size-1)
- {
- o->error = OHTTP;
- return 0;
- }
- i++;
- }
- hr->version = (char *) odr_malloc(o, i - po + 1);
- memcpy(hr->version, o->buf + po, i - po);
- hr->version[i - po] = '\0';
- /* headers */
- return decode_headers_content(o, i, &hr->headers,
- &hr->content_buf, &hr->content_len);
-
- }
- else
- {
- (*p)->which = Z_GDU_Z3950;
- return z_APDU(o, &(*p)->u.z3950, opt, 0);
- }
- }
- else /* ENCODE or PRINT */
- {
- int top0 = o->top;
- char sbuf[80];
- Z_HTTP_Header *h;
- switch((*p)->which)
- {
- case Z_GDU_HTTP_Response:
- sprintf(sbuf, "HTTP/%s %d %s\r\n", (*p)->u.HTTP_Response->version,
- (*p)->u.HTTP_Response->code,
- z_HTTP_errmsg((*p)->u.HTTP_Response->code));
- odr_write(o, (unsigned char *) sbuf, strlen(sbuf));
- /* apply Content-Length if not already applied */
- if (!z_HTTP_header_lookup((*p)->u.HTTP_Response->headers,
- "Content-Length"))
- {
- char lstr[20];
- sprintf(lstr, "%d", (*p)->u.HTTP_Response->content_len);
- z_HTTP_header_add(o,
- &(*p)->u.HTTP_Response->headers,
- "Content-Length", lstr);
- }
- for (h = (*p)->u.HTTP_Response->headers; h; h = h->next)
- {
- odr_write(o, (unsigned char *) h->name, strlen(h->name));
- odr_write(o, (unsigned char *) ": ", 2);
- odr_write(o, (unsigned char *) h->value, strlen(h->value));
- odr_write(o, (unsigned char *) "\r\n", 2);
- }
- odr_write(o, (unsigned char *) "\r\n", 2);
- if ((*p)->u.HTTP_Response->content_buf)
- odr_write(o, (unsigned char *)
- (*p)->u.HTTP_Response->content_buf,
- (*p)->u.HTTP_Response->content_len);
- if (o->direction == ODR_PRINT)
- {
- fprintf(o->print, "-- HTTP response:\n%.*s\n", o->top - top0,
- o->buf + top0);
- fprintf(o->print, "-- \n");
- }
- break;
- case Z_GDU_HTTP_Request:
- odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->method,
- strlen((*p)->u.HTTP_Request->method));
- odr_write(o, (unsigned char *) " ", 1);
- odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->path,
- strlen((*p)->u.HTTP_Request->path));
- odr_write(o, (unsigned char *) " HTTP/", 6);
- odr_write(o, (unsigned char *) (*p)->u.HTTP_Request->version,
- strlen((*p)->u.HTTP_Request->version));
- odr_write(o, (unsigned char *) "\r\n", 2);
- if ((*p)->u.HTTP_Request->content_len &&
- !z_HTTP_header_lookup((*p)->u.HTTP_Request->headers,
- "Content-Length"))
- {
- char lstr[20];
- sprintf(lstr, "%d", (*p)->u.HTTP_Request->content_len);
- z_HTTP_header_add(o,
- &(*p)->u.HTTP_Request->headers,
- "Content-Length", lstr);
- }
- for (h = (*p)->u.HTTP_Request->headers; h; h = h->next)
- {
- odr_write(o, (unsigned char *) h->name, strlen(h->name));
- odr_write(o, (unsigned char *) ": ", 2);
- odr_write(o, (unsigned char *) h->value, strlen(h->value));
- odr_write(o, (unsigned char *) "\r\n", 2);
- }
- odr_write(o, (unsigned char *) "\r\n", 2);
- if ((*p)->u.HTTP_Request->content_buf)
- odr_write(o, (unsigned char *)
- (*p)->u.HTTP_Request->content_buf,
- (*p)->u.HTTP_Request->content_len);
- if (o->direction == ODR_PRINT)
- {
- fprintf(o->print, "-- HTTP request:\n%.*s\n", o->top, o->buf);
- }
- break;
- case Z_GDU_Z3950:
- return z_APDU(o, &(*p)->u.z3950, opt, 0);
- }
- }
- return 1;
-}
-
+++ /dev/null
-/*
- * Copyright (c) 1995-2003, Index Data.
- * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: zget.c,v 1.15 2003-10-08 21:48:19 adam Exp $
- */
-
-#include <yaz/proto.h>
-
-Z_InitRequest *zget_InitRequest(ODR o)
-{
- Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
- ODR_MASK_ZERO(r->options);
- r->protocolVersion = (Odr_bitmask *)
- odr_malloc(o, sizeof(*r->protocolVersion));
-
- ODR_MASK_SET(r->options, Z_Options_search);
- ODR_MASK_SET(r->options, Z_Options_present);
-
- ODR_MASK_ZERO(r->protocolVersion);
-
- ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_1);
- ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_2);
-
- r->preferredMessageSize = odr_intdup(o, 30*1024);
- r->maximumRecordSize = odr_intdup(o, 30*1024);
- r->idAuthentication = 0;
- r->implementationId = "81";
- r->implementationName = "Index Data/YAZ";
- r->implementationVersion = YAZ_VERSION
-#ifdef YAZ_DATE_STR
- " (" YAZ_DATE_STR ")"
-#endif
-#ifdef YAZ_OS
- " " YAZ_OS
-#endif
- ;
- r->userInformationField = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_InitResponse *zget_InitResponse(ODR o)
-{
- Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
- ODR_MASK_ZERO(r->options);
- r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
- ODR_MASK_ZERO(r->protocolVersion);
- r->preferredMessageSize = odr_intdup(o, 30*1024);
- r->maximumRecordSize = odr_intdup(o, 30*1024);
- r->result = odr_intdup(o, 1);
- r->implementationId = "81";
- r->implementationName = "Index Data/YAZ";
- r->implementationVersion = YAZ_VERSION
-#ifdef YAZ_DATE_STR
- " (" YAZ_DATE_STR ")"
-#endif
-#ifdef YAZ_OS
- " " YAZ_OS
-#endif
- ;
- r->userInformationField = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_SearchRequest *zget_SearchRequest(ODR o)
-{
- Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->smallSetUpperBound = odr_intdup(o, 0);
- r->largeSetLowerBound = odr_intdup(o, 1);
- r->mediumSetPresentNumber = odr_intdup(o, 0);
- r->replaceIndicator = odr_intdup(o, 1);
- r->resultSetName = "default";
- r->num_databaseNames = 0;
- r->databaseNames = 0;
- r->smallSetElementSetNames = 0;
- r->mediumSetElementSetNames = 0;
- r->preferredRecordSyntax = 0;
- r->query = 0;
- r->additionalSearchInfo = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_SearchResponse *zget_SearchResponse(ODR o)
-{
- Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->resultCount = odr_intdup(o, 0);
- r->numberOfRecordsReturned = odr_intdup(o, 0);
- r->nextResultSetPosition = odr_intdup(o, 0);
- r->searchStatus = odr_intdup(o, 1);
- r->resultSetStatus = 0;
- r->presentStatus = 0;
- r->records = 0;
- r->additionalSearchInfo = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_PresentRequest *zget_PresentRequest(ODR o)
-{
- Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->resultSetId = "default";
- r->resultSetStartPoint = odr_intdup(o, 1);
- r->numberOfRecordsRequested = odr_intdup(o, 10);
- r->num_ranges = 0;
- r->additionalRanges = 0;
- r->recordComposition = 0;
- r->preferredRecordSyntax = 0;
- r->maxSegmentCount = 0;
- r->maxRecordSize = 0;
- r->maxSegmentSize = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_PresentResponse *zget_PresentResponse(ODR o)
-{
- Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->numberOfRecordsReturned = odr_intdup(o, 0);
- r->nextResultSetPosition = odr_intdup(o, 0);
- r->presentStatus = odr_intdup(o, Z_PresentStatus_success);
- r->records = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o)
-{
- Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->deleteFunction = odr_intdup(o, Z_DeleteRequest_list);
- r->num_resultSetList = 0;
- r->resultSetList = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o)
-{
- Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->deleteOperationStatus = odr_intdup(o, Z_DeleteStatus_success);
- r->deleteListStatuses = 0;
- r->numberNotDeleted = 0;
- r->bulkStatuses = 0;
- r->deleteMessage = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ScanRequest *zget_ScanRequest(ODR o)
-{
- Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->num_databaseNames = 0;
- r->databaseNames = 0;
- r->attributeSet = 0;
- r->termListAndStartPoint = 0;
- r->stepSize = 0;
- r->numberOfTermsRequested = odr_intdup(o, 20);
- r->preferredPositionInResponse = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ScanResponse *zget_ScanResponse(ODR o)
-{
- Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->stepSize = 0;
- r->scanStatus = odr_intdup(o, Z_Scan_success);
- r->numberOfEntriesReturned = odr_intdup(o, 0);
- r->positionOfTerm =0;
- r->entries = 0;
- r->attributeSet = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o)
-{
- Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->requestedAction = odr_intdup(o, Z_TriggerResourceCtrl_resourceReport);
- r->prefResourceReportFormat = 0;
- r->resultSetWanted = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o)
-{
- Z_ResourceControlRequest *r = (Z_ResourceControlRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->suspendedFlag = 0;
- r->resourceReport = 0;
- r->partialResultsAvailable = 0;
- r->responseRequired = odr_intdup(o, 0);
- r->triggeredRequestFlag = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o)
-{
- Z_ResourceControlResponse *r = (Z_ResourceControlResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->continueFlag = odr_intdup(o, 1);
- r->resultSetWanted = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_AccessControlRequest *zget_AccessControlRequest(ODR o)
-{
- Z_AccessControlRequest *r = (Z_AccessControlRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->which = Z_AccessRequest_simpleForm;
- r->u.simpleForm = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_AccessControlResponse *zget_AccessControlResponse(ODR o)
-{
- Z_AccessControlResponse *r = (Z_AccessControlResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->which = Z_AccessResponse_simpleForm;
- r->u.simpleForm = 0;
- r->diagnostic = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_Segment *zget_Segment(ODR o)
-{
- Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->numberOfRecordsReturned = odr_intdup(o, 0);
- r->num_segmentRecords = 0;
- r->segmentRecords = (Z_NamePlusRecord **) odr_nullval();
- r->otherInfo = 0;
- return r;
-}
-
-Z_Close *zget_Close(ODR o)
-{
- Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->closeReason = odr_intdup(o, Z_Close_finished);
- r->diagnosticInformation = 0;
- r->resourceReportFormat = 0;
- r->resourceReport = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ResourceReportRequest *zget_ResourceReportRequest(ODR o)
-{
- Z_ResourceReportRequest *r = (Z_ResourceReportRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->opId = 0;
- r->prefResourceReportFormat = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o)
-{
- Z_ResourceReportResponse *r = (Z_ResourceReportResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->resourceReportStatus = odr_intdup(o, Z_ResourceReportStatus_success);
- r->resourceReport = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_SortRequest *zget_SortRequest(ODR o)
-{
- Z_SortRequest *r = (Z_SortRequest *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->inputResultSetNames = 0;
- r->sortedResultSetName = 0;
- r->sortSequence = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_SortResponse *zget_SortResponse(ODR o)
-{
- Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->sortStatus = odr_intdup(o, Z_SortStatus_success);
- r->resultSetStatus = odr_intdup(o, Z_SortResultSetStatus_empty);
- r->diagnostics = 0;
- r->resultCount = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o)
-{
- Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->function = odr_intdup(o, Z_ExtendedServicesRequest_create);
- r->packageType = 0;
- r->packageName = 0;
- r->userId = 0;
- r->retentionTime = 0;
- r->permissions = 0;
- r->description = 0;
- r->taskSpecificParameters = 0;
- r->waitAction = odr_intdup(o, Z_ExtendedServicesRequest_waitIfPossible);
- r->elements = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o)
-{
- Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->operationStatus = odr_intdup(o, Z_ExtendedServicesResponse_done);
- r->num_diagnostics = 0;
- r->diagnostics = 0;
- r->taskPackage = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_DuplicateDetectionRequest *zget_DuplicateDetectionRequest(ODR o)
-{
- Z_DuplicateDetectionRequest *r = (Z_DuplicateDetectionRequest *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->num_inputResultSetIds = 0;
- r->inputResultSetIds = 0;
- r->outputResultSetName = 0;
- r->applicablePortionOfRecord = 0;
- r->num_duplicateDetectionCriteria = 0;
- r->duplicateDetectionCriteria = 0;
- r->clustering = 0;
- r->num_retentionCriteria = 0;
- r->retentionCriteria = 0;
- r->num_sortCriteria = 0;
- r->sortCriteria = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_DuplicateDetectionResponse *zget_DuplicateDetectionResponse(ODR o)
-{
- Z_DuplicateDetectionResponse *r = (Z_DuplicateDetectionResponse *)
- odr_malloc(o, sizeof(*r));
-
- r->referenceId = 0;
- r->status = odr_intdup(o, Z_DuplicateDetectionResponse_success);
- r->resultSetCount = 0;
- r->num_diagnostics = 0;
- r->diagnostics = 0;
- r->otherInfo = 0;
- return r;
-}
-
-Z_APDU *zget_APDU(ODR o, int which)
-{
- Z_APDU *r = (Z_APDU *)odr_malloc(o, sizeof(*r));
-
- switch (r->which = which)
- {
- case Z_APDU_initRequest:
- r->u.initRequest = zget_InitRequest(o);
- break;
- case Z_APDU_initResponse:
- r->u.initResponse = zget_InitResponse(o);
- break;
- case Z_APDU_searchRequest:
- r->u.searchRequest = zget_SearchRequest(o);
- break;
- case Z_APDU_searchResponse:
- r->u.searchResponse = zget_SearchResponse(o);
- break;
- case Z_APDU_presentRequest:
- r->u.presentRequest = zget_PresentRequest(o);
- break;
- case Z_APDU_presentResponse:
- r->u.presentResponse = zget_PresentResponse(o);
- break;
- case Z_APDU_deleteResultSetRequest:
- r->u.deleteResultSetRequest = zget_DeleteResultSetRequest(o);
- break;
- case Z_APDU_deleteResultSetResponse:
- r->u.deleteResultSetResponse = zget_DeleteResultSetResponse(o);
- break;
- case Z_APDU_scanRequest:
- r->u.scanRequest = zget_ScanRequest(o);
- break;
- case Z_APDU_scanResponse:
- r->u.scanResponse = zget_ScanResponse(o);
- break;
- case Z_APDU_triggerResourceControlRequest:
- r->u.triggerResourceControlRequest =
- zget_TriggerResourceControlRequest(o);
- break;
- case Z_APDU_resourceControlRequest:
- r->u.resourceControlRequest = zget_ResourceControlRequest(o);
- break;
- case Z_APDU_resourceControlResponse:
- r->u.resourceControlResponse = zget_ResourceControlResponse(o);
- break;
- case Z_APDU_segmentRequest:
- r->u.segmentRequest = zget_Segment(o);
- break;
- case Z_APDU_close:
- r->u.close = zget_Close(o);
- break;
- case Z_APDU_accessControlRequest:
- r->u.accessControlRequest = zget_AccessControlRequest(o);
- break;
- case Z_APDU_accessControlResponse:
- r->u.accessControlResponse = zget_AccessControlResponse(o);
- break;
- case Z_APDU_resourceReportRequest:
- r->u.resourceReportRequest = zget_ResourceReportRequest(o);
- break;
- case Z_APDU_resourceReportResponse:
- r->u.resourceReportResponse = zget_ResourceReportResponse(o);
- break;
- case Z_APDU_sortRequest:
- r->u.sortRequest = zget_SortRequest(o);
- break;
- case Z_APDU_sortResponse:
- r->u.sortResponse = zget_SortResponse(o);
- break;
- case Z_APDU_extendedServicesRequest:
- r->u.extendedServicesRequest = zget_ExtendedServicesRequest(o);
- break;
- case Z_APDU_extendedServicesResponse:
- r->u.extendedServicesResponse = zget_ExtendedServicesResponse(o);
- break;
- case Z_APDU_duplicateDetectionRequest:
- r->u.duplicateDetectionRequest = zget_DuplicateDetectionRequest(o);
- break;
- case Z_APDU_duplicateDetectionResponse:
- r->u.duplicateDetectionResponse = zget_DuplicateDetectionResponse(o);
- break;
- default:
- fprintf(stderr, "Bad APDU-type to zget_APDU");
- exit(1);
- }
- return r;
-}
+++ /dev/null
-/*
- * Copyright (c) 2000-2003, Index Data
- * See the file LICENSE for details.
- *
- * $Id: zoom-c.c,v 1.41 2003-08-19 12:32:29 adam Exp $
- *
- * ZOOM layer for C, connections, result sets, queries.
- */
-#include <assert.h>
-#include <string.h>
-#include "zoom-p.h"
-
-#include <yaz/yaz-util.h>
-#include <yaz/xmalloc.h>
-#include <yaz/otherinfo.h>
-#include <yaz/log.h>
-#include <yaz/pquery.h>
-#include <yaz/marcdisp.h>
-#include <yaz/diagbib1.h>
-#include <yaz/charneg.h>
-#include <yaz/ill.h>
-#include <yaz/srw.h>
-
-#if HAVE_SYS_POLL_H
-#include <sys/poll.h>
-#endif
-
-typedef enum {
- zoom_pending,
- zoom_complete
-} zoom_ret;
-
-static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
-static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
-
-static ZOOM_Event ZOOM_Event_create (int kind)
-{
- ZOOM_Event event = (ZOOM_Event) xmalloc (sizeof(*event));
- event->kind = kind;
- event->next = 0;
- event->prev = 0;
- return event;
-}
-
-static void ZOOM_Event_destroy (ZOOM_Event event)
-{
- xfree (event);
-}
-
-static void ZOOM_connection_put_event (ZOOM_connection c, ZOOM_Event event)
-{
- if (c->m_queue_back)
- {
- c->m_queue_back->prev = event;
- assert (c->m_queue_front);
- }
- else
- {
- assert (!c->m_queue_front);
- c->m_queue_front = event;
- }
- event->next = c->m_queue_back;
- event->prev = 0;
- c->m_queue_back = event;
-}
-
-static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c)
-{
- ZOOM_Event event = c->m_queue_front;
- if (!event)
- {
- c->last_event = ZOOM_EVENT_NONE;
- return 0;
- }
- assert (c->m_queue_back);
- c->m_queue_front = event->prev;
- if (c->m_queue_front)
- {
- assert (c->m_queue_back);
- c->m_queue_front->next = 0;
- }
- else
- c->m_queue_back = 0;
- c->last_event = event->kind;
- return event;
-}
-
-
-static void set_dset_error (ZOOM_connection c, int error,
- const char *dset,
- const char *addinfo, const char *addinfo2)
-{
- xfree (c->addinfo);
- c->addinfo = 0;
- c->error = error;
- c->diagset = dset;
- if (addinfo && addinfo2)
- {
- c->addinfo = xmalloc(strlen(addinfo) + strlen(addinfo2) + 2);
- strcpy(c->addinfo, addinfo);
- strcat(c->addinfo, addinfo2);
- }
- else if (addinfo)
- c->addinfo = xstrdup(addinfo);
- if (error)
- yaz_log(LOG_DEBUG, "Error %s %s:%d %s %s",
- c->host_port ? c->host_port : "<>", dset, error,
- addinfo ? addinfo : "",
- addinfo2 ? addinfo2 : "");
-}
-
-#if HAVE_XML2
-static void set_HTTP_error (ZOOM_connection c, int error,
- const char *addinfo, const char *addinfo2)
-{
- set_dset_error(c, error, "HTTP", addinfo, addinfo2);
-}
-#endif
-
-static void set_ZOOM_error (ZOOM_connection c, int error,
- const char *addinfo)
-{
- set_dset_error(c, error, "ZOOM", addinfo, 0);
-}
-
-static void clear_error (ZOOM_connection c)
-{
-
- switch (c->error)
- {
- case ZOOM_ERROR_CONNECT:
- case ZOOM_ERROR_MEMORY:
- case ZOOM_ERROR_DECODE:
- case ZOOM_ERROR_CONNECTION_LOST:
- case ZOOM_ERROR_INIT:
- case ZOOM_ERROR_INTERNAL:
- case ZOOM_ERROR_UNSUPPORTED_PROTOCOL:
- break;
- default:
- set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
- }
-}
-
-ZOOM_task ZOOM_connection_add_task (ZOOM_connection c, int which)
-{
- ZOOM_task *taskp = &c->tasks;
- while (*taskp)
- taskp = &(*taskp)->next;
- *taskp = (ZOOM_task) xmalloc (sizeof(**taskp));
- (*taskp)->running = 0;
- (*taskp)->which = which;
- (*taskp)->next = 0;
- clear_error (c);
- return *taskp;
-}
-
-ZOOM_task ZOOM_connection_insert_task (ZOOM_connection c, int which)
-{
- ZOOM_task task = (ZOOM_task) xmalloc (sizeof(*task));
-
- task->next = c->tasks;
- c->tasks = task;
-
- task->running = 0;
- task->which = which;
- clear_error (c);
- return task;
-}
-
-void ZOOM_connection_remove_task (ZOOM_connection c)
-{
- ZOOM_task task = c->tasks;
-
- if (task)
- {
- c->tasks = task->next;
- switch (task->which)
- {
- case ZOOM_TASK_SEARCH:
-
- ZOOM_resultset_destroy (task->u.search.resultset);
- break;
- case ZOOM_TASK_RETRIEVE:
- ZOOM_resultset_destroy (task->u.retrieve.resultset);
- break;
- case ZOOM_TASK_CONNECT:
- break;
- case ZOOM_TASK_SCAN:
- ZOOM_scanset_destroy (task->u.scan.scan);
- break;
- case ZOOM_TASK_PACKAGE:
- ZOOM_package_destroy (task->u.package);
- break;
- default:
- assert (0);
- }
- xfree (task);
- }
-}
-
-static int ZOOM_connection_exec_task (ZOOM_connection c);
-
-void ZOOM_connection_remove_tasks (ZOOM_connection c)
-{
- while (c->tasks)
- ZOOM_connection_remove_task(c);
-}
-
-static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos);
-
-ZOOM_API(ZOOM_connection)
-ZOOM_connection_create (ZOOM_options options)
-{
- ZOOM_connection c = (ZOOM_connection) xmalloc (sizeof(*c));
-
- c->proto = PROTO_Z3950;
- c->cs = 0;
- c->mask = 0;
- c->reconnect_ok = 0;
- c->state = STATE_IDLE;
- c->addinfo = 0;
- set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
- c->buf_in = 0;
- c->len_in = 0;
- c->buf_out = 0;
- c->len_out = 0;
- c->resultsets = 0;
-
- c->options = ZOOM_options_create_with_parent(options);
-
- c->host_port = 0;
- c->path = 0;
- c->proxy = 0;
-
- c->charset = c->lang = 0;
-
- c->cookie_out = 0;
- c->cookie_in = 0;
- c->client_IP = 0;
- c->tasks = 0;
-
- c->odr_in = odr_createmem (ODR_DECODE);
- c->odr_out = odr_createmem (ODR_ENCODE);
-
- c->async = 0;
- c->support_named_resultsets = 0;
- c->last_event = ZOOM_EVENT_NONE;
-
- c->m_queue_front = 0;
- c->m_queue_back = 0;
- return c;
-}
-
-/* set database names. Take local databases (if set); otherwise
- take databases given in ZURL (if set); otherwise use Default */
-static char **set_DatabaseNames (ZOOM_connection con, ZOOM_options options,
- int *num)
-{
- char **databaseNames;
- const char *c;
- int no = 2;
- const char *cp = ZOOM_options_get (options, "databaseName");
-
- if (!cp || !*cp)
- {
- if (strncmp (con->host_port, "unix:", 5) == 0)
- cp = strchr (con->host_port+5, ':');
- else
- cp = strchr (con->host_port, '/');
- if (cp)
- cp++;
- }
- if (cp)
- {
- c = cp;
- while ((c = strchr(c, '+')))
- {
- c++;
- no++;
- }
- }
- else
- cp = "Default";
- databaseNames = (char**)
- odr_malloc (con->odr_out, no * sizeof(*databaseNames));
- no = 0;
- while (*cp)
- {
- c = strchr (cp, '+');
- if (!c)
- c = cp + strlen(cp);
- else if (c == cp)
- {
- cp++;
- continue;
- }
- /* cp ptr to first char of db name, c is char
- following db name */
- databaseNames[no] = (char*) odr_malloc (con->odr_out, 1+c-cp);
- memcpy (databaseNames[no], cp, c-cp);
- databaseNames[no++][c-cp] = '\0';
- cp = c;
- if (*cp)
- cp++;
- }
- databaseNames[no] = NULL;
- *num = no;
- return databaseNames;
-}
-
-ZOOM_API(ZOOM_connection)
-ZOOM_connection_new (const char *host, int portnum)
-{
- ZOOM_connection c = ZOOM_connection_create (0);
-
- ZOOM_connection_connect (c, host, portnum);
- return c;
-}
-
-ZOOM_API(void)
-ZOOM_connection_connect(ZOOM_connection c,
- const char *host, int portnum)
-{
- const char *val;
- ZOOM_task task;
-
- if (c->cs)
- {
- yaz_log (LOG_DEBUG, "reconnect");
- c->reconnect_ok = 1;
- return;
- }
- yaz_log(LOG_DEBUG, "connect");
- xfree (c->proxy);
- val = ZOOM_options_get (c->options, "proxy");
- if (val && *val)
- c->proxy = xstrdup (val);
- else
- c->proxy = 0;
-
- xfree (c->charset);
- val = ZOOM_options_get (c->options, "charset");
- if (val && *val)
- c->charset = xstrdup (val);
- else
- c->charset = 0;
-
- xfree (c->lang);
- val = ZOOM_options_get (c->options, "lang");
- if (val && *val)
- c->lang = xstrdup (val);
- else
- c->lang = 0;
-
- xfree (c->host_port);
- if (portnum)
- {
- char hostn[128];
- sprintf (hostn, "%.80s:%d", host, portnum);
- c->host_port = xstrdup(hostn);
- }
- else
- c->host_port = xstrdup(host);
-
- ZOOM_options_set(c->options, "host", c->host_port);
-
- val = ZOOM_options_get (c->options, "cookie");
- if (val && *val)
- c->cookie_out = xstrdup (val);
-
- val = ZOOM_options_get (c->options, "clientIP");
- if (val && *val)
- c->client_IP = xstrdup (val);
-
- c->async = ZOOM_options_get_bool (c->options, "async", 0);
-
- set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
-
- task = ZOOM_connection_add_task (c, ZOOM_TASK_CONNECT);
-
- if (!c->async)
- {
- while (ZOOM_event (1, &c))
- ;
- }
-}
-
-ZOOM_API(ZOOM_query)
-ZOOM_query_create(void)
-{
- ZOOM_query s = (ZOOM_query) xmalloc (sizeof(*s));
-
- s->refcount = 1;
- s->z_query = 0;
- s->sort_spec = 0;
- s->odr = odr_createmem (ODR_ENCODE);
- s->query_string = 0;
-
- return s;
-}
-
-ZOOM_API(void)
-ZOOM_query_destroy(ZOOM_query s)
-{
- if (!s)
- return;
-
- (s->refcount)--;
- yaz_log (LOG_DEBUG, "ZOOM_query_destroy count=%d", s->refcount);
- if (s->refcount == 0)
- {
- odr_destroy (s->odr);
- xfree (s);
- }
-}
-
-ZOOM_API(int)
-ZOOM_query_prefix(ZOOM_query s, const char *str)
-{
- s->query_string = odr_strdup(s->odr, str);
- s->z_query = (Z_Query *) odr_malloc (s->odr, sizeof(*s->z_query));
- s->z_query->which = Z_Query_type_1;
- s->z_query->u.type_1 = p_query_rpn(s->odr, PROTO_Z3950, str);
- if (!s->z_query->u.type_1)
- return -1;
- return 0;
-}
-
-ZOOM_API(int)
-ZOOM_query_cql(ZOOM_query s, const char *str)
-{
- Z_External *ext;
-
- s->query_string = odr_strdup(s->odr, str);
-
- ext = (Z_External *) odr_malloc(s->odr, sizeof(*ext));
- ext->direct_reference = odr_getoidbystr(s->odr, "1.2.840.10003.16.2");
- ext->indirect_reference = 0;
- ext->descriptor = 0;
- ext->which = Z_External_CQL;
- ext->u.cql = s->query_string;
-
- s->z_query = (Z_Query *) odr_malloc (s->odr, sizeof(*s->z_query));
- s->z_query->which = Z_Query_type_104;
- s->z_query->u.type_104 = ext;
-
- return 0;
-}
-
-ZOOM_API(int)
-ZOOM_query_sortby(ZOOM_query s, const char *criteria)
-{
- s->sort_spec = yaz_sort_spec (s->odr, criteria);
- if (!s->sort_spec)
- return -1;
- return 0;
-}
-
-static zoom_ret do_write(ZOOM_connection c);
-
-ZOOM_API(void)
-ZOOM_connection_destroy(ZOOM_connection c)
-{
- ZOOM_resultset r;
- if (!c)
- return;
- if (c->cs)
- cs_close (c->cs);
- for (r = c->resultsets; r; r = r->next)
- r->connection = 0;
-
- xfree (c->buf_in);
- xfree (c->addinfo);
- odr_destroy (c->odr_in);
- odr_destroy (c->odr_out);
- ZOOM_options_destroy (c->options);
- ZOOM_connection_remove_tasks (c);
- xfree (c->host_port);
- xfree (c->path);
- xfree (c->proxy);
- xfree (c->charset);
- xfree (c->lang);
- xfree (c->cookie_out);
- xfree (c->cookie_in);
- xfree (c->client_IP);
- xfree (c);
-}
-
-void ZOOM_resultset_addref (ZOOM_resultset r)
-{
- if (r)
- {
- (r->refcount)++;
- yaz_log (LOG_DEBUG, "ZOOM_resultset_addref r=%p count=%d",
- r, r->refcount);
- }
-}
-ZOOM_resultset ZOOM_resultset_create ()
-{
- ZOOM_resultset r = (ZOOM_resultset) xmalloc (sizeof(*r));
-
- yaz_log (LOG_DEBUG, "ZOOM_resultset_create r = %p", r);
- r->refcount = 1;
- r->size = 0;
- r->odr = odr_createmem (ODR_ENCODE);
- r->start = 0;
- r->piggyback = 1;
- r->setname = 0;
- r->schema = 0;
- r->count = 0;
- r->step = 0;
- r->record_cache = 0;
- r->r_sort_spec = 0;
- r->query = 0;
- r->connection = 0;
- r->next = 0;
- return r;
-}
-
-ZOOM_API(ZOOM_resultset)
-ZOOM_connection_search_pqf(ZOOM_connection c, const char *q)
-{
- ZOOM_resultset r;
- ZOOM_query s = ZOOM_query_create();
-
- ZOOM_query_prefix (s, q);
-
- r = ZOOM_connection_search (c, s);
- ZOOM_query_destroy (s);
- return r;
-}
-
-ZOOM_API(ZOOM_resultset)
-ZOOM_connection_search(ZOOM_connection c, ZOOM_query q)
-{
- ZOOM_resultset r = ZOOM_resultset_create ();
- ZOOM_task task;
- const char *cp;
-
- r->r_sort_spec = q->sort_spec;
- r->query = q;
-
- r->options = ZOOM_options_create_with_parent(c->options);
-
- r->start = ZOOM_options_get_int(r->options, "start", 0);
- r->count = ZOOM_options_get_int(r->options, "count", 0);
- r->step = ZOOM_options_get_int(r->options, "step", 0);
- r->piggyback = ZOOM_options_get_bool (r->options, "piggyback", 1);
- cp = ZOOM_options_get (r->options, "setname");
- if (cp)
- r->setname = xstrdup(cp);
- cp = ZOOM_options_get (r->options, "schema");
- if (cp)
- r->schema = xstrdup(cp);
-
- r->connection = c;
-
- r->next = c->resultsets;
- c->resultsets = r;
-
- if (c->host_port && c->proto == PROTO_HTTP)
- {
- if (!c->cs)
- {
- yaz_log(LOG_DEBUG, "NO COMSTACK");
- ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
- }
- else
- {
- yaz_log(LOG_DEBUG, "PREPARE FOR RECONNECT");
- c->reconnect_ok = 1;
- }
- }
-
- task = ZOOM_connection_add_task (c, ZOOM_TASK_SEARCH);
- task->u.search.resultset = r;
- ZOOM_resultset_addref (r);
-
- (q->refcount)++;
-
- if (!c->async)
- {
- while (ZOOM_event (1, &c))
- ;
- }
- return r;
-}
-
-ZOOM_API(void)
-ZOOM_resultset_destroy(ZOOM_resultset r)
-{
- if (!r)
- return;
- (r->refcount)--;
- yaz_log (LOG_DEBUG, "ZOOM_resultset_destroy r = %p count=%d",
- r, r->refcount);
- if (r->refcount == 0)
- {
- ZOOM_record_cache rc;
-
- for (rc = r->record_cache; rc; rc = rc->next)
- {
- if (rc->rec.wrbuf_marc)
- wrbuf_free (rc->rec.wrbuf_marc, 1);
- if (rc->rec.wrbuf_iconv)
- wrbuf_free (rc->rec.wrbuf_iconv, 1);
- if (rc->rec.wrbuf_opac)
- wrbuf_free (rc->rec.wrbuf_opac, 1);
- }
- if (r->connection)
- {
- /* remove ourselves from the resultsets in connection */
- ZOOM_resultset *rp = &r->connection->resultsets;
- while (1)
- {
- assert (*rp); /* we must be in this list!! */
- if (*rp == r)
- { /* OK, we're here - take us out of it */
- *rp = (*rp)->next;
- break;
- }
- rp = &(*rp)->next;
- }
- }
- ZOOM_query_destroy (r->query);
- ZOOM_options_destroy (r->options);
- odr_destroy (r->odr);
- xfree (r->setname);
- xfree (r->schema);
- xfree (r);
- }
-}
-
-ZOOM_API(size_t)
-ZOOM_resultset_size (ZOOM_resultset r)
-{
- return r->size;
-}
-
-static void do_close (ZOOM_connection c)
-{
- if (c->cs)
- cs_close(c->cs);
- c->cs = 0;
- c->mask = 0;
- c->state = STATE_IDLE;
-}
-
-static void ZOOM_resultset_retrieve (ZOOM_resultset r,
- int force_sync, int start, int count)
-{
- ZOOM_task task;
- ZOOM_connection c;
- const char *cp;
-
- if (!r)
- return;
- c = r->connection;
- if (!c)
- return;
-
- if (c->host_port && c->proto == PROTO_HTTP)
- {
- if (!c->cs)
- {
- yaz_log(LOG_DEBUG, "NO COMSTACK");
- ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
- }
- else
- {
- yaz_log(LOG_DEBUG, "PREPARE FOR RECONNECT");
- c->reconnect_ok = 1;
- }
- }
- task = ZOOM_connection_add_task (c, ZOOM_TASK_RETRIEVE);
- task->u.retrieve.resultset = r;
- task->u.retrieve.start = start;
- task->u.retrieve.count = count;
-
- cp = ZOOM_options_get (r->options, "schema");
- if (cp)
- {
- if (!r->schema || strcmp(r->schema, cp))
- {
- xfree(r->schema);
- r->schema = xstrdup(cp);
- }
- }
-
- ZOOM_resultset_addref (r);
-
- if (!r->connection->async || force_sync)
- while (r->connection && ZOOM_event (1, &r->connection))
- ;
-}
-
-ZOOM_API(void)
-ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs,
- size_t start, size_t count)
-{
- int force_present = 0;
-
- if (!r)
- return ;
- if (count && recs)
- force_present = 1;
- ZOOM_resultset_retrieve (r, force_present, start, count);
- if (force_present)
- {
- size_t i;
- for (i = 0; i< count; i++)
- recs[i] = ZOOM_resultset_record_immediate (r, i+start);
- }
-}
-
-static zoom_ret do_connect (ZOOM_connection c)
-{
- void *add;
- const char *effective_host;
-
- if (c->proxy)
- effective_host = c->proxy;
- else
- effective_host = c->host_port;
-
- yaz_log (LOG_DEBUG, "do_connect host=%s", effective_host);
-
- assert (!c->cs);
- c->cs = cs_create_host (effective_host, 0, &add);
-
- if (c->cs && c->cs->protocol == PROTO_HTTP)
- {
-#if HAVE_XML2
- const char *path = 0;
-
- c->proto = PROTO_HTTP;
- cs_get_host_args(c->host_port, &path);
- xfree(c->path);
- c->path = xmalloc(strlen(path)+2);
- c->path[0] = '/';
- strcpy (c->path+1, path);
-#else
- set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_PROTOCOL, "SRW");
- do_close(c);
- return zoom_complete;
-#endif
- }
- if (c->cs)
- {
- int ret = cs_connect (c->cs, add);
- if (ret == 0)
- {
- ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
- ZOOM_connection_put_event(c, event);
- if (c->proto == PROTO_Z3950)
- ZOOM_connection_send_init(c);
- else
- {
- /* no init request for SRW .. */
- assert (c->tasks->which == ZOOM_TASK_CONNECT);
- ZOOM_connection_remove_task (c);
- c->mask = 0;
- ZOOM_connection_exec_task (c);
- }
- c->state = STATE_ESTABLISHED;
- return zoom_pending;
- }
- else if (ret > 0)
- {
- c->state = STATE_CONNECTING;
- c->mask = ZOOM_SELECT_EXCEPT;
- if (c->cs->io_pending & CS_WANT_WRITE)
- c->mask += ZOOM_SELECT_WRITE;
- if (c->cs->io_pending & CS_WANT_READ)
- c->mask += ZOOM_SELECT_READ;
- return zoom_pending;
- }
- }
- c->state = STATE_IDLE;
- set_ZOOM_error(c, ZOOM_ERROR_CONNECT, effective_host);
- return zoom_complete;
-}
-
-int z3950_connection_socket(ZOOM_connection c)
-{
- if (c->cs)
- return cs_fileno(c->cs);
- return -1;
-}
-
-int z3950_connection_mask(ZOOM_connection c)
-{
- if (c->cs)
- return c->mask;
- return 0;
-}
-
-static void otherInfo_attach (ZOOM_connection c, Z_APDU *a, ODR out)
-{
- int i;
- for (i = 0; i<200; i++)
- {
- size_t len;
- Z_OtherInformation **oi;
- char buf[80];
- const char *val;
- const char *cp;
- int oidval;
-
- sprintf (buf, "otherInfo%d", i);
- val = ZOOM_options_get (c->options, buf);
- if (!val)
- break;
- cp = strchr (val, ':');
- if (!cp)
- continue;
- len = cp - val;
- if (len >= sizeof(buf))
- len = sizeof(buf)-1;
- memcpy (buf, val, len);
- buf[len] = '\0';
- oidval = oid_getvalbyname (buf);
- if (oidval == VAL_NONE)
- continue;
-
- yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, oidval, 1, cp+1);
- }
-}
-
-static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out)
-{
- assert (a);
- if (c->cookie_out)
- {
- Z_OtherInformation **oi;
- yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, VAL_COOKIE, 1, c->cookie_out);
- }
- if (c->client_IP)
- {
- Z_OtherInformation **oi;
- yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, VAL_CLIENT_IP, 1, c->client_IP);
- }
- otherInfo_attach (c, a, out);
- if (!z_APDU(out, &a, 0, 0))
- {
- FILE *outf = fopen("/tmp/apdu.txt", "a");
- if (a && outf)
- {
- ODR odr_pr = odr_createmem(ODR_PRINT);
- fprintf (outf, "a=%p\n", a);
- odr_setprint(odr_pr, outf);
- z_APDU(odr_pr, &a, 0, 0);
- odr_destroy(odr_pr);
- }
- yaz_log (LOG_DEBUG, "encoding failed");
- set_ZOOM_error(c, ZOOM_ERROR_ENCODE, 0);
- odr_reset(out);
- return -1;
- }
-
- return 0;
-}
-
-static zoom_ret send_APDU (ZOOM_connection c, Z_APDU *a)
-{
- ZOOM_Event event;
- assert (a);
- if (encode_APDU(c, a, c->odr_out))
- return zoom_complete;
- yaz_log(LOG_DEBUG, "send APDU type=%d", a->which);
- c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
- event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
- ZOOM_connection_put_event (c, event);
- odr_reset(c->odr_out);
- return do_write (c);
-}
-
-/* returns 1 if PDU was sent OK (still pending )
- 0 if PDU was not sent OK (nothing to wait for)
-*/
-
-static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
-{
- const char *impname;
- Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_initRequest);
- Z_InitRequest *ireq = apdu->u.initRequest;
- Z_IdAuthentication *auth = (Z_IdAuthentication *)
- odr_malloc(c->odr_out, sizeof(*auth));
- const char *auth_groupId = ZOOM_options_get (c->options, "group");
- const char *auth_userId = ZOOM_options_get (c->options, "user");
- const char *auth_password = ZOOM_options_get (c->options, "pass");
-
- ODR_MASK_SET(ireq->options, Z_Options_search);
- ODR_MASK_SET(ireq->options, Z_Options_present);
- ODR_MASK_SET(ireq->options, Z_Options_scan);
- ODR_MASK_SET(ireq->options, Z_Options_sort);
- ODR_MASK_SET(ireq->options, Z_Options_extendedServices);
- ODR_MASK_SET(ireq->options, Z_Options_namedResultSets);
-
- ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_1);
- ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_2);
- ODR_MASK_SET(ireq->protocolVersion, Z_ProtocolVersion_3);
-
- impname = ZOOM_options_get (c->options, "implementationName");
- ireq->implementationName =
- (char *) odr_malloc (c->odr_out, 15 + (impname ? strlen(impname) : 0));
- strcpy (ireq->implementationName, "");
- if (impname)
- {
- strcat (ireq->implementationName, impname);
- strcat (ireq->implementationName, "/");
- }
- strcat (ireq->implementationName, "ZOOM-C/YAZ");
-
- *ireq->maximumRecordSize =
- ZOOM_options_get_int (c->options, "maximumRecordSize", 1024*1024);
- *ireq->preferredMessageSize =
- ZOOM_options_get_int (c->options, "preferredMessageSize", 1024*1024);
-
- if (auth_groupId || auth_password)
- {
- Z_IdPass *pass = (Z_IdPass *) odr_malloc(c->odr_out, sizeof(*pass));
- int i = 0;
- pass->groupId = 0;
- if (auth_groupId && *auth_groupId)
- {
- pass->groupId = (char *)
- odr_malloc(c->odr_out, strlen(auth_groupId)+1);
- strcpy(pass->groupId, auth_groupId);
- i++;
- }
- pass->userId = 0;
- if (auth_userId && *auth_userId)
- {
- pass->userId = (char *)
- odr_malloc(c->odr_out, strlen(auth_userId)+1);
- strcpy(pass->userId, auth_userId);
- i++;
- }
- pass->password = 0;
- if (auth_password && *auth_password)
- {
- pass->password = (char *)
- odr_malloc(c->odr_out, strlen(auth_password)+1);
- strcpy(pass->password, auth_password);
- i++;
- }
- if (i)
- {
- auth->which = Z_IdAuthentication_idPass;
- auth->u.idPass = pass;
- ireq->idAuthentication = auth;
- }
- }
- else if (auth_userId)
- {
- auth->which = Z_IdAuthentication_open;
- auth->u.open = (char *)
- odr_malloc(c->odr_out, strlen(auth_userId)+1);
- strcpy(auth->u.open, auth_userId);
- ireq->idAuthentication = auth;
- }
- if (c->proxy)
- yaz_oi_set_string_oidval(&ireq->otherInfo, c->odr_out,
- VAL_PROXY, 1, c->host_port);
- if (c->charset||c->lang)
- {
- Z_OtherInformation **oi;
- Z_OtherInformationUnit *oi_unit;
-
- yaz_oi_APDU(apdu, &oi);
-
- if ((oi_unit = yaz_oi_update(oi, c->odr_out, NULL, 0, 0)))
- {
- ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
-
- oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
- oi_unit->information.externallyDefinedInfo =
- yaz_set_proposal_charneg
- (c->odr_out,
- (const char **)&c->charset, (c->charset) ? 1:0,
- (const char **)&c->lang, (c->lang) ? 1:0, 1);
- }
- }
- assert (apdu);
- return send_APDU (c, apdu);
-}
-
-#if HAVE_XML2
-static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
-{
- char ctype[50];
- Z_SOAP_Handler h[2] = {
- {"http://www.loc.gov/zing/srw/v1.0/", 0, (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
- ODR o = odr_createmem(ODR_ENCODE);
- int ret;
- Z_SOAP *p = odr_malloc(o, sizeof(*p));
- Z_GDU *gdu;
- ZOOM_Event event;
-
- gdu = z_get_HTTP_Request(c->odr_out);
- gdu->u.HTTP_Request->path = c->path;
-
- if (c->host_port)
- {
- const char *cp0 = strstr(c->host_port, "://");
- const char *cp1 = 0;
- if (cp0)
- cp0 = cp0+3;
- else
- cp0 = c->host_port;
-
- cp1 = strchr(cp0, '/');
- if (!cp1)
- cp1 = cp0+strlen(cp0);
-
- if (cp0 && cp1)
- {
- char *h = odr_malloc(c->odr_out, cp1 - cp0 + 1);
- memcpy (h, cp0, cp1 - cp0);
- h[cp1-cp0] = '\0';
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "host", h);
- }
- }
-
- strcpy(ctype, "text/xml");
- if (c->charset && strlen(c->charset) < 20)
- {
- strcat(ctype, "; charset=");
- strcat(ctype, c->charset);
- }
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "Content-Type", ctype);
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "SOAPAction", "\"\"");
- p->which = Z_SOAP_generic;
- p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
- p->u.generic->no = 0;
- p->u.generic->ns = 0;
- p->u.generic->p = sr;
- p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
-
- ret = z_soap_codec_enc(o, &p,
- &gdu->u.HTTP_Request->content_buf,
- &gdu->u.HTTP_Request->content_len, h,
- c->charset);
-
- if (!z_GDU(c->odr_out, &gdu, 0, 0))
- return zoom_complete;
- c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
-
- odr_destroy(o);
-
- event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
- ZOOM_connection_put_event (c, event);
- odr_reset(c->odr_out);
- return do_write (c);
-}
-#endif
-
-#if HAVE_XML2
-static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
-{
- int i;
- ZOOM_resultset resultset = 0;
- Z_SRW_PDU *sr = 0;
- const char *recordPacking = 0;
-
- if (c->error) /* don't continue on error */
- return zoom_complete;
- assert (c->tasks);
- if (c->tasks->which == ZOOM_TASK_SEARCH)
- {
- resultset = c->tasks->u.search.resultset;
- resultset->setname = xstrdup ("default");
- ZOOM_options_set (resultset->options, "setname", resultset->setname);
- }
- else if(c->tasks->which == ZOOM_TASK_RETRIEVE)
- {
- resultset = c->tasks->u.retrieve.resultset;
-
- resultset->start = c->tasks->u.retrieve.start;
- resultset->count = c->tasks->u.retrieve.count;
-
- if (resultset->start >= resultset->size)
- return zoom_complete;
- if (resultset->start + resultset->count > resultset->size)
- resultset->count = resultset->size - resultset->start;
-
- for (i = 0; i<resultset->count; i++)
- {
- ZOOM_record rec =
- record_cache_lookup (resultset, i + resultset->start);
- if (!rec)
- break;
- }
- if (i == resultset->count)
- return zoom_complete;
- }
- assert(resultset->query);
-
- sr = yaz_srw_get(c->odr_out, Z_SRW_searchRetrieve_request);
-
- if (resultset->query->z_query->which == Z_Query_type_104
- && resultset->query->z_query->u.type_104->which == Z_External_CQL)
- {
-
- sr->u.request->query_type = Z_SRW_query_type_cql;
- sr->u.request->query.cql =resultset->query->z_query->u.type_104->u.cql;
- }
- else if (resultset->query->z_query->which == Z_Query_type_1 &&
- resultset->query->z_query->u.type_1)
- {
- sr->u.request->query_type = Z_SRW_query_type_pqf;
- sr->u.request->query.pqf = resultset->query->query_string;
- }
- else
- {
- set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_QUERY, 0);
- return zoom_complete;
- }
- sr->u.request->startRecord = odr_intdup (c->odr_out, resultset->start + 1);
- sr->u.request->maximumRecords = odr_intdup (
- c->odr_out, resultset->step>0 ? resultset->step : resultset->count);
- sr->u.request->recordSchema = resultset->schema;
-
- recordPacking = ZOOM_resultset_option_get (resultset, "recordPacking");
-
- if (recordPacking)
- sr->u.request->recordPacking = odr_strdup(c->odr_out, recordPacking);
-
- return send_srw(c, sr);
-}
-#else
-static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
-{
- return zoom_complete;
-}
-#endif
-
-static zoom_ret ZOOM_connection_send_search (ZOOM_connection c)
-{
- ZOOM_resultset r;
- int lslb, ssub, mspn;
- const char *syntax;
- Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_searchRequest);
- Z_SearchRequest *search_req = apdu->u.searchRequest;
- const char *elementSetName;
- const char *smallSetElementSetName;
- const char *mediumSetElementSetName;
-
- assert (c->tasks);
- assert (c->tasks->which == ZOOM_TASK_SEARCH);
-
- r = c->tasks->u.search.resultset;
-
- elementSetName =
- ZOOM_options_get (r->options, "elementSetName");
- smallSetElementSetName =
- ZOOM_options_get (r->options, "smallSetElementSetName");
- mediumSetElementSetName =
- ZOOM_options_get (r->options, "mediumSetElementSetName");
-
- if (!smallSetElementSetName)
- smallSetElementSetName = elementSetName;
-
- if (!mediumSetElementSetName)
- mediumSetElementSetName = elementSetName;
-
- assert (r);
- assert (r->query);
-
- /* prepare query for the search request */
- search_req->query = r->query->z_query;
-
- search_req->databaseNames =
- set_DatabaseNames (c, r->options, &search_req->num_databaseNames);
-
- /* get syntax (no need to provide unless piggyback is in effect) */
- syntax = ZOOM_options_get (r->options, "preferredRecordSyntax");
-
- lslb = ZOOM_options_get_int (r->options, "largeSetLowerBound", -1);
- ssub = ZOOM_options_get_int (r->options, "smallSetUpperBound", -1);
- mspn = ZOOM_options_get_int (r->options, "mediumSetPresentNumber", -1);
- if (lslb != -1 && ssub != -1 && mspn != -1)
- {
- /* So're a Z39.50 expert? Let's hope you don't do sort */
- *search_req->largeSetLowerBound = lslb;
- *search_req->smallSetUpperBound = ssub;
- *search_req->mediumSetPresentNumber = mspn;
- }
- else if (r->start == 0 && r->count > 0
- && r->piggyback && !r->r_sort_spec && !r->schema)
- {
- /* Regular piggyback - do it unless we're going to do sort */
- *search_req->largeSetLowerBound = 2000000000;
- *search_req->smallSetUpperBound = 1;
- *search_req->mediumSetPresentNumber = r->step>0 ? r->step : r->count;
- }
- else
- {
- /* non-piggyback. Need not provide elementsets or syntaxes .. */
- smallSetElementSetName = 0;
- mediumSetElementSetName = 0;
- syntax = 0;
- }
- if (smallSetElementSetName && *smallSetElementSetName)
- {
- Z_ElementSetNames *esn = (Z_ElementSetNames *)
- odr_malloc (c->odr_out, sizeof(*esn));
-
- esn->which = Z_ElementSetNames_generic;
- esn->u.generic = odr_strdup (c->odr_out, smallSetElementSetName);
- search_req->smallSetElementSetNames = esn;
- }
- if (mediumSetElementSetName && *mediumSetElementSetName)
- {
- Z_ElementSetNames *esn = (Z_ElementSetNames *)
- odr_malloc (c->odr_out, sizeof(*esn));
-
- esn->which = Z_ElementSetNames_generic;
- esn->u.generic = odr_strdup (c->odr_out, mediumSetElementSetName);
- search_req->mediumSetElementSetNames = esn;
- }
- if (syntax)
- search_req->preferredRecordSyntax =
- yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, syntax);
-
- if (!r->setname)
- {
- if (c->support_named_resultsets)
- {
- char setname[14];
- int ord;
- /* find the lowest unused ordinal so that we re-use
- result sets on the server. */
- for (ord = 1; ; ord++)
- {
- ZOOM_resultset rp;
- sprintf (setname, "%d", ord);
- for (rp = c->resultsets; rp; rp = rp->next)
- if (rp->setname && !strcmp (rp->setname, setname))
- break;
- if (!rp)
- break;
- }
- r->setname = xstrdup (setname);
- yaz_log (LOG_DEBUG, "allocating set %s", r->setname);
- }
- else
- r->setname = xstrdup ("default");
- ZOOM_options_set (r->options, "setname", r->setname);
- }
- search_req->resultSetName = odr_strdup(c->odr_out, r->setname);
- /* send search request */
- return send_APDU (c, apdu);
-}
-
-static void response_diag (ZOOM_connection c, Z_DiagRec *p)
-{
- int oclass;
- Z_DefaultDiagFormat *r;
- char *addinfo = 0;
-
- xfree (c->addinfo);
- c->addinfo = 0;
- if (p->which != Z_DiagRec_defaultFormat)
- {
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- return;
- }
- r = p->u.defaultFormat;
- switch (r->which)
- {
- case Z_DefaultDiagFormat_v2Addinfo:
- addinfo = r->u.v2Addinfo;
- break;
- case Z_DefaultDiagFormat_v3Addinfo:
- addinfo = r->u.v3Addinfo;
- break;
- }
- set_dset_error(c, *r->condition,
- yaz_z3950oid_to_str(r->diagnosticSetId, &oclass),
- addinfo, 0);
-}
-
-ZOOM_API(ZOOM_record)
-ZOOM_record_clone (ZOOM_record srec)
-{
- char *buf;
- int size;
- ODR odr_enc;
- ZOOM_record nrec;
-
- odr_enc = odr_createmem(ODR_ENCODE);
- if (!z_NamePlusRecord (odr_enc, &srec->npr, 0, 0))
- return 0;
- buf = odr_getbuf (odr_enc, &size, 0);
-
- nrec = (ZOOM_record) xmalloc (sizeof(*nrec));
- nrec->odr = odr_createmem(ODR_DECODE);
- nrec->wrbuf_marc = 0;
- nrec->wrbuf_iconv = 0;
- nrec->wrbuf_opac = 0;
- odr_setbuf (nrec->odr, buf, size, 0);
- z_NamePlusRecord (nrec->odr, &nrec->npr, 0, 0);
-
- odr_destroy (odr_enc);
- return nrec;
-}
-
-ZOOM_API(ZOOM_record)
-ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos)
-{
- return record_cache_lookup (s, pos);
-}
-
-ZOOM_API(ZOOM_record)
-ZOOM_resultset_record (ZOOM_resultset r, size_t pos)
-{
- ZOOM_record rec = ZOOM_resultset_record_immediate(r, pos);
-
- if (!rec)
- {
- ZOOM_resultset_retrieve (r, 1, pos, 1);
- rec = ZOOM_resultset_record_immediate (r, pos);
- }
- return rec;
-}
-
-ZOOM_API(void)
-ZOOM_record_destroy (ZOOM_record rec)
-{
- if (!rec)
- return;
- if (rec->wrbuf_marc)
- wrbuf_free (rec->wrbuf_marc, 1);
- if (rec->wrbuf_iconv)
- wrbuf_free (rec->wrbuf_iconv, 1);
- if (rec->wrbuf_opac)
- wrbuf_free (rec->wrbuf_opac, 1);
- odr_destroy (rec->odr);
- xfree (rec);
-}
-
-static const char *record_iconv_return(ZOOM_record rec, int *len,
- const char *buf, int sz,
- const char *record_charset)
-{
- char to[40];
- char from[40];
- yaz_iconv_t cd = 0;
-
- *from = '\0';
- strcpy(to, "UTF-8");
- if (record_charset && *record_charset)
- {
- /* Use "from,to" or just "from" */
- const char *cp =strchr(record_charset, ',');
- int clen = strlen(record_charset);
- if (cp && cp[1])
- {
- strncpy( to, cp+1, sizeof(to)-1);
- to[sizeof(to)-1] = '\0';
- clen = cp - record_charset;
- }
- if (clen > sizeof(from)-1)
- clen = sizeof(from)-1;
-
- if (clen)
- strncpy(from, record_charset, clen);
- from[clen] = '\0';
- }
-
- if (*from && *to && (cd = yaz_iconv_open(to, from)))
- {
- char outbuf[12];
- size_t inbytesleft = sz;
- const char *inp = buf;
-
- if (!rec->wrbuf_iconv)
- rec->wrbuf_iconv = wrbuf_alloc();
-
- wrbuf_rewind(rec->wrbuf_iconv);
-
- while (inbytesleft)
- {
- size_t outbytesleft = sizeof(outbuf);
- char *outp = outbuf;
- size_t r = yaz_iconv (cd, (char**) &inp,
- &inbytesleft,
- &outp, &outbytesleft);
- if (r == (size_t) (-1))
- {
- int e = yaz_iconv_error(cd);
- if (e != YAZ_ICONV_E2BIG)
- break;
- }
- wrbuf_write(rec->wrbuf_iconv, outbuf, outp - outbuf);
- }
- wrbuf_puts(rec->wrbuf_iconv, "");
- buf = wrbuf_buf(rec->wrbuf_iconv);
- sz = wrbuf_len(rec->wrbuf_iconv);
- yaz_iconv_close(cd);
- }
- if (len)
- *len = sz;
- return buf;
-}
-
-ZOOM_API(const char *)
-ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
-{
- char type[40];
- char charset[40];
- const char *cp;
- int i;
- Z_NamePlusRecord *npr;
-
- if (len)
- *len = 0; /* default return */
-
- if (!rec)
- return 0;
- npr = rec->npr;
- if (!npr)
- return 0;
-
- cp = type_spec;
- for (i = 0; cp[i] && i < sizeof(type)-1; i++)
- {
- if (cp[i] == ';' || cp[i] == ' ')
- break;
- type[i] = cp[i];
- }
- type[i] = '\0';
- charset[0] = '\0';
- if (type_spec[i] == ';')
- {
- i++;
- while (type_spec[i] == ' ')
- i++;
- if (!strncmp(type_spec+i, "charset=", 8))
- {
- cp = type_spec+i+8;
- for (i = 0; cp[i] && i < sizeof(charset)-1; i++)
- {
- if (cp[i] == ';' || cp[i] == ' ')
- break;
- charset[i] = cp[i];
- }
- charset[i] = '\0';
- }
- }
-
- if (!strcmp (type, "database"))
- {
- if (len)
- *len = (npr->databaseName ? strlen(npr->databaseName) : 0);
- return npr->databaseName;
- }
- else if (!strcmp (type, "syntax"))
- {
- const char *desc = 0;
- if (npr->which == Z_NamePlusRecord_databaseRecord)
- {
- Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
- if (ent)
- desc = ent->desc;
- }
- if (!desc)
- desc = "none";
- if (len)
- *len = strlen(desc);
- return desc;
- }
- else if (!strcmp (type, "render") &&
- npr->which == Z_NamePlusRecord_databaseRecord)
- {
- Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
-
- /* render bibliographic record .. */
- if (r->which == Z_External_OPAC)
- {
- r = r->u.opac->bibliographicRecord;
- if (!r)
- return 0;
- ent = oid_getentbyoid(r->direct_reference);
- }
- if (r->which == Z_External_sutrs)
- return record_iconv_return(rec, len,
- r->u.sutrs->buf, r->u.sutrs->len,
- charset);
- else if (r->which == Z_External_octet)
- {
- yaz_marc_t mt;
- switch (ent->value)
- {
- case VAL_SOIF:
- case VAL_HTML:
- case VAL_SUTRS:
- break;
- case VAL_TEXT_XML:
- case VAL_APPLICATION_XML:
- break;
- default:
- if (!rec->wrbuf_marc)
- rec->wrbuf_marc = wrbuf_alloc();
-
- mt = yaz_marc_create();
- wrbuf_rewind (rec->wrbuf_marc);
- if (yaz_marc_decode_wrbuf (
- mt, (const char *) r->u.octet_aligned->buf,
- r->u.octet_aligned->len,
- rec->wrbuf_marc) > 0)
- {
- yaz_marc_destroy(mt);
- return record_iconv_return(rec, len,
- wrbuf_buf(rec->wrbuf_marc),
- wrbuf_len(rec->wrbuf_marc),
- charset);
- }
- yaz_marc_destroy(mt);
- }
- return record_iconv_return(rec, len,
- (const char *) r->u.octet_aligned->buf,
- r->u.octet_aligned->len,
- charset);
- }
- else if (r->which == Z_External_grs1)
- {
- if (!rec->wrbuf_marc)
- rec->wrbuf_marc = wrbuf_alloc();
- wrbuf_rewind (rec->wrbuf_marc);
- yaz_display_grs1(rec->wrbuf_marc, r->u.grs1, 0);
- return record_iconv_return(rec, len,
- wrbuf_buf(rec->wrbuf_marc),
- wrbuf_len(rec->wrbuf_marc),
- charset);
- }
- return 0;
- }
- else if (npr->which == Z_NamePlusRecord_databaseRecord &&
- (!strcmp (type, "xml") || !strcmp(type, "oai")))
- {
- Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
-
- /* render bibliographic record .. */
- if (r->which == Z_External_OPAC)
- {
- r = r->u.opac->bibliographicRecord;
- if (!r)
- return 0;
- ent = oid_getentbyoid(r->direct_reference);
- }
-
- if (r->which == Z_External_sutrs)
- return record_iconv_return(rec, len,
- (const char *) r->u.sutrs->buf,
- r->u.sutrs->len,
- charset);
- else if (r->which == Z_External_octet)
- {
- yaz_marc_t mt;
- int marc_decode_type = YAZ_MARC_MARCXML;
-
- if (!strcmp(type, "oai"))
- marc_decode_type = YAZ_MARC_OAIMARC;
- switch (ent->value)
- {
- case VAL_SOIF:
- case VAL_HTML:
- case VAL_SUTRS:
- break;
- case VAL_TEXT_XML:
- case VAL_APPLICATION_XML:
- break;
- default:
- if (!rec->wrbuf_marc)
- rec->wrbuf_marc = wrbuf_alloc();
- wrbuf_rewind (rec->wrbuf_marc);
- mt = yaz_marc_create();
-
- yaz_marc_xml(mt, YAZ_MARC_MARCXML);
- if (yaz_marc_decode_wrbuf (
- mt, (const char *) r->u.octet_aligned->buf,
- r->u.octet_aligned->len,
- rec->wrbuf_marc) > 0)
- {
- yaz_marc_destroy(mt);
- return record_iconv_return(rec, len,
- wrbuf_buf(rec->wrbuf_marc),
- wrbuf_len(rec->wrbuf_marc),
- charset);
- }
- yaz_marc_destroy(mt);
- }
- return record_iconv_return(rec, len,
- (const char *) r->u.octet_aligned->buf,
- r->u.octet_aligned->len,
- charset);
- }
- else if (r->which == Z_External_grs1)
- {
- if (len) *len = 5;
- return "GRS-1";
- }
- return 0;
- }
- else if (!strcmp (type, "raw"))
- {
- if (npr->which == Z_NamePlusRecord_databaseRecord)
- {
- Z_External *r = (Z_External *) npr->u.databaseRecord;
-
- if (r->which == Z_External_sutrs)
- {
- if (len) *len = r->u.sutrs->len;
- return (const char *) r->u.sutrs->buf;
- }
- else if (r->which == Z_External_octet)
- {
- if (len) *len = r->u.octet_aligned->len;
- return (const char *) r->u.octet_aligned->buf;
- }
- else /* grs-1, explain, OPAC, ... */
- {
- if (len) *len = -1;
- return (const char *) npr->u.databaseRecord;
- }
- }
- return 0;
- }
- else if (!strcmp (type, "ext"))
- {
- if (npr->which == Z_NamePlusRecord_databaseRecord)
- return (const char *) npr->u.databaseRecord;
- return 0;
- }
- else if (npr->which == Z_NamePlusRecord_databaseRecord &&
- !strcmp (type, "opac"))
-
- {
- Z_External *r = (Z_External *) npr->u.databaseRecord;
- if (r->which == Z_External_OPAC)
- {
- if (!rec->wrbuf_opac)
- rec->wrbuf_opac = wrbuf_alloc();
- wrbuf_rewind (rec->wrbuf_opac);
- yaz_display_OPAC(rec->wrbuf_opac, r->u.opac, 0);
- return record_iconv_return(rec, len,
- wrbuf_buf(rec->wrbuf_opac),
- wrbuf_len(rec->wrbuf_opac),
- charset);
- }
- }
- return 0;
-}
-
-static int strcmp_null(const char *v1, const char *v2)
-{
- if (!v1 && !v2)
- return 0;
- if (!v1 || !v2)
- return -1;
- return strcmp(v1, v2);
-}
-
-static void record_cache_add (ZOOM_resultset r, Z_NamePlusRecord *npr,
- int pos)
-{
- ZOOM_record_cache rc;
- const char *elementSetName =
- ZOOM_resultset_option_get (r, "elementSetName");
- const char *syntax =
- ZOOM_resultset_option_get (r, "preferredRecordSyntax");
-
- ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
- ZOOM_connection_put_event(r->connection, event);
-
- for (rc = r->record_cache; rc; rc = rc->next)
- {
- if (pos == rc->pos)
- {
- if (strcmp_null(r->schema, rc->schema))
- continue;
- if (strcmp_null(elementSetName,rc->elementSetName))
- continue;
- if (strcmp_null(syntax, rc->syntax))
- continue;
- /* not destroying rc->npr (it's handled by nmem )*/
- rc->rec.npr = npr;
- /* keeping wrbuf_marc too */
- return;
- }
- }
- rc = (ZOOM_record_cache) odr_malloc (r->odr, sizeof(*rc));
- rc->rec.npr = npr;
- rc->rec.odr = 0;
- rc->rec.wrbuf_marc = 0;
- rc->rec.wrbuf_iconv = 0;
- rc->rec.wrbuf_opac = 0;
- if (elementSetName)
- rc->elementSetName = odr_strdup (r->odr, elementSetName);
- else
- rc->elementSetName = 0;
-
- if (syntax)
- rc->syntax = odr_strdup (r->odr, syntax);
- else
- rc->syntax = 0;
-
- if (r->schema)
- rc->schema = odr_strdup (r->odr, r->schema);
- else
- rc->schema = 0;
-
- rc->pos = pos;
- rc->next = r->record_cache;
- r->record_cache = rc;
-}
-
-static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos)
-{
- ZOOM_record_cache rc;
- const char *elementSetName =
- ZOOM_resultset_option_get (r, "elementSetName");
- const char *syntax =
- ZOOM_resultset_option_get (r, "preferredRecordSyntax");
-
- for (rc = r->record_cache; rc; rc = rc->next)
- {
- if (pos == rc->pos)
- {
- if (strcmp_null(r->schema, rc->schema))
- continue;
- if (strcmp_null(elementSetName,rc->elementSetName))
- continue;
- if (strcmp_null(syntax, rc->syntax))
- continue;
- return &rc->rec;
- }
- }
- return 0;
-}
-
-static void handle_records (ZOOM_connection c, Z_Records *sr,
- int present_phase)
-{
- ZOOM_resultset resultset;
-
- if (!c->tasks)
- return ;
- switch (c->tasks->which)
- {
- case ZOOM_TASK_SEARCH:
- resultset = c->tasks->u.search.resultset;
- break;
- case ZOOM_TASK_RETRIEVE:
- resultset = c->tasks->u.retrieve.resultset;
- break;
- default:
- return;
- }
- if (sr && sr->which == Z_Records_NSD)
- {
- Z_DiagRec dr, *dr_p = &dr;
- dr.which = Z_DiagRec_defaultFormat;
- dr.u.defaultFormat = sr->u.nonSurrogateDiagnostic;
-
- response_diag (c, dr_p);
- }
- else if (sr && sr->which == Z_Records_multipleNSD)
- {
- if (sr->u.multipleNonSurDiagnostics->num_diagRecs >= 1)
- response_diag(c, sr->u.multipleNonSurDiagnostics->diagRecs[0]);
- else
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- }
- else
- {
- if (resultset->count + resultset->start > resultset->size)
- resultset->count = resultset->size - resultset->start;
- if (resultset->count < 0)
- resultset->count = 0;
- if (sr && sr->which == Z_Records_DBOSD)
- {
- int i;
- NMEM nmem = odr_extract_mem (c->odr_in);
- Z_NamePlusRecordList *p =
- sr->u.databaseOrSurDiagnostics;
- for (i = 0; i<p->num_records; i++)
- {
- record_cache_add (resultset, p->records[i],
- i+ resultset->start);
- }
- /* transfer our response to search_nmem .. we need it later */
- nmem_transfer (resultset->odr->mem, nmem);
- nmem_destroy (nmem);
- if (present_phase && p->num_records == 0)
- {
- /* present response and we didn't get any records! */
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- }
- }
- else if (present_phase)
- {
- /* present response and we didn't get any records! */
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- }
- }
-}
-
-static void handle_present_response (ZOOM_connection c, Z_PresentResponse *pr)
-{
- handle_records (c, pr->records, 1);
-}
-
-static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr)
-{
- ZOOM_resultset resultset;
- ZOOM_Event event;
-
- yaz_log (LOG_DEBUG, "got search response");
-
- if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
- return ;
-
- event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH);
- ZOOM_connection_put_event(c, event);
-
- resultset = c->tasks->u.search.resultset;
-
- resultset->size = *sr->resultCount;
- handle_records (c, sr->records, 0);
-}
-
-static void sort_response (ZOOM_connection c, Z_SortResponse *res)
-{
- if (res->diagnostics && res->num_diagnostics > 0)
- response_diag (c, res->diagnostics[0]);
-}
-
-static int scan_response (ZOOM_connection c, Z_ScanResponse *res)
-{
- NMEM nmem = odr_extract_mem (c->odr_in);
- ZOOM_scanset scan;
-
- if (!c->tasks || c->tasks->which != ZOOM_TASK_SCAN)
- return 0;
- scan = c->tasks->u.scan.scan;
-
- if (res->entries && res->entries->nonsurrogateDiagnostics)
- response_diag(c, res->entries->nonsurrogateDiagnostics[0]);
- scan->scan_response = res;
- nmem_transfer (scan->odr->mem, nmem);
- if (res->stepSize)
- ZOOM_options_set_int (scan->options, "stepSize", *res->stepSize);
- if (res->positionOfTerm)
- ZOOM_options_set_int (scan->options, "position", *res->positionOfTerm);
- if (res->scanStatus)
- ZOOM_options_set_int (scan->options, "scanStatus", *res->scanStatus);
- if (res->numberOfEntriesReturned)
- ZOOM_options_set_int (scan->options, "number",
- *res->numberOfEntriesReturned);
- nmem_destroy (nmem);
- return 1;
-}
-
-static zoom_ret send_sort (ZOOM_connection c)
-{
- ZOOM_resultset resultset;
-
- if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
- return zoom_complete;
-
- resultset = c->tasks->u.search.resultset;
-
- if (c->error)
- {
- resultset->r_sort_spec = 0;
- return zoom_complete;
- }
- if (resultset->r_sort_spec)
- {
- Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_sortRequest);
- Z_SortRequest *req = apdu->u.sortRequest;
-
- req->num_inputResultSetNames = 1;
- req->inputResultSetNames = (Z_InternationalString **)
- odr_malloc (c->odr_out, sizeof(*req->inputResultSetNames));
- req->inputResultSetNames[0] =
- odr_strdup (c->odr_out, resultset->setname);
- req->sortedResultSetName = odr_strdup (c->odr_out, resultset->setname);
- req->sortSequence = resultset->r_sort_spec;
- resultset->r_sort_spec = 0;
- return send_APDU (c, apdu);
- }
- return zoom_complete;
-}
-
-static zoom_ret send_present (ZOOM_connection c)
-{
- Z_APDU *apdu = 0;
- Z_PresentRequest *req = 0;
- int i = 0;
- const char *syntax = 0;
- const char *elementSetName = 0;
- ZOOM_resultset resultset;
-
- if (!c->tasks)
- return zoom_complete;
-
- switch (c->tasks->which)
- {
- case ZOOM_TASK_SEARCH:
- resultset = c->tasks->u.search.resultset;
- break;
- case ZOOM_TASK_RETRIEVE:
- resultset = c->tasks->u.retrieve.resultset;
- resultset->start = c->tasks->u.retrieve.start;
- resultset->count = c->tasks->u.retrieve.count;
-
- if (resultset->start >= resultset->size)
- return zoom_complete;
- if (resultset->start + resultset->count > resultset->size)
- resultset->count = resultset->size - resultset->start;
- break;
- default:
- return zoom_complete;
- }
-
- syntax = ZOOM_resultset_option_get (resultset, "preferredRecordSyntax");
- elementSetName = ZOOM_resultset_option_get (resultset, "elementSetName");
-
- if (c->error) /* don't continue on error */
- return zoom_complete;
- if (resultset->start < 0)
- return zoom_complete;
- for (i = 0; i<resultset->count; i++)
- {
- ZOOM_record rec =
- record_cache_lookup (resultset, i + resultset->start);
- if (!rec)
- break;
- }
- if (i == resultset->count)
- return zoom_complete;
-
- apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
- req = apdu->u.presentRequest;
-
- resultset->start += i;
- resultset->count -= i;
- *req->resultSetStartPoint = resultset->start + 1;
- *req->numberOfRecordsRequested = resultset->step>0 ?
- resultset->step : resultset->count;
- assert (*req->numberOfRecordsRequested > 0);
-
- if (syntax && *syntax)
- req->preferredRecordSyntax =
- yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, syntax);
-
- if (resultset->schema && *resultset->schema)
- {
- Z_RecordComposition *compo = (Z_RecordComposition *)
- odr_malloc (c->odr_out, sizeof(*compo));
-
- req->recordComposition = compo;
- compo->which = Z_RecordComp_complex;
- compo->u.complex = (Z_CompSpec *)
- odr_malloc(c->odr_out, sizeof(*compo->u.complex));
- compo->u.complex->selectAlternativeSyntax = (bool_t *)
- odr_malloc(c->odr_out, sizeof(bool_t));
- *compo->u.complex->selectAlternativeSyntax = 0;
-
- compo->u.complex->generic = (Z_Specification *)
- odr_malloc(c->odr_out, sizeof(*compo->u.complex->generic));
-
- compo->u.complex->generic->which = Z_Schema_oid;
- compo->u.complex->generic->schema.oid = (Odr_oid *)
- yaz_str_to_z3950oid (c->odr_out, CLASS_SCHEMA, resultset->schema);
-
- if (!compo->u.complex->generic->schema.oid)
- {
- /* OID wasn't a schema! Try record syntax instead. */
-
- compo->u.complex->generic->schema.oid = (Odr_oid *)
- yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, resultset->schema);
- }
- if (elementSetName && *elementSetName)
- {
- compo->u.complex->generic->elementSpec = (Z_ElementSpec *)
- odr_malloc(c->odr_out, sizeof(Z_ElementSpec));
- compo->u.complex->generic->elementSpec->which =
- Z_ElementSpec_elementSetName;
- compo->u.complex->generic->elementSpec->u.elementSetName =
- odr_strdup (c->odr_out, elementSetName);
- }
- else
- compo->u.complex->generic->elementSpec = 0;
- compo->u.complex->num_dbSpecific = 0;
- compo->u.complex->dbSpecific = 0;
- compo->u.complex->num_recordSyntax = 0;
- compo->u.complex->recordSyntax = 0;
- }
- else if (elementSetName && *elementSetName)
- {
- Z_ElementSetNames *esn = (Z_ElementSetNames *)
- odr_malloc (c->odr_out, sizeof(*esn));
- Z_RecordComposition *compo = (Z_RecordComposition *)
- odr_malloc (c->odr_out, sizeof(*compo));
-
- esn->which = Z_ElementSetNames_generic;
- esn->u.generic = odr_strdup (c->odr_out, elementSetName);
- compo->which = Z_RecordComp_simple;
- compo->u.simple = esn;
- req->recordComposition = compo;
- }
- req->resultSetId = odr_strdup(c->odr_out, resultset->setname);
- return send_APDU (c, apdu);
-}
-
-ZOOM_API(ZOOM_scanset)
-ZOOM_connection_scan (ZOOM_connection c, const char *start)
-{
- ZOOM_scanset scan = (ZOOM_scanset) xmalloc (sizeof(*scan));
-
- scan->connection = c;
- scan->odr = odr_createmem (ODR_DECODE);
- scan->options = ZOOM_options_create_with_parent (c->options);
- scan->refcount = 1;
- scan->scan_response = 0;
-
- if ((scan->termListAndStartPoint =
- p_query_scan(scan->odr, PROTO_Z3950, &scan->attributeSet,
- start)))
- {
- ZOOM_task task = ZOOM_connection_add_task (c, ZOOM_TASK_SCAN);
- task->u.scan.scan = scan;
-
- (scan->refcount)++;
- if (!c->async)
- {
- while (ZOOM_event (1, &c))
- ;
- }
- }
- return scan;
-}
-
-ZOOM_API(void)
-ZOOM_scanset_destroy (ZOOM_scanset scan)
-{
- if (!scan)
- return;
- (scan->refcount)--;
- if (scan->refcount == 0)
- {
- odr_destroy (scan->odr);
-
- ZOOM_options_destroy (scan->options);
- xfree (scan);
- }
-}
-
-static zoom_ret send_package (ZOOM_connection c)
-{
- ZOOM_Event event;
- if (!c->tasks)
- return zoom_complete;
- assert (c->tasks->which == ZOOM_TASK_PACKAGE);
-
- event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
- ZOOM_connection_put_event (c, event);
-
- return do_write_ex (c, c->tasks->u.package->buf_out,
- c->tasks->u.package->len_out);
-}
-
-static zoom_ret send_scan (ZOOM_connection c)
-{
- ZOOM_scanset scan;
- Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest);
- Z_ScanRequest *req = apdu->u.scanRequest;
- if (!c->tasks)
- return zoom_complete;
- assert (c->tasks->which == ZOOM_TASK_SCAN);
- scan = c->tasks->u.scan.scan;
-
- req->termListAndStartPoint = scan->termListAndStartPoint;
- req->attributeSet = scan->attributeSet;
-
- *req->numberOfTermsRequested =
- ZOOM_options_get_int(scan->options, "number", 10);
-
- req->preferredPositionInResponse =
- odr_intdup (c->odr_out,
- ZOOM_options_get_int(scan->options, "position", 1));
-
- req->stepSize =
- odr_intdup (c->odr_out,
- ZOOM_options_get_int(scan->options, "stepSize", 0));
-
- req->databaseNames = set_DatabaseNames (c, scan->options,
- &req->num_databaseNames);
-
- return send_APDU (c, apdu);
-}
-
-ZOOM_API(size_t)
-ZOOM_scanset_size (ZOOM_scanset scan)
-{
- if (!scan || !scan->scan_response || !scan->scan_response->entries)
- return 0;
- return scan->scan_response->entries->num_entries;
-}
-
-ZOOM_API(const char *)
-ZOOM_scanset_term (ZOOM_scanset scan, size_t pos,
- int *occ, int *len)
-{
- const char *term = 0;
- size_t noent = ZOOM_scanset_size (scan);
- Z_ScanResponse *res = scan->scan_response;
-
- *len = 0;
- *occ = 0;
- if (pos >= noent)
- return 0;
- if (res->entries->entries[pos]->which == Z_Entry_termInfo)
- {
- Z_TermInfo *t = res->entries->entries[pos]->u.termInfo;
-
- if (t->term->which == Z_Term_general)
- {
- term = (const char *) t->term->u.general->buf;
- *len = t->term->u.general->len;
- }
- *occ = t->globalOccurrences ? *t->globalOccurrences : 0;
- }
- return term;
-}
-
-ZOOM_API(const char *)
-ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key)
-{
- return ZOOM_options_get (scan->options, key);
-}
-
-ZOOM_API(void)
-ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
- const char *val)
-{
- ZOOM_options_set (scan->options, key, val);
-}
-
-static Z_APDU *create_es_package (ZOOM_package p, int type)
-{
- const char *str;
- Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest);
- Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
-
- *req->function = Z_ExtendedServicesRequest_create;
-
- str = ZOOM_options_get(p->options, "package-name");
- if (str && *str)
- req->packageName = nmem_strdup (p->odr_out->mem, str);
-
- str = ZOOM_options_get(p->options, "user-id");
- if (str)
- req->userId = nmem_strdup (p->odr_out->mem, str);
-
- req->packageType = yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- type);
-
- str = ZOOM_options_get(p->options, "function");
- if (str)
- {
- if (!strcmp (str, "create"))
- *req->function = 1;
- if (!strcmp (str, "delete"))
- *req->function = 2;
- if (!strcmp (str, "modify"))
- *req->function = 3;
- }
- return apdu;
-}
-
-static const char *ill_array_lookup (void *clientData, const char *idx)
-{
- ZOOM_package p = (ZOOM_package) clientData;
- return ZOOM_options_get (p->options, idx+4);
-}
-
-static Z_External *encode_ill_request (ZOOM_package p)
-{
- ODR out = p->odr_out;
- ILL_Request *req;
- Z_External *r = 0;
- struct ill_get_ctl ctl;
-
- ctl.odr = p->odr_out;
- ctl.clientData = p;
- ctl.f = ill_array_lookup;
-
- req = ill_get_ILLRequest(&ctl, "ill", 0);
-
- if (!ill_Request (out, &req, 0, 0))
- {
- int ill_request_size;
- char *ill_request_buf = odr_getbuf (out, &ill_request_size, 0);
- if (ill_request_buf)
- odr_setbuf (out, ill_request_buf, ill_request_size, 1);
- return 0;
- }
- else
- {
- oident oid;
- int illRequest_size = 0;
- char *illRequest_buf = odr_getbuf (out, &illRequest_size, 0);
-
- oid.proto = PROTO_GENERAL;
- oid.oclass = CLASS_GENERAL;
- oid.value = VAL_ISO_ILL_1;
-
- r = (Z_External *) odr_malloc (out, sizeof(*r));
- r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid));
- r->indirect_reference = 0;
- r->descriptor = 0;
- r->which = Z_External_single;
-
- r->u.single_ASN1_type = (Odr_oct *)
- odr_malloc (out, sizeof(*r->u.single_ASN1_type));
- r->u.single_ASN1_type->buf = (unsigned char*)
- odr_malloc (out, illRequest_size);
- r->u.single_ASN1_type->len = illRequest_size;
- r->u.single_ASN1_type->size = illRequest_size;
- memcpy (r->u.single_ASN1_type->buf, illRequest_buf, illRequest_size);
- }
- return r;
-}
-
-static Z_ItemOrder *encode_item_order(ZOOM_package p)
-{
- Z_ItemOrder *req = (Z_ItemOrder *) odr_malloc (p->odr_out, sizeof(*req));
- const char *str;
-
- req->which=Z_IOItemOrder_esRequest;
- req->u.esRequest = (Z_IORequest *)
- odr_malloc(p->odr_out,sizeof(Z_IORequest));
-
- /* to keep part ... */
- req->u.esRequest->toKeep = (Z_IOOriginPartToKeep *)
- odr_malloc(p->odr_out,sizeof(Z_IOOriginPartToKeep));
- req->u.esRequest->toKeep->supplDescription = 0;
- req->u.esRequest->toKeep->contact = (Z_IOContact *)
- odr_malloc (p->odr_out, sizeof(*req->u.esRequest->toKeep->contact));
-
- str = ZOOM_options_get(p->options, "contact-name");
- req->u.esRequest->toKeep->contact->name = str ?
- nmem_strdup (p->odr_out->mem, str) : 0;
-
- str = ZOOM_options_get(p->options, "contact-phone");
- req->u.esRequest->toKeep->contact->phone = str ?
- nmem_strdup (p->odr_out->mem, str) : 0;
-
- str = ZOOM_options_get(p->options, "contact-email");
- req->u.esRequest->toKeep->contact->email = str ?
- nmem_strdup (p->odr_out->mem, str) : 0;
-
- req->u.esRequest->toKeep->addlBilling = 0;
-
- /* not to keep part ... */
- req->u.esRequest->notToKeep = (Z_IOOriginPartNotToKeep *)
- odr_malloc(p->odr_out,sizeof(Z_IOOriginPartNotToKeep));
-
- str = ZOOM_options_get(p->options, "itemorder-setname");
- if (!str)
- str = "default";
-
- if (!*str)
- req->u.esRequest->notToKeep->resultSetItem = 0;
- else
- {
- req->u.esRequest->notToKeep->resultSetItem = (Z_IOResultSetItem *)
- odr_malloc(p->odr_out, sizeof(Z_IOResultSetItem));
-
- req->u.esRequest->notToKeep->resultSetItem->resultSetId =
- nmem_strdup (p->odr_out->mem, str);
- req->u.esRequest->notToKeep->resultSetItem->item =
- (int *) odr_malloc(p->odr_out, sizeof(int));
-
- str = ZOOM_options_get(p->options, "itemorder-item");
- *req->u.esRequest->notToKeep->resultSetItem->item =
- (str ? atoi(str) : 1);
- }
- req->u.esRequest->notToKeep->itemRequest = encode_ill_request(p);
-
- return req;
-}
-
-ZOOM_API(void)
- ZOOM_package_send (ZOOM_package p, const char *type)
-{
- Z_APDU *apdu = 0;
- ZOOM_connection c;
- if (!p)
- return;
- c = p->connection;
- odr_reset (p->odr_out);
- xfree (p->buf_out);
- p->buf_out = 0;
- if (!strcmp(type, "itemorder"))
- {
- Z_External *r;
- apdu = create_es_package (p, VAL_ITEMORDER);
- if (apdu)
- {
- r = (Z_External *) odr_malloc (p->odr_out, sizeof(*r));
-
- r->direct_reference =
- yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- VAL_ITEMORDER);
- r->descriptor = 0;
- r->which = Z_External_itemOrder;
- r->indirect_reference = 0;
- r->u.itemOrder = encode_item_order (p);
-
- apdu->u.extendedServicesRequest->taskSpecificParameters = r;
- }
- }
- if (apdu)
- {
- if (encode_APDU(p->connection, apdu, p->odr_out) == 0)
- {
- char *buf;
-
- ZOOM_task task = ZOOM_connection_add_task (c, ZOOM_TASK_PACKAGE);
- task->u.package = p;
- buf = odr_getbuf(p->odr_out, &p->len_out, 0);
- p->buf_out = (char *) xmalloc (p->len_out);
- memcpy (p->buf_out, buf, p->len_out);
-
- (p->refcount)++;
- if (!c->async)
- {
- while (ZOOM_event (1, &c))
- ;
- }
- }
- }
-}
-
-ZOOM_API(ZOOM_package)
- ZOOM_connection_package (ZOOM_connection c, ZOOM_options options)
-{
- ZOOM_package p = (ZOOM_package) xmalloc (sizeof(*p));
-
- p->connection = c;
- p->odr_out = odr_createmem (ODR_ENCODE);
- p->options = ZOOM_options_create_with_parent2 (options, c->options);
- p->refcount = 1;
- p->buf_out = 0;
- p->len_out = 0;
- return p;
-}
-
-ZOOM_API(void)
- ZOOM_package_destroy(ZOOM_package p)
-{
- if (!p)
- return;
- (p->refcount)--;
- if (p->refcount == 0)
- {
- odr_destroy (p->odr_out);
- xfree (p->buf_out);
-
- ZOOM_options_destroy (p->options);
- xfree (p);
- }
-}
-
-ZOOM_API(const char *)
-ZOOM_package_option_get (ZOOM_package p, const char *key)
-{
- return ZOOM_options_get (p->options, key);
-}
-
-
-ZOOM_API(void)
-ZOOM_package_option_set (ZOOM_package p, const char *key,
- const char *val)
-{
- ZOOM_options_set (p->options, key, val);
-}
-
-static int ZOOM_connection_exec_task (ZOOM_connection c)
-{
- ZOOM_task task = c->tasks;
- zoom_ret ret = zoom_complete;
-
- if (!task)
- {
- yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task task=<null>");
- return 0;
- }
- yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task type=%d run=%d",
- task->which, task->running);
- if (c->error != ZOOM_ERROR_NONE)
- {
- yaz_log (LOG_DEBUG, "remove tasks because of error = %d", c->error);
- ZOOM_connection_remove_tasks (c);
- return 0;
- }
- if (task->running)
- {
- yaz_log (LOG_DEBUG, "task already running");
- return 0;
- }
- task->running = 1;
- ret = zoom_complete;
- if (c->cs || task->which == ZOOM_TASK_CONNECT)
- {
- switch (task->which)
- {
- case ZOOM_TASK_SEARCH:
- if (c->proto == PROTO_HTTP)
- ret = ZOOM_connection_srw_send_search(c);
- else
- ret = ZOOM_connection_send_search(c);
- break;
- case ZOOM_TASK_RETRIEVE:
- if (c->proto == PROTO_HTTP)
- ret = ZOOM_connection_srw_send_search(c);
- else
- ret = send_present (c);
- break;
- case ZOOM_TASK_CONNECT:
- ret = do_connect(c);
- break;
- case ZOOM_TASK_SCAN:
- ret = send_scan(c);
- break;
- case ZOOM_TASK_PACKAGE:
- ret = send_package(c);
- break;
- }
- }
- else
- {
- yaz_log (LOG_DEBUG, "remove tasks because no connection exist");
- ZOOM_connection_remove_tasks (c);
- }
- if (ret == zoom_complete)
- {
- yaz_log (LOG_DEBUG, "task removed (complete)");
- ZOOM_connection_remove_task (c);
- return 0;
- }
- yaz_log (LOG_DEBUG, "task pending");
- return 1;
-}
-
-static zoom_ret send_sort_present (ZOOM_connection c)
-{
- zoom_ret r = send_sort (c);
- if (r == zoom_complete)
- r = send_present (c);
- return r;
-}
-
-static int es_response (ZOOM_connection c,
- Z_ExtendedServicesResponse *res)
-{
- if (!c->tasks || c->tasks->which != ZOOM_TASK_PACKAGE)
- return 0;
- if (res->diagnostics && res->num_diagnostics > 0)
- response_diag(c, res->diagnostics[0]);
- if (res->taskPackage &&
- res->taskPackage->which == Z_External_extendedService)
- {
- Z_TaskPackage *taskPackage = res->taskPackage->u.extendedService;
- Odr_oct *id = taskPackage->targetReference;
-
- if (id)
- ZOOM_options_setl (c->tasks->u.package->options,
- "targetReference", (char*) id->buf, id->len);
- }
- return 1;
-}
-
-
-static void handle_apdu (ZOOM_connection c, Z_APDU *apdu)
-{
- Z_InitResponse *initrs;
-
- c->mask = 0;
- yaz_log (LOG_DEBUG, "recv APDU type=%d", apdu->which);
- switch(apdu->which)
- {
- case Z_APDU_initResponse:
- initrs = apdu->u.initResponse;
- ZOOM_connection_option_set(c, "targetImplementationId",
- initrs->implementationId ?
- initrs->implementationId : "");
- ZOOM_connection_option_set(c, "targetImplementationName",
- initrs->implementationName ?
- initrs->implementationName : "");
- ZOOM_connection_option_set(c, "targetImplementationVersion",
- initrs->implementationVersion ?
- initrs->implementationVersion : "");
- if (!*initrs->result)
- {
- set_ZOOM_error(c, ZOOM_ERROR_INIT, 0);
- }
- else
- {
- char *cookie =
- yaz_oi_get_string_oidval (&apdu->u.initResponse->otherInfo,
- VAL_COOKIE, 1, 0);
- xfree (c->cookie_in);
- c->cookie_in = 0;
- if (cookie)
- c->cookie_in = xstrdup(cookie);
- if (ODR_MASK_GET(initrs->options, Z_Options_namedResultSets) &&
- ODR_MASK_GET(initrs->protocolVersion, Z_ProtocolVersion_3))
- c->support_named_resultsets = 1;
- if (c->tasks)
- {
- assert (c->tasks->which == ZOOM_TASK_CONNECT);
- ZOOM_connection_remove_task (c);
- }
- ZOOM_connection_exec_task (c);
- }
- if (ODR_MASK_GET(initrs->options, Z_Options_negotiationModel))
- {
- NMEM tmpmem = nmem_create();
- Z_CharSetandLanguageNegotiation *p =
- yaz_get_charneg_record(initrs->otherInfo);
-
- if (p)
- {
- char *charset=NULL, *lang=NULL;
- int sel;
-
- yaz_get_response_charneg(tmpmem, p, &charset, &lang, &sel);
- yaz_log(LOG_DEBUG, "Target accepted: charset %s, "
- "language %s, select %d",
- charset ? charset : "none", lang ? lang : "none", sel);
- if (charset)
- ZOOM_connection_option_set (c, "negotiation-charset",
- charset);
- if (lang)
- ZOOM_connection_option_set (c, "negotiation-lang",
- lang);
- nmem_destroy(tmpmem);
- }
- }
- break;
- case Z_APDU_searchResponse:
- handle_search_response (c, apdu->u.searchResponse);
- if (send_sort_present (c) == zoom_complete)
- ZOOM_connection_remove_task (c);
- break;
- case Z_APDU_presentResponse:
- handle_present_response (c, apdu->u.presentResponse);
- if (send_present (c) == zoom_complete)
- ZOOM_connection_remove_task (c);
- break;
- case Z_APDU_sortResponse:
- sort_response (c, apdu->u.sortResponse);
- if (send_present (c) == zoom_complete)
- ZOOM_connection_remove_task (c);
- break;
- case Z_APDU_scanResponse:
- scan_response (c, apdu->u.scanResponse);
- ZOOM_connection_remove_task (c);
- break;
- case Z_APDU_extendedServicesResponse:
- es_response (c, apdu->u.extendedServicesResponse);
- ZOOM_connection_remove_task (c);
- break;
- case Z_APDU_close:
- if (c->reconnect_ok)
- {
- do_close(c);
- c->tasks->running = 0;
- ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
- }
- else
- {
- set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
- do_close(c);
- }
- break;
- default:
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- do_close(c);
- }
-}
-
-#if HAVE_XML2
-static void handle_srw_response(ZOOM_connection c,
- Z_SRW_searchRetrieveResponse *res)
-{
- ZOOM_resultset resultset = 0;
- int i;
- NMEM nmem;
- ZOOM_Event event;
-
- if (!c->tasks)
- return;
-
- if (c->tasks->which == ZOOM_TASK_SEARCH)
- resultset = c->tasks->u.search.resultset;
- else if (c->tasks->which == ZOOM_TASK_RETRIEVE)
- resultset = c->tasks->u.retrieve.resultset;
- else
- return ;
-
- event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH);
- ZOOM_connection_put_event(c, event);
-
- resultset->size = 0;
-
- yaz_log(LOG_DEBUG, "got SRW response OK");
-
- if (res->numberOfRecords)
- resultset->size = *res->numberOfRecords;
-
- for (i = 0; i<res->num_records; i++)
- {
- int pos;
-
- Z_NamePlusRecord *npr = (Z_NamePlusRecord *)
- odr_malloc(c->odr_in, sizeof(Z_NamePlusRecord));
-
- if (res->records[i].recordPosition &&
- *res->records[i].recordPosition > 0)
- pos = *res->records[i].recordPosition - 1;
- else
- pos = resultset->start + i;
-
- npr->databaseName = 0;
- npr->which = Z_NamePlusRecord_databaseRecord;
- npr->u.databaseRecord = (Z_External *)
- odr_malloc(c->odr_in, sizeof(Z_External));
- npr->u.databaseRecord->descriptor = 0;
- npr->u.databaseRecord->direct_reference =
- yaz_oidval_to_z3950oid(c->odr_in, CLASS_RECSYN, VAL_TEXT_XML);
- npr->u.databaseRecord->which = Z_External_octet;
- npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
- odr_malloc(c->odr_in, sizeof(Odr_oct));
- npr->u.databaseRecord->u.octet_aligned->buf =
- res->records[i].recordData_buf;
- npr->u.databaseRecord->u.octet_aligned->len =
- npr->u.databaseRecord->u.octet_aligned->size =
- res->records[i].recordData_len;
- record_cache_add (resultset, npr, pos);
- }
- if (res->num_diagnostics > 0)
- {
- set_dset_error(c, *res->diagnostics[0].code, "SRW",
- res->diagnostics[0].details, 0);
- }
- nmem = odr_extract_mem(c->odr_in);
- nmem_transfer(resultset->odr->mem, nmem);
- nmem_destroy(nmem);
-}
-#endif
-
-#if HAVE_XML2
-static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
-{
- int ret = -1;
- const char *content_type = z_HTTP_header_lookup(hres->headers,
- "Content-Type");
- const char *connection_head = z_HTTP_header_lookup(hres->headers,
- "Connection");
- c->mask = 0;
- yaz_log (LOG_DEBUG, "handle_http");
-
- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
- {
- Z_SOAP *soap_package = 0;
- ODR o = odr_createmem(ODR_DECODE);
- Z_SOAP_Handler soap_handlers[2] = {
- {"http://www.loc.gov/zing/srw/v1.0/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
- ret = z_soap_codec(o, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers);
- if (!ret && soap_package->which == Z_SOAP_generic &&
- soap_package->u.generic->no == 0)
- {
- Z_SRW_PDU *sr = soap_package->u.generic->p;
- if (sr->which == Z_SRW_searchRetrieve_response)
- handle_srw_response(c, sr->u.response);
- else
- ret = -1;
- }
- else if (!ret && (soap_package->which == Z_SOAP_fault
- || soap_package->which == Z_SOAP_error))
- {
- set_HTTP_error(c, hres->code,
- soap_package->u.fault->fault_code,
- soap_package->u.fault->fault_string);
- }
- else
- ret = -1;
- odr_destroy(o);
- }
- if (ret)
- {
- if (hres->code != 200)
- set_HTTP_error(c, hres->code, 0, 0);
- else
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- do_close (c);
- }
- ZOOM_connection_remove_task(c);
- if (!strcmp(hres->version, "1.0"))
- {
- /* HTTP 1.0: only if Keep-Alive we stay alive.. */
- if (!connection_head || strcmp(connection_head, "Keep-Alive"))
- do_close(c);
- }
- else
- {
- /* HTTP 1.1: only if no close we stay alive .. */
- if (connection_head && !strcmp(connection_head, "close"))
- do_close(c);
- }
-}
-#endif
-
-static int do_read (ZOOM_connection c)
-{
- int r, more;
- ZOOM_Event event;
-
- event = ZOOM_Event_create (ZOOM_EVENT_RECV_DATA);
- ZOOM_connection_put_event (c, event);
-
-
- r = cs_get (c->cs, &c->buf_in, &c->len_in);
- more = cs_more(c->cs);
- yaz_log (LOG_DEBUG, "do_read len=%d more=%d", r, more);
- if (r == 1)
- return 0;
- if (r <= 0)
- {
- if (c->reconnect_ok)
- {
- do_close (c);
- c->reconnect_ok = 0;
- yaz_log (LOG_DEBUG, "reconnect read");
- c->tasks->running = 0;
- ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
- }
- else
- {
- set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
- do_close (c);
- }
- }
- else
- {
- Z_GDU *gdu;
- ZOOM_Event event;
-
- odr_reset (c->odr_in);
- odr_setbuf (c->odr_in, c->buf_in, r, 0);
- event = ZOOM_Event_create (ZOOM_EVENT_RECV_APDU);
- ZOOM_connection_put_event (c, event);
-
- if (!z_GDU (c->odr_in, &gdu, 0, 0))
- {
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- do_close (c);
- }
- else if (gdu->which == Z_GDU_Z3950)
- handle_apdu (c, gdu->u.z3950);
- else if (gdu->which == Z_GDU_HTTP_Response)
- {
-#if HAVE_XML2
- handle_http (c, gdu->u.HTTP_Response);
-#else
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
- do_close (c);
-#endif
- }
- c->reconnect_ok = 0;
- }
- return 1;
-}
-
-static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out)
-{
- int r;
- ZOOM_Event event;
-
- event = ZOOM_Event_create(ZOOM_EVENT_SEND_DATA);
- ZOOM_connection_put_event (c, event);
-
- yaz_log (LOG_DEBUG, "do_write_ex len=%d", len_out);
- if ((r=cs_put (c->cs, buf_out, len_out)) < 0)
- {
- if (c->reconnect_ok)
- {
- do_close (c);
- c->reconnect_ok = 0;
- yaz_log (LOG_DEBUG, "reconnect write");
- c->tasks->running = 0;
- ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
- return zoom_pending;
- }
- if (c->state == STATE_CONNECTING)
- set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
- else
- set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, 0);
- do_close (c);
- return zoom_complete;
- }
- else if (r == 1)
- {
- c->mask = ZOOM_SELECT_EXCEPT;
- if (c->cs->io_pending & CS_WANT_WRITE)
- c->mask += ZOOM_SELECT_WRITE;
- if (c->cs->io_pending & CS_WANT_READ)
- c->mask += ZOOM_SELECT_READ;
- yaz_log (LOG_DEBUG, "do_write_ex 1 mask=%d", c->mask);
- }
- else
- {
- c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT;
- yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask);
- }
- return zoom_pending;
-}
-
-static zoom_ret do_write(ZOOM_connection c)
-{
- return do_write_ex (c, c->buf_out, c->len_out);
-}
-
-
-ZOOM_API(const char *)
-ZOOM_connection_option_get (ZOOM_connection c, const char *key)
-{
- return ZOOM_options_get (c->options, key);
-}
-
-ZOOM_API(void)
-ZOOM_connection_option_set (ZOOM_connection c, const char *key,
- const char *val)
-{
- ZOOM_options_set (c->options, key, val);
-}
-
-ZOOM_API(const char *)
-ZOOM_resultset_option_get (ZOOM_resultset r, const char *key)
-{
- return ZOOM_options_get (r->options, key);
-}
-
-ZOOM_API(void)
-ZOOM_resultset_option_set (ZOOM_resultset r, const char *key,
- const char *val)
-{
- ZOOM_options_set (r->options, key, val);
-}
-
-
-ZOOM_API(int)
-ZOOM_connection_errcode (ZOOM_connection c)
-{
- return ZOOM_connection_error (c, 0, 0);
-}
-
-ZOOM_API(const char *)
-ZOOM_connection_errmsg (ZOOM_connection c)
-{
- const char *msg;
- ZOOM_connection_error (c, &msg, 0);
- return msg;
-}
-
-ZOOM_API(const char *)
-ZOOM_connection_addinfo (ZOOM_connection c)
-{
- const char *addinfo;
- ZOOM_connection_error (c, 0, &addinfo);
- return addinfo;
-}
-
-ZOOM_API(const char *)
-ZOOM_diag_str (int error)
-{
- switch (error)
- {
- case ZOOM_ERROR_NONE:
- return "No error";
- case ZOOM_ERROR_CONNECT:
- return "Connect failed";
- case ZOOM_ERROR_MEMORY:
- return "Out of memory";
- case ZOOM_ERROR_ENCODE:
- return "Encoding failed";
- case ZOOM_ERROR_DECODE:
- return "Decoding failed";
- case ZOOM_ERROR_CONNECTION_LOST:
- return "Connection lost";
- case ZOOM_ERROR_INIT:
- return "Init rejected";
- case ZOOM_ERROR_INTERNAL:
- return "Internal failure";
- case ZOOM_ERROR_TIMEOUT:
- return "Timeout";
- case ZOOM_ERROR_UNSUPPORTED_PROTOCOL:
- return "Unsupported protocol";
- case ZOOM_ERROR_UNSUPPORTED_QUERY:
- return "Unsupported query type";
- default:
- return diagbib1_str (error);
- }
-}
-
-ZOOM_API(int)
-ZOOM_connection_error_x (ZOOM_connection c, const char **cp,
- const char **addinfo, const char **diagset)
-{
- int error = c->error;
- if (cp)
- {
- if (!c->diagset || !strcmp(c->diagset, "ZOOM"))
- *cp = ZOOM_diag_str(error);
- else if (!strcmp(c->diagset, "HTTP"))
- *cp = z_HTTP_errmsg(c->error);
- else if (!strcmp(c->diagset, "Bib-1"))
- *cp = ZOOM_diag_str(error);
- else if (!strcmp(c->diagset, "SRW"))
- *cp = yaz_diag_srw_str(c->error);
- else
- *cp = "Unknown error and diagnostic set";
- }
- if (addinfo)
- *addinfo = c->addinfo ? c->addinfo : "";
- if (diagset)
- *diagset = c->diagset ? c->diagset : "";
- return c->error;
-}
-
-ZOOM_API(int)
-ZOOM_connection_error (ZOOM_connection c, const char **cp,
- const char **addinfo)
-{
- return ZOOM_connection_error_x(c, cp, addinfo, 0);
-}
-
-static int ZOOM_connection_do_io(ZOOM_connection c, int mask)
-{
- ZOOM_Event event = 0;
- int r = cs_look(c->cs);
- yaz_log (LOG_DEBUG, "ZOOM_connection_do_io c=%p mask=%d cs_look=%d",
- c, mask, r);
-
- if (r == CS_NONE)
- {
- event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
- set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
- do_close (c);
- ZOOM_connection_put_event (c, event);
- }
- else if (r == CS_CONNECT)
- {
- int ret;
- event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
-
- ret = cs_rcvconnect (c->cs);
- yaz_log (LOG_DEBUG, "cs_rcvconnect returned %d", ret);
- if (ret == 1)
- {
- c->mask = ZOOM_SELECT_EXCEPT;
- if (c->cs->io_pending & CS_WANT_WRITE)
- c->mask += ZOOM_SELECT_WRITE;
- if (c->cs->io_pending & CS_WANT_READ)
- c->mask += ZOOM_SELECT_READ;
- ZOOM_connection_put_event (c, event);
- }
- else if (ret == 0)
- {
- ZOOM_connection_put_event (c, event);
- if (c->proto == PROTO_Z3950)
- ZOOM_connection_send_init(c);
- else
- {
- /* no init request for SRW .. */
- assert (c->tasks->which == ZOOM_TASK_CONNECT);
- ZOOM_connection_remove_task (c);
- c->mask = 0;
- ZOOM_connection_exec_task (c);
- }
- c->state = STATE_ESTABLISHED;
- }
- else
- {
- set_ZOOM_error(c, ZOOM_ERROR_CONNECT, 0);
- do_close (c);
- ZOOM_connection_put_event (c, event);
- }
- }
- else
- {
- if (mask & ZOOM_SELECT_READ)
- do_read (c);
- if (c->cs && (mask & ZOOM_SELECT_WRITE))
- do_write (c);
- }
- return 1;
-}
-
-ZOOM_API(int)
-ZOOM_connection_last_event(ZOOM_connection cs)
-{
- if (!cs)
- return ZOOM_EVENT_NONE;
- return cs->last_event;
-}
-
-ZOOM_API(int)
-ZOOM_event (int no, ZOOM_connection *cs)
-{
- int timeout = 5000;
-#if HAVE_SYS_POLL_H
- struct pollfd pollfds[1024];
- ZOOM_connection poll_cs[1024];
-#else
- struct timeval tv;
- fd_set input, output, except;
-#endif
- int i, r, nfds;
- int max_fd = 0;
-
- for (i = 0; i<no; i++)
- {
- ZOOM_connection c = cs[i];
- ZOOM_Event event;
- if (c && (event = ZOOM_connection_get_event(c)))
- {
- ZOOM_Event_destroy (event);
- return i+1;
- }
- }
- for (i = 0; i<no; i++)
- {
- ZOOM_connection c = cs[i];
- ZOOM_Event event;
- if (c && ZOOM_connection_exec_task (c))
- {
- if ((event = ZOOM_connection_get_event(c)))
- {
- ZOOM_Event_destroy (event);
- return i+1;
- }
- }
- }
-#if HAVE_SYS_POLL_H
-
-#else
- FD_ZERO (&input);
- FD_ZERO (&output);
- FD_ZERO (&except);
-#endif
- nfds = 0;
- for (i = 0; i<no; i++)
- {
- ZOOM_connection c = cs[i];
- int fd, mask;
- int this_timeout;
-
- if (!c)
- continue;
- fd = z3950_connection_socket(c);
- mask = z3950_connection_mask(c);
-
- if (fd == -1)
- continue;
- if (max_fd < fd)
- max_fd = fd;
-
- this_timeout = ZOOM_options_get_int (c->options, "timeout", -1);
- if (this_timeout != -1 && this_timeout < timeout)
- timeout = this_timeout;
-#if HAVE_SYS_POLL_H
- if (mask)
- {
- short poll_events = 0;
-
- if (mask & ZOOM_SELECT_READ)
- poll_events += POLLIN;
- if (mask & ZOOM_SELECT_WRITE)
- poll_events += POLLOUT;
- if (mask & ZOOM_SELECT_EXCEPT)
- poll_events += POLLERR;
- pollfds[nfds].fd = fd;
- pollfds[nfds].events = poll_events;
- pollfds[nfds].revents = 0;
- poll_cs[nfds] = c;
- nfds++;
- }
-#else
- if (mask & ZOOM_SELECT_READ)
- {
- FD_SET (fd, &input);
- nfds++;
- }
- if (mask & ZOOM_SELECT_WRITE)
- {
- FD_SET (fd, &output);
- nfds++;
- }
- if (mask & ZOOM_SELECT_EXCEPT)
- {
- FD_SET (fd, &except);
- nfds++;
- }
-#endif
- }
- if (timeout >= 5000)
- timeout = 30;
-
- if (!nfds)
- return 0;
-
-#if HAVE_SYS_POLL_H
- r = poll (pollfds, nfds, timeout * 1000);
- for (i = 0; i<nfds; i++)
- {
- ZOOM_connection c = poll_cs[i];
- if (r && c->mask)
- {
- int mask = 0;
- if (pollfds[i].revents & POLLIN)
- mask += ZOOM_SELECT_READ;
- if (pollfds[i].revents & POLLOUT)
- mask += ZOOM_SELECT_WRITE;
- if (pollfds[i].revents & POLLERR)
- mask += ZOOM_SELECT_EXCEPT;
- if (mask)
- ZOOM_connection_do_io(c, mask);
- }
- else if (r == 0 && c->mask)
- {
- ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT);
- /* timeout and this connection was waiting */
- set_ZOOM_error(c, ZOOM_ERROR_TIMEOUT, 0);
- do_close (c);
- ZOOM_connection_put_event(c, event);
- }
- }
-#else
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
- yaz_log (LOG_DEBUG, "select start");
- r = select (max_fd+1, &input, &output, &except, &tv);
- yaz_log (LOG_DEBUG, "select stop, returned r=%d", r);
- for (i = 0; i<no; i++)
- {
- ZOOM_connection c = cs[i];
- int fd, mask;
-
- if (!c)
- continue;
- fd = z3950_connection_socket(c);
- mask = 0;
- if (r && c->mask)
- {
- /* no timeout and real socket */
- if (FD_ISSET(fd, &input))
- mask += ZOOM_SELECT_READ;
- if (FD_ISSET(fd, &output))
- mask += ZOOM_SELECT_WRITE;
- if (FD_ISSET(fd, &except))
- mask += ZOOM_SELECT_EXCEPT;
- if (mask)
- ZOOM_connection_do_io(c, mask);
- }
- if (r == 0 && c->mask)
- {
- ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT);
- /* timeout and this connection was waiting */
- set_ZOOM_error(c, ZOOM_ERROR_TIMEOUT, 0);
- do_close (c);
- yaz_log (LOG_DEBUG, "timeout");
- ZOOM_connection_put_event(c, event);
- }
- }
-#endif
- for (i = 0; i<no; i++)
- {
- ZOOM_connection c = cs[i];
- ZOOM_Event event;
- if (c && (event = ZOOM_connection_get_event(c)))
- {
- ZOOM_Event_destroy (event);
- return i+1;
- }
- }
- return 0;
-}
+++ /dev/null
-/*
- * $Id: zoom-opt.c,v 1.3 2003-01-06 08:20:29 adam Exp $
- *
- * ZOOM layer for C, options handling
- */
-#include <assert.h>
-#include "zoom-p.h"
-
-#include <yaz/xmalloc.h>
-
-ZOOM_API(ZOOM_options)
-ZOOM_options_create_with_parent (ZOOM_options parent)
-{
- return ZOOM_options_create_with_parent2(parent, 0);
-}
-
-ZOOM_API(ZOOM_options)
-ZOOM_options_create (void)
-{
- return ZOOM_options_create_with_parent (0);
-}
-
-
-ZOOM_API(ZOOM_options)
-ZOOM_options_create_with_parent2 (ZOOM_options parent1, ZOOM_options parent2)
-{
- ZOOM_options opt = (ZOOM_options) xmalloc (sizeof(*opt));
-
- opt->refcount = 1;
- opt->callback_func = 0;
- opt->callback_handle = 0;
- opt->entries = 0;
- opt->parent1= parent1;
- if (parent1)
- (parent1->refcount)++;
- opt->parent2= parent2;
- if (parent2)
- (parent2->refcount)++;
- return opt;
-}
-
-
-void ZOOM_options_addref (ZOOM_options opt)
-{
- (opt->refcount)++;
-}
-
-ZOOM_API(ZOOM_options_callback)
-ZOOM_options_set_callback (
- ZOOM_options opt,
- ZOOM_options_callback callback_func,
- void *callback_handle)
-{
- ZOOM_options_callback callback_old;
-
- assert (opt);
- callback_old = opt->callback_func;
- opt->callback_func = callback_func;
- opt->callback_handle = callback_handle;
- return callback_old;
-}
-
-ZOOM_API(void)
-ZOOM_options_destroy (ZOOM_options opt)
-{
- if (!opt)
- return;
- (opt->refcount)--;
- if (opt->refcount == 0)
- {
- struct ZOOM_options_entry *e;
-
- ZOOM_options_destroy (opt->parent1);
- ZOOM_options_destroy (opt->parent2);
- e = opt->entries;
- while (e)
- {
- struct ZOOM_options_entry *e0 = e;
- xfree (e->name);
- xfree (e->value);
- e = e->next;
- xfree (e0);
- }
- xfree (opt);
- }
-}
-
-ZOOM_API(void)
-ZOOM_options_setl (ZOOM_options opt, const char *name, const char *value,
- int len)
-{
- struct ZOOM_options_entry **e;
-
- e = &opt->entries;
- while (*e)
- {
- if (!strcmp((*e)->name, name))
- {
- xfree ((*e)->value);
- (*e)->value = 0;
- if (value)
- {
- (*e)->value = (char *) xmalloc (len+1);
- memcpy ((*e)->value, value, len);
- (*e)->value[len] = '\0';
- }
- return;
- }
- e = &(*e)->next;
- }
- *e = (struct ZOOM_options_entry *) xmalloc (sizeof(**e));
- (*e)->name = xstrdup (name);
- (*e)->value = 0;
- if (value)
- {
- (*e)->value = (char *) xmalloc (len+1);
- memcpy ((*e)->value, value, len);
- (*e)->value[len] = '\0';
- }
- (*e)->next = 0;
-}
-
-ZOOM_API(void)
-ZOOM_options_set (ZOOM_options opt, const char *name, const char *value)
-{
- ZOOM_options_setl (opt, name, value, value ? strlen(value): 0);
-}
-
-ZOOM_API(const char *)
-ZOOM_options_get (ZOOM_options opt, const char *name)
-{
- const char *v = 0;
- if (!opt)
- return 0;
- if (opt->callback_func)
- v = (*opt->callback_func)(opt->callback_handle, name);
- if (!v)
- {
- struct ZOOM_options_entry *e;
- for (e = opt->entries; e; e = e->next)
- if (!strcmp(e->name, name))
- {
- v = e->value;
- break;
- }
- }
- if (!v)
- v = ZOOM_options_get(opt->parent1, name);
- if (!v)
- v = ZOOM_options_get(opt->parent2, name);
- return v;
-}
-
-ZOOM_API(int)
-ZOOM_options_get_bool (ZOOM_options opt, const char *name, int defa)
-{
- const char *v = ZOOM_options_get (opt, name);
-
- if (!v)
- return defa;
- if (!strcmp (v, "1") || !strcmp(v, "T"))
- return 1;
- return 0;
-}
-
-ZOOM_API(int)
-ZOOM_options_get_int (ZOOM_options opt, const char *name, int defa)
-{
- const char *v = ZOOM_options_get (opt, name);
-
- if (!v || !*v)
- return defa;
- return atoi(v);
-}
-
-ZOOM_API(void)
-ZOOM_options_set_int(ZOOM_options opt, const char *name, int value)
-{
- char s[40];
-
- sprintf (s, "%d", value);
- ZOOM_options_set (opt, name, s);
-}
+++ /dev/null
-/*
- * Private C header for ZOOM C.
- * $Id: zoom-p.h,v 1.10 2003-07-14 12:59:23 adam Exp $
- */
-
-#if HAVE_XSLT
-#include <yaz/srw.h>
-#endif
-
-#include <yaz/proto.h>
-#include <yaz/comstack.h>
-#include <yaz/wrbuf.h>
-#include <yaz/zoom.h>
-#include <yaz/sortspec.h>
-typedef struct ZOOM_Event_p *ZOOM_Event;
-
-struct ZOOM_query_p {
- Z_Query *z_query;
- Z_SortKeySpecList *sort_spec;
- int refcount;
- ODR odr;
- char *query_string;
-};
-
-#define STATE_IDLE 0
-#define STATE_CONNECTING 1
-#define STATE_ESTABLISHED 2
-
-#define ZOOM_SELECT_READ 1
-#define ZOOM_SELECT_WRITE 2
-#define ZOOM_SELECT_EXCEPT 4
-
-struct ZOOM_connection_p {
- enum oid_proto proto;
- COMSTACK cs;
- char *host_port;
- char *path;
- int error;
- char *addinfo;
- const char *diagset;
- int state;
- int mask;
- int reconnect_ok;
- ODR odr_in;
- ODR odr_out;
- char *buf_in;
- int len_in;
- char *buf_out;
- int len_out;
- char *proxy;
- char *charset;
- char *lang;
- char *cookie_out;
- char *cookie_in;
- char *client_IP;
- int async;
- int support_named_resultsets;
- int last_event;
- ZOOM_task tasks;
- ZOOM_options options;
- ZOOM_resultset resultsets;
- ZOOM_Event m_queue_front;
- ZOOM_Event m_queue_back;
-};
-
-struct ZOOM_options_entry {
- char *name;
- char *value;
- struct ZOOM_options_entry *next;
-};
-
-struct ZOOM_options_p {
- int refcount;
- void *callback_handle;
- ZOOM_options_callback callback_func;
- struct ZOOM_options_entry *entries;
- ZOOM_options parent1;
- ZOOM_options parent2;
-};
-
-typedef struct ZOOM_record_cache_p *ZOOM_record_cache;
-
-struct ZOOM_resultset_p {
- Z_SortKeySpecList *r_sort_spec;
- ZOOM_query query;
- int refcount;
- int size;
- int start;
- int count;
- int step;
- int piggyback;
- char *setname;
- char *schema;
- ODR odr;
- ZOOM_record_cache record_cache;
- ZOOM_options options;
- ZOOM_connection connection;
- ZOOM_resultset next;
-};
-
-struct ZOOM_record_p {
- ODR odr;
- WRBUF wrbuf_marc;
- WRBUF wrbuf_iconv;
- WRBUF wrbuf_opac;
- Z_NamePlusRecord *npr;
-};
-
-struct ZOOM_record_cache_p {
- struct ZOOM_record_p rec;
- char *elementSetName;
- char *syntax;
- char *schema;
- int pos;
- ZOOM_record_cache next;
-};
-
-struct ZOOM_scanset_p {
- int refcount;
- ODR odr;
- ZOOM_options options;
- ZOOM_connection connection;
- Z_AttributesPlusTerm *termListAndStartPoint;
- Z_AttributeSetId *attributeSet;
- Z_ScanResponse *scan_response;
-};
-
-struct ZOOM_package_p {
- int refcount;
- ODR odr_out;
- ZOOM_options options;
- ZOOM_connection connection;
- char *buf_out;
- int len_out;
-};
-
-struct ZOOM_task_p {
- int running;
- int which;
- union {
-#define ZOOM_TASK_SEARCH 1
- struct {
- ZOOM_resultset resultset;
- } search;
-#define ZOOM_TASK_RETRIEVE 2
- struct {
- int start;
- ZOOM_resultset resultset;
- int count;
- } retrieve;
-#define ZOOM_TASK_CONNECT 3
-#define ZOOM_TASK_SCAN 4
- struct {
- ZOOM_scanset scan;
- } scan;
-#define ZOOM_TASK_PACKAGE 5
- ZOOM_package package;
- } u;
- ZOOM_task next;
-};
-
-struct ZOOM_Event_p {
- int kind;
- ZOOM_Event next;
- ZOOM_Event prev;
-};
-
-void ZOOM_options_addref (ZOOM_options opt);